2013年1月31日星期四

2013"应用处理器"微架构 - 移动图形处理器


第16页:移动图形处理器形势简话
目前移动图形 GPU 大致上有五个阵营,即 ImgTec PowerVR、ARM Mali、高通的 Adreno、NVIDIA GeForce ULP 以及 Vivante(中文名是:图芯),由于 Intel 下一代 Atom 中将会应用自己的 GPU,因此很快就会扩展成为六个阵营。这里的 Vivante 的人是来自 NVIDIA 的,如果你仔细看 Vivante 的文档就会发现 Vivante 的很多“市场行销式术语”都和 NVIDIA 极其相似。
在这几家厂商中,做移动图形时间最长的当然是 ImgTec PowerVR 了。
不仅与此,PowerVR 对于许多九十年代中就已经接触 PC 的游戏玩家来说也不陌生,当年的图形加速卡概念刚刚被炒作起来,做图形加速器(注意,不是板卡哟)的厂商多如牛毛。例如 ATi、Tseng Labs(代表作是 ET4000)、Rendtion(代表作是 Vérité 2x00)、3dfx(代表作是 Voodoo 2 三维加速芯片)、PowerVR、Bitboys、GigaPixel、Trident、S3 Graphics、3D Labs、Cirrus Logic、Alliance Semiconductor(代表作是大名鼎鼎的 ProMotion 6410,VCD 最流行的时候,6410 就是显卡代名词)、Matrox、Chromatic Research(代表作是 Mpact! 系列可编程多媒体芯片)、Number Nine(代表作是 Imagine 128,传说中的神作,当时 2D 显卡的巅峰一个是 Matrox,另一个就是 Number Nine),NVIDIA 在当时同样也只是一家刚刚起步的公司。
PowerVR 在这众多的图形芯片公司中是一家很特别的厂商。首先它是以技术授权方式将设计转让给其他芯片公司,由其他芯片公司将设计物理化后成为真正卖给厂商的芯片,其次是 PowerVR 的渲染架构是分块式延后渲染,理论上可以完全消除像素的无效重复渲染。
在当时,极少有图形芯片公司是这样的方式运作以及具备这样的渲染技术,当然并不是说完全没有,除了 PowerVR 外,还有一家名为 GigaPixel 的公司也是采用授权制和具备分块式延后渲染(被称作 Giga3D 架构,具备比当时 PowerVR 兼容性更高的分块式延后渲染设计以及采用 eDRAM 的特点)的,不过这家公司出彩的时间没有几天就被 3dfx 收购,而 3dfx 的所有资产后来也被 NVIDIA 收购了,其中也包括 Giga3D。



第17页:PowerVR SGX 54x MP4 GPU 微架构
PowerVR 的渲染模式是 tile-based deferred rendering(分块式延后渲染)。
分块式渲染(TBR)并不难理解,就是把画面切成若干个 16x32 或者 16x16 的像素块进行渲染,这样的好处是可以在芯片上建立一个中间缓存(也可以称作 Tiler Buffer,分块缓存,里面用于存放当前渲染 Tiler(像素块)的深度/蜡版帧缓存、色彩帧缓存、渲染对象等),不再需要片外的显存来存放 Z-buffer,让渲染过程中的读写尽量在片上完成,减少内存的读写。
由于在中间缓存渲染的时候都是很高的精度(IEEE 32-bit),减少了以 16-bit(例如 R:G:B=5-bit:6-bit:5-bit)帧缓存模式时在内存上进行透明混合等操作时的精度损失,因此 TBR 可以较低的内存读写和占用实现高品质的输出。
ARM 的 Mali、当年 Bitboys 的 Glaze3D 都属于 TBR,不过也仅此如此,它们并非 TBDR,仍然属于 IMR(立即渲染器),只有有限的 HSR 能力(例如 Early-Z、Hi-Z 之类的技术),并不能完全消除无效渲染。
TBDR 是在上面的分块式渲染(TBR)基础上增加了对场景中当前屏幕画面三角形的筛选分仓(binning)的步骤,将三角形的前后位置关系标记起来并存放于片外的显存中,这样就能实现将不可见面在进入着色渲染流水线之前剔除掉,实现完全消除无效渲染。
由于增加了分仓动作,贴图和着色必须等待三角形可视性问题解决后才渲染,渲染上增加了时延,所以这种渲染方式被称作分块式延后渲染。
不过在 OpenGL 中缺乏专门的标记来指示一帧画面什么时候开始和结束,所以 TBDR 对一帧画面什么时候才接收到所有的三角形进行侦测将会有点麻烦,这会导致三角形分仓陷入迷失中。
在 Direct3D 中有 BeginScene() 和 EndScene() 这样的标记,但是由于在几乎所有的硬件上都没有效果,所以开发人员都会懒得去用这些标记并且随意地在这些界限外使用 z-buffer,这会导致 API 无法确保 z-buffer 中存放有效的数据。PowerVR 硬件本体虽然可以把 Z-buffer 存放在片外显存中,但是代码必须编写正确。
TBDR 可以减少无效渲染、实现极高的低内存占用渲染输出品质,但是它的缺点是需要做一块容量不小的片上缓存和大量的晶体管确保 TBDR 时候的兼容性,因此 PowerVR 的芯片面积一般都比 GeForce 这类 IMR(立即模式渲染器)大不少,另一个麻烦之处在于行销的时候,PowerVR 的纸面规格相当难看(当年 PowerVR3 就是搭配 SDR 作为显存上市的,而此时市场上的许多显卡都已经搭配 DDR 显存了),当然这个可以透过一些媒体测试实证加以解决。
轻松读懂“应用处理器”微架构 2013 版
上图是 PowerVR SGX54X MP4 的微架构图,这个系列中的 PowerVR SGX 543 MP4 曾经应用于苹果 iPad 3 中的 A5X 应用处理器中,MP4 表示它是以四内核形式组成的 GPU。
需要注意的是,PowerVR 说的内核是真正的内核而非 NVIDIA/AMD 那样的把单个 ALU 都当成 core 的市场行销术语,它这里的四个内核可以并行处理四个三角形渲染,NVIDIA 到了 Fermi(GTX 480)开始实现多三角形渲染,而 AMD 是在 Tahiti(7970)开始实现。
在 PowerVR 54x MP4 中,每个图芯渲染计算单元被称作 Multi-Threaded Co-Processor,对应 OpenCL 的术语就是 PE(Processing Element,处理部件)。每个 PE 每个周期可以完成两个浮点操作。
每四个 PE 构成一个 Pipe(渲染流水线,因此 Pipe 本质上就是一个四路 SIMD),每个 PowerVR SGX54X 内核包括四个这样的 Pipe,即 16 个 PE,故此 PowerVR SGX54X MP4 就有 64 个 PE。
因此如果 PowerVR SGX 54x MP4 运行于 300MHz 的话,浮点性能就是 38.4 GFLOPS。
即使是同一代的 PowerVR,不同的内核版本具体的实现细节都可能有些差别,例如 Pipe 内的 PE 数或者是每个内核内的 Pipe 数,例如 PowerVR SGX 554 MP4(Apple A6X 采用该 GPU)的每个内核有 8 条 Pipe 而非 PowerVR SGX 54x MP4 的四条。
PowerVR SGX 5 被设计成统一渲染结构,即几何体顶点和屏幕像素计算都是由上面说的 PE 执行,这样的好处是让 GPU 内的计算单元可以尽量保持运作状态,而不是像分离式架构那样遇到非平衡负载的处理时候,VS(顶点计算单元)有时候在等 PS(像素着色计算单元)或者 PS 在等 VS。
根据 PowerVR 的资料,SGX 54X 的每个 Pipe 内有一个线程调度器(Thread Scheduler),每个线程调度器内有 16 个线程可供派发,每次可以派发其中的 4 个线程给下面的 PE 执行。
PowerVR SGX 5 系列中有明确的 API 支持规格的内核基本上都是支持 DX9.X,但是有一个特例,那就是 PowerVR SGX 545,可以实现 DX 10.1、OpenGL 3.2 支持。
如果资料没有错误的话,PowerVR SGX 5 的 ALU:TEX 比例为 2:1,即每两个 PE 就会配上一个纹理单元,因此我们这里的 PowerVR SGX 54x 单个内核具备 8 个纹理单元。
虽然说 PowerVR 微架构的资料并不是很多,但是相对于除了 Intel 的其他对手而言,已经是非常大方了。

没有评论:

发表评论