移动平台GPU硬件框架
1)PowerVR 逻辑层管线
- 管线基于PowerVR专利的TBDR架构(参考文献)
- 可简单划分为 主要处理顶点数据的Tiler阶段以及对每个Tile光栅化的渲染阶段
- 顶点处理阶段(Tiler)
- 数据从应用层Submit
- 驱动提取几何信息
- 最先执行的是由应用层控制的顶点运算,既Vertex Shading
- 随后数据被转换到屏幕空间(期间依次执行 Clip,Project,Cull)
-
Tile Accelerator(TA) 中的最后一步是Tiling
- 负责确定Tile和几何图元之间的关联性
- 每个Tile都会生成与之关联的数据队列(per-tile list),追踪(track)所有相交的几何图元
-
Parameter Buffer (PB) 是存放上述per-tile list的结构名字
- 数据位于SystemMemory上
- 其内部的PrimitiveList存有指向图元顶点(VertexData)的指针(ptr)
- VertexData对应了全部顶点的集合
- 其他渲染当前Tile所需的数据或指针
- PB由硬件管理
- 当Tile覆盖了过多的图元时可能
- 导致PB无法容纳全部图元/顶点关联队列
- 解决策略是分批绘制
- 一波DrawCall执行完毕后执行 Flash
- 余下部分图元信息重新填充PB,执行后续光栅化和渲染
-
Flash的代价是打断了HSR的数据连贯性
- 导致前后不同批次的绘制之间数据不共享
- 从而影响HSR执行效率,无法准确剔除,增加Overdraw
- 逐Tile光栅化和渲染(Per-Tile Rasterizion and Render)
-
Image Synthesis Processor (ISP) 图像综合处理单元的功能非常重要
- 首先它会获取(fetch)存储在PB中的屏幕空间图元数据
- ISP确保所有获取到的GeometryData都位于当前Tile定义的屏幕空间内
- 先执行HiddenSurfaceRemoval(HSR)
- 再执行Depth和Stencil Tests
- 参与比较的深度和模板中介数据(Intermediate Data)一直位于片上缓存中(On-Chip Buffer)
- 执行效率高
- 深度信息无需取回(?)
-
Tag Buffer负责存储HSR执行中间变量
- 只记忆每一个Pixel中处于最顶层的三角形(Triangle) 索引
- 自然是片上缓存
- 首先它会获取(fetch)存储在PB中的屏幕空间图元数据
-
Texture and Shading Processor(TSP)负责
- 管理纹理资源
- 规划FragmentShader的指令逻辑
- 调度独立的算术逻辑单元(ALU)执行渲染
- 输出可见像素(visible pixel)的颜色
- 此过程发生在片上(On-Chip),中间变量(Scaler和Vector)都存放在片上缓存内
- 关于AlphaTest 和 AlphaBlending
- 会导致HSR优化失效
- 同时可能导致TSP多次对同一像素执行shader (Overdraw)
- 执行AlphaTest或Blending的过程同样发生在片上(On-Chip)
- 写回FrameBuffer
- 一旦Tile渲染彻底完毕,相关颜色/深度信息会被写回到FrameBuffer中
- FrameBuffer位于SystemMemory上
-
Image Synthesis Processor (ISP) 图像综合处理单元的功能非常重要
2)PowerVR 物理层架构
- 硬件层面的设计理念
- 将GPU内部规划为一个个模块,或模块组。可以方便的调节某些功能模块的规模而不影响或牵连其他类型模块(Scale independently)
- 平衡好GPU中的前端(几何和光栅化模块),核心(算数逻辑单元和纹理单元),以及后端(像素填充模块),优化总吞吐量
- 硬件模块名词解释
- Data Master: 在PowerVR的TBDR架构中,负责处理那些非可编程部分(固定管线相关逻辑)的模块统称 XXX Data Master
- SPU(Scalable Processing Unit):是最上层可调节规模的核心运算单元
- 一个SPU包含一套几何处理管线,一个光栅化管线,一个纹理管线(TPU),以及一定数量的通用着色核心(USC),此外还包含多至两套的后端处理管线(PBE)
- PowerVR的最新Furian架构就是基于SPU进行规模控制的
- USC(Universal Shader Clusters):由高速缓存,指令调度器,高级逻辑控制器以及一系列特殊设计的计算和数据流管线(Pipeline)组成,USC没有沉重的状态切换负担,可以在任何时候高速响应来自其他模块的业务请求
- 每个USC可包含N条Pipeline
- 假设N=16,一个分派的Warp大小为32 -> 单Pipeline需要 2 x 时间处理一个Warp
- 每个Pipeline动态对应M个ALU (M可能会变化,但远大于Navida中的2个)
- 支持超标量(Super Scalar),既能够同时激发多条指令,驱动空闲ALU
- ALU是真正负担计算的核心,其总数量对标GPU性能
- Rogue架构中,一个USC使用16-bit位宽的Scalar SIMD逻辑单元,在运行32-bit位宽的任务时需要2个时钟周期
- Furian架构中,单USC中的Scalar SIMD单元上调到了32-bit位宽,可以在1个时钟周期内完成指令任务
- 每个USC可包含N条Pipeline
- TPU(Texture Pipeline Unit):纹理采样单元
- Furian架构相比上一代具有2倍以上的纹理过滤(Filtering)吞吐量
- Furian在一个时钟周期内可以一次性对8组INT8行纹理数据进行双线性采样
- TPU在SPU内部,一个TPU可同时被多组USC共享
- PBE(Back-end Pipeline):后端像素导出管线
- Furian相比前代具有2倍以上的像素导出率
- 每个SPU可对应2个PBE ,这样一个SPU总共可以在单个时钟周期内发射出8个像素或256bit的数据进入系统内存
- 硬件流程串联(参考)
- 前端的主责之一是顶点处理,Vertex Data Master负责通过驱动(Driver)将顶点信息从系统内存中读取到,经过必要的处理后直接送向一旁的 USC 单元,在这里可编程的Vertex Shading将会立即执行,待到USC通过寄宿其内的大规模并行计算核心执行完毕所有的可编程顶点渲染逻辑,别忘了后续还有若干步骤涉及顶点处理要做,此时这些数据任然储存在片上缓存内(stored on-chip)
- 下一步是图元组装(Primitive assembly),以及各种剔除(culling)和裁剪(clipping)需要做。如某些图元的背面(back-facing)部分几何体,或者完全在屏幕外的图元都会被直接剔除。剔除后剩余部分的图元被送去裁剪,如果一个几何体与视锥体包面相交,裁剪器(Clipper)会生成裁剪后的新几何体用以替换原有几何体,如此一来所有的待计算顶点都会落在视锥体内部了
- 前端的另一个重要任务则是Tiling,简单来说分为两个步骤(phase),第一步是接收前道传来的图元数据,并将它们区分为不同位置上的Tile中去。第二部对每个Tile内的数据进一步处理,主要是光栅化Tile,并将其产出的数据传递给片元着色器渲染,并最终写出到系统内存
- 在Tiling过程中为了能够尽可能节约带宽资源,大量数据会先被整理压缩到名为ParamterBuffer的结构中,这是一种加速结构,可以有效提高与光栅化单元之间的传输效率
- PowerVR的Perfect Tiling技术:
- 是一种烧录到硬件层面的算法,它能够快速找出真正与图元相交的Tile,而无需使用诸如包围盒或层级包围盒之类的技术找出个大概可能包含的Tile区
- PerfectTiling技术一方面大量减少了ParamterBuffer的数据量,同时也减少了光栅化单元的负担(具体参考下图)