在上一篇文章中,我谈到了gpu架构的工作原理。这是一个比较新颖的架构,与其他架构的工作方式不太相同,我们称之为基于区块贴图的延迟渲染或tbdr。从概念而言,其基本前提非常简单。
首先,我们把屏幕分成小的区块,使之操作简单且大小适于完全放在gpu上,大量减少访问内存。这部分我先做阐释,不熟悉此部分的请先行了解。
第二部分需使用第一部分生成的信息——渲染贴图的原语列表——尽可能多地延迟随后生成的像素,所以渲染尽量不会放过每个细节之处。让我们先来看看硬件的工作。
tbdr上的数据报告:powervr rogue的延迟渲染
参数缓冲区
在我的上一篇文章中提到,硬件所需完成的最后一件事便是填满参数缓冲区(pb)。回顾一下,pb本质上是一个打包的区块贴图列表,填充了形成贴图的转换几何图,硬件同样可以对其进行有效的计算。记住,我们不必使用简单且效率低下的方法来计算究竟是哪个几何对象构成了贴图。实际上,我们可以准确地计算贴图,因而不必要浪费时间处理那些最终不会对贴图产生影响的原语。
因此,gpu建立了中间数据结构,并具有完整的三角形列表。接下来便是光栅化,,并把那些三角形变成像素,且在内核中对像素进行着色。对于我们的架构而言,光栅化尤为复杂:驱动gpu效率的关键事物投射在这部分管道中,接下来让我们逐步了解相关过程。
另外,一些读者可能会很惊讶地发现,光栅化并不仅仅发生在一个简单的称之为光栅格的单片上。在所有gpu中,无论大小,都是由许多子块组成的比较紧凑的面向数据流的管道在运行。使之在不成为影响吞吐量的瓶颈下保持平衡则非常困难,且由于任务的性质,固定功能逻辑比可编程着色器内核更加合适。
提取pb数据至内核中
首先,我们需要从内存中提取贴图列表至内核中,然后解析他们的状态、位置数据和一些控制位,使gpu可以恰当的运行几何对象。数据可以被压缩,所以区块负责读取数据,即我们所说的参数获取,其也能解压数据。由于区块存在内存访问,一些获取内存延迟的情况必须容许,所以可以从内存中预读取及突发读取数据,使pb中的数据可以再次进入内核中。目前为止,一切很顺利。
边缘方程
既然我们已经把三角形放置在内核中,接下来便是将它们变成像素。注意,我们是在3d而非2d空间处理几何对象,而您的屏幕是一个2d平面。所以我们需要采取某种方式,将渲染的3d计算视图映射到2d屏幕上。
接受来自参数提取物的原语的硬件字节,在栅格化像素的过程中负责设置定义三角形边界的三角方程,因此我们在屏幕上看到的不仅仅是点,还有三角形的呈现。由于涉及到一些计算,硬件字节在固定的设置下有其专用且实际上非常复杂的浮点单元。
接下来便是三角形的边界计算方程。三角形共享准确深度值时,深度偏置可以起作用。这样便不必纠结于哪个边界应该可视化,且一些角度的计算可以为进一步形成的区块提供有关几何图像构成的信息。
平面方程
有了一组边界方程,便可结合边界方程定义三角几何,犹如3d空间中的三棱镜。在头脑中想象图像可能有违直觉,因为您从未真正看过其3d效果。您需要一些想象的线条来构建可视化的图像。
其次,需要一个穿过棱镜的2d切片,这样当三角形的2d效果呈现在屏幕上时,可以基本拉平图像,并找出棱镜的字节。这是一个重要的里程碑。要实现上述过程,便需要一个四阶方程来定义通过棱镜的平面片,而棱镜则由边界方程定义。
在硬件中评估四阶方程,其给出的平面片可以映射到贴图的像素中。接下来对屏幕贴图做一些阐述以助于理解此部分内容。
贴图大小
任何贴图架构都要在贴图大小和存储空间之间进行一些权衡。在我们的案例中,我们需要一些用于参数缓冲区的存储空间来储存贴图的三角形列表。而这个存储空间位于系统内存中。其次,还需要gpu芯片内的存储空间,用于处理贴图中的像素。
因此对于这两个贴图理论上的尺寸,一个贴图是另一个的四倍 (两倍x轴和两倍y轴),且渲染分辨率是1080 p。显然,如果尺寸较小,则需要较多的贴图,这意味着参数缓冲区中需要有更多的贴图列表,但可与贴图交叉的三角形则更少,因此所需gpu存储也更小。反之亦然。我们只需较少的贴图列表,因为贴图不可能足够多,但每个贴图的三角形平均数量则可能会增多,且由于每个贴图是像素的4倍,因此需要4倍的gpu存储空间。
所以,在我们的架构中,贴图的尺寸趋于偏小。john和他的团队在计算最优尺寸时则考虑的更多,但尺寸等都是最大的考虑因素。目前,rogue上用于一般渲染的像素是32×32,但其比起过去在sgx上的渲染像素要更小,且架构也非方形矩阵。
多重采样
在一般渲染时,还需考虑一件事情:多重采样。这里不对msaa作全面介绍——以后发表的文章中将会详述——但它却可以提高图像质量,因为它比常规的渲染(通常为一个像素)所生成的像素样品更多,且使用这些额外的数据可以在样品中滤除图像中的高频信号。
因此如果为每个像素生成的数据更多,我们需要相应的存储空间。几个方式可以尝试。一个是在系统内存中存储额外的样品;另一个是使用gpu存储,这样在处理msaa时便不需要消耗非gpu带宽。
采用第二种方式时,在gpu中为多重采样数据分配一些存储,以提高效率及降低外部内存带宽。存储的形式不在本文讨论范围之内,但显然这应该着色器内核的一部分,这样usc便可以迅速对之访问。
实际栅格化
回到我们之前讨论的栅格化。每个区块贴图中的三角形都会生成一个边界方程,我们在合成图像处理器(isp)中对这些边界方程和平面方程进行共同评估。isp是gpu设计的核心,因为有了isp,延期渲染才得以进行。
评估方程后,对贴图中每个像素样品位置的三角形显示结果进行测试(或如果是多重采样,则对采样位置进行测试),看看哪些像素位于即将产生的三角形内。这时,我们才最终完成栅格化:通过评估边界方程且对贴图像素的结果进行测试后,使三角形形成2d图像,这样便知道其覆盖的屏幕区域。
消除隐藏面
消除隐藏面才意味着gpu开始真正地节约效率。贴图操作把屏幕分成很多适宜于gpu的小字节,这样,既可将数据储存在gpu上,又可以在运行数据时避免过多消耗且保证内存访问时功率充足。但我们还可以做到更极致。
在进行像素栅格化时,对其在深度缓冲区中的深度(在图表中用z表示)进行了测试。如果深度测试(通常是“是否比深度缓冲区像素位置最后的值更接近屏幕?”)通过,则用最新的像素值更新深度缓冲区,且将数据“此三角形中的此像素形成了贴图”进行存储。
可以想象,这一处理的结果是一组贴图数据,且仅对通过了深度测试的可见像素进行编码。这里再重点强调一遍。处理的结果是一组贴图数据,且仅有通过深度测试的可见像素才进行编码。
处理过程中节约效率尤为重要。我们可以在gpu工作之前预先捕获给定渲染的绘制调用。在其他gpu中,驱动器将发送命令到gpu,使之尽快在应用程序中完成绘制调用。它不会在乎前一个或接下来的绘制是什么。但在命令较多的时候,知晓前后绘制调用的内容便可以大量节省功率。尝试及避免在其他架构上工作的传统方式类似于这种情况,即在像素渲染前便已完成深度测试。但是测试往往不如我们测试像素这般精准。
在给gpu输送命令之前,我们启用所有影响给定缓冲区的绘制调用。这个过程可以让我们获取影响缓冲区渲染的所有几何对象,使我们可以完成贴图和hsr,尽可能避免多余的工作。
对于非透明的几何对象,这种方式非常有效,文末将对此进行简要介绍。
透明度
显然,当透明物体被挡后,isp需要克服障碍。我们处理透明度的方法相当简单,即节省效率。当透明的物体从先前的区块中进入isp时,我们可以有效地停止操作,直接冲刷所有通过深度测试的像素进入着色器内核。为何?因为我们可以在顶点对透明物进行混合,我们所需了解的是混合值。
所以,我们清空isp进入usc(或sgx中的usse),对所有阻挡物体的可见非透明阻挡物进行渲染,并使用最终像素值更新缓冲区,这样我们便可以在顶点混合。到这一步先稍安勿躁,先看看接下来进入isp的对象是什么,因为我们需要维持api提交顺序,以满足所有当前的api规范。
如果一个透明物进入后,再次进入另一个透明物,我们需再次冲刷以确保正确的渲染。不管非透明对象如何覆盖所有透明对象,只要通过深度测试,便不影响继续操作。
因此要确定冲刷对效率的损失有多少,取决于何种渲染物以何种顺序完成渲染。立即模式渲染值得一提:它们从不在意渲染的类型,并一直在消耗带宽的情况下进行混合。但我们的架构旨在尽可能节省成本,我们要做的是一个权衡了原始性能的产品。
所以你还未曾见过我们的开发人员推荐文件,但最后会要求开发人员公开相关文件。
并行性
这里我要讲一点有关并行性的内容。由于我们操作贴图,而贴图通常是独立储存,可以想象要在硬件层进行并行处理理论上来说是非常琐碎的事情。而rogue配置了两个前端。我们让一个在列表中分配贴图的前端控制器处于并行工作状态,然后再同时关闭,完成上述描述的整个流程。
节省了什么?
总结一句,hsr部分是我们在架构中节省效率最大的一部分。但保存至芯片且仅处理可见像素到底节省了什么?首先,所有的纹理和目标在像素渲染过程中要渲染缓冲出入口带宽,渲染这些像素时会引起消耗。像素渲染将纹理作为输入,并需要在最后编写最终值。而对于延迟渲染,我们可以创建和使用芯片上的整个g-buffer区 (如果它适合每个像素空间)且没有外部内存访问。
我们还保留了所有在isp中舍弃的像素的渲染运算操作:现代着色器有数以百计的周期,usc是设计中消费功率的最大部分。最重要的是,usc在运行着色程序时,还需要在最后一个值写入贴图内存之前读写其内部寄存器来存储中间值。而注册访问则消耗内部寄存器文件的带宽和大量的功率。
因此,潜在成百上千的alu操作和寄存器读写,而这些本是不必要的。为像素点亮usc才形成最终看到的画面。相比同类产品,我们最大的优势很大程度上是由于这种由isp驱动的机制及运用各层级管道来实现的。
在我们使用gpu的产品中,功率优势对于您使用手机、电脑或智能手表时的体验尤为重要。实际上,任何设备均需要强大有效且可以最佳利用电池的gpu。
工业机器人常见的三大应用误区盘点
协作机器人和工业机器人究竟有哪些不同之处?
如何避免小功率通用开关电源设计中产生的EMI
Point-NN: 即插即用,无需训练的非参数点云分析网络!
特斯拉在英国汽车市场创下月度和季度记录,主要归功于Model 3
PowerVR图像架构:延迟渲染
量子位如何根据需要生成支持量子处理器之间通信所需的光子
乐视终于开始还钱了!乐视连续12个跌停之后还有多少钱还得起?
如何使用DPDK和GPUdev增强内联数据包处理
国产芯片兴起,单要打破美日韩的垄断局面还需时间
la7685资料
什么是技术安全需求和安全机制
物联网与互联网的两点差异
锤子手机最新消息,锤子坚果pro详细配置外形曝光,骁龙626+4GB内存,iPhone4s附体
华为7nm麒麟810处理器发布 AI能力强于高通骁龙855
全球最大NB-IoT商用网建成 中国联通将在10城市进行试点
工业物联网有没有成功的案例
开关电源故障在ABB高压变频器维修案例
2019年中国SDS实现46.8%增长,华为分布式存储稳居市场第一
Solder Mask与Paste Mask存在什么区别