在上一篇文章我们已经了解了GPU工作流程以及作用,但GPU绝无这么简单。目前市场上的 GPU 主要由三家公司主导,分别是ImgTec的PowerVR系列、Qualcomm(高通)的 Adreno 以及 ARM(安谋)的 Mali,其中PowerVR被苹果采用,Adreno被高通整合到骁龙SoC当中,Mali应用最为广泛,有三星Exynos、MTK Helio、Mstar等等,按渲染模式可以划分为IMR与TBR/TBDR两大流派,下面我们先从PowerVR说起。
PowerVR —— 延后式分块渲染架构
ImgTec(或者说 Imagination Technologies)的前身是 1985 年在英国成立的VideoLogic公司,在上世纪90年风靡一时的世嘉DreamCast游戏机就是采用该公司技术授权生产的图形处理器。
ImgTec目前旗下有多个分部,PowerVR是其中专门从事GPU、视频处理单元、摄像机知识产权内核技术开发的分公司。
PowerVR虽然从事GPU开发,但是它并不直接售卖芯片实体,而是透过授权的方式,将芯片内核技术以收取权利金的方式让第三方生产、销售、使用,例如苹果公司、英特尔公司、联发科、索尼等,商业模式和同样是英国公司的ARM一样。
技术内核授权方式给了芯片厂商和系统集成厂商非常高的灵活性和快速切入市场的能力,他们可以在较短的时间里就实现各种配置的灵活组合。如果你看过我前面介绍的图形流水线就知道,要做好一枚具竞争力的GPU难度是相当大的,中间涉及大量的技术积累。
像NVIDIA、AMD这样的厂商都不是突然冒出来的,他们都经历过非常惨烈的市场竞争、有业界最强大的研发团队以及与周边软件开发商经年累月的开发合作关系,现在一个新丁公司仿效NVIDIA模式贸然闯进GPU开发领域的话,如果不是手握十亿美元级规模的资金来换取技术和各种市场资源的话,恐怕连响都听不到。
在上世纪90年代末和本世纪前两年,PowerVR也在桌面市场和NVIDIA、3dfx进行过捉对厮杀,不过由于商业模式并不十分适合桌面市场,所以在仅有母公司VideoLogic(1999年更名为Imagination Technologies)推出的Kyro II后就不再踏足桌面独立显卡市场,转而全力发展嵌入式领域,从此一发不可收拾。
PowerVR在桌面独立显卡市场的最后一款产品是PowerVR3系列,原定用于Kyro III/IV的后续产品PowerVR4由于退出桌面市场,对公众而言只停留在幻灯片(上图的STG5000就是原本计划用在Kyro III的PowerVR4)中。
当然,PowerVR并没有完全退出桌面市场,他们和Intel达成了技术授权协议,英特尔可以在其集成GPU中采PowerVR MBX架构,英特尔在很长的一段时期内的集成GPU都采用了这个微架构内核。
PowerVR MBX据闻是世嘉DreamCast那枚PowerVR PCX 2的升级版,从技术资料来看的话,其实PowerVR MBX有些类似于PowerVR4,官方的PowerVR MBX白皮书里也明确写着:
4th generation tile-based deferred rendering(第四代块元式延后渲染)
从规格表来看,PowerVR MBX支持OpenGL ES 1.1,相当于OpenGL版本1.5或者DirectX 8.x的变种版。
所以,PoweVR MBX应该是和PowerVR Series 4一脉相承的,PowerVR MBX属于后者的移动版本。
什么是TBDR呢?
在前面介绍的图形渲染流水线,GPU在渲染的时候,一般是逐个三角形渲染的,如果以深度顺序来划分,可以分为从远到近(画家画法)、从近往远,开发人员可以在编写代码的时候指定渲染顺序。
如果依照在图形流水线什么阶段进行三角形排序,又可以分为sort-first、sort-middle、sort-last,middle是中间的意思,指的是从模型空间到屏幕空间这部分工位,sort-middle就是指在这段进行三角形前后顺序排序。sort-last是指在这之后进行三角形排序,sort-first是指在这之前进行三角形排序。
Sort-First一般用于多GPU渲染方案,基于片元方式的Sort-Last在目前绝大多数的GPU微架构中使用,而Sort-Middle则是PowerVR的三角形排序方案,需要在几何变换和光栅化之间进行图元的排列/分仓处理,在解决了可视性问题后再进行贴图和着色处理。
这个步骤会造成一定的延迟,加上采用了块元式渲染,所以像PowerVR这种渲染架构被称作块元式延后渲染器(Tile Based Deferred Rendering,TBDR)。
而一般的GPU被认为是看到一个三角形就马上渲染,所以被称为立即渲染器(Immediate Mode Rendering),立即渲染器也可以分为块元式(例如ARM Mali)和非块元式(例如AMD、NVIDIA “目前”的GPU)。
(IMR)
什么是TBDR?
PowerVR 微架构诞生于上世纪90年代初期,针对的是初代的三维游戏机,当时的人们希望这枚芯片的效率要尽可能地高,由于受到半导体技术的限制,所以在这时期有各种现在看来稀奇古怪的偏重于某个技术指标的芯片。
要效率高,其中一个办法就是只渲染屏幕上能看到的三角形所覆盖的片元,人们引入了名为HSR(Hidden Surface Removal,隐面消除,这里的隐面是指被其他实体多边形遮盖的多边形)来消除无效片元来实现这个目标。
(TBDR)
在TBDR的渲染流水线里,几何阶段生成(已经经过裁剪)的多边形或者说三角形参数信息都存放在一个名为Scene Buffer(场景缓存)或者Parameter Buffer(参数缓存,这是相对新近的叫法)的内存里,理论上里面保存的应该是同一帧画面里的所有三角形信息,其位置在显存里(对于采用统一内存架构的手机而言,则是和系统内存一样位于同一块物理内存上)。
这一步是TBDR独有的,相较之下,传统的GPU在几何阶段扔出到三角形后纹理单元/着色单元就马上渲染,因此人们将传统的GPU渲染方式称作立即渲染器。
这里请不要把TBDR 和延后式渲染混淆,后者是指把多个片元渲染后在进行后期处理(例如打光、模糊等效果),同样是“延后”一词,但是对应的渲染节点完全不一样。
在生成Scene Buffer的同时,PowerVR GPU内部的块元加速器会对这些三角形进行分仓(Binning)或者说筛选(sorting)处理,这个动作会依照16像素*16像素(取决于具体的GPU实现,像PowerVR PCX2可以是32*32或者32*16,PowerVR SGX 5上是16*16,“新的”PowerVR Series 6/7是32*32,这样的分块被称作块元,即Tile)的大小,将Scene Buffer中位于块元内的所有三角形的指针存放到一个对应的块元缓存(Tile Buffer)中。
对于一个大小为1920x1080的全高清屏幕,用16*16的块元大小进行切分,可以切成大约8100个块元,每个块元在“显存”中都有一个对应的块元缓存,里面存放的就是上面所说的位于块元内的三角形数据指针(指向Scene Buffer对应的三角形数据)。
所谓指针,是编程语言中的一个对象或变量,用来存储某一个地址,这个地址的值直接指向(points to)存在电脑存储器中另一块存储器空间的值。
从编程的角度而言,在这些块元缓存存放的数据结构可以称作图元列表(primtive list)。
按照PowerVR或者说ImgTec的说法,他们在新的微架构中引入了几何体压缩技术,存放在Scene Buffer的几何体数据是压缩过的,在GPU顶点内存单元读取时候再解压,这样的好处是可以显著节省存放Scene Buffer的内存空间和带宽,而这通常意味着:省电。
TBDR是如何实现HSR的呢?
不过几何体压缩并非TBDR的卖点,TBDR的真正卖点是可以实现完全消除不可见三角形的片元渲染,那么它是如何做到这一点的呢?
(Kristof Beets)
根据现在供职于ImgTec担任商业开发总监的Kristof Beets在 2001年(就在这一年他加盟PowerVR,任职开发者关系协调工程师,该文似乎是他在PowerVR实习期间撰写的)的一篇文章,PowerVR的HSR实现方式应该是这样的:
1、从Tile Buffer中获得第一个指针,基于这个指针就能拾取到Scene Buffer中所有三角形的数据。
这一步可以实现预拾取并将数据存放在一个GPU的片上缓存里,这个高速缓存可以称作为On-Chip Tile buffer(片上块元缓存),用作区别于片外的图元列表Tile Buffer,虽然都是块元缓存,都是对应16*16个像素,但是存放的东西完全不一样(一个是从指针解引用后获得的三角形数据和计算好的深度值,另一个则是图元列表)。
2、使用这个三角形的数据计算出被该三角形覆盖的Tile中每个像素的Z值(深度值)。
3、这些深度值数据以及对应于第一个三角形的指针被一起存放在GPU内的高速缓存里。
4、重复上面的步骤,获得第二个三角形的数据以及该Tile中被其覆盖的像素的深度值,对第二个三角形覆所盖像素的深度值和第一个三角形所覆盖像素的深度值进行比较,如果新的深度值更接近于视口(表明是可看见的),就更新深度值以及三角形(指向新的三角形)。
5、重复上述的步骤,直到覆盖该Tile的所有三角形数据以及深度信息更新完毕。
6、此时,GPU的片上高速缓存存放的就是用于确定像素色彩的三角形。
前面的Scene Buffer以及Tile Buffers都是存放在GPU外的,而上面步骤中绝大部分操作都是GPU内部的高速缓存上进行的(除了从Scene Buffer中载入该块元的三角形数据外),速度会非常快。
渲染一个块元需时256个周期(根据Kristof Beets文章提到16x32的块元需时512个周期推算):
1、数据拾取可以采用流水线结构,因此不存在性能惩罚;
2、筛选(计算Z值)需时一个周期,这个步骤也可以采用流水线结构,每个三角形的检查和块元更新可以在一个周期内完成。
因此除非时出现极端状况,256个周期的渲染时间是可以掩盖掉块元中含有256个三角形执行筛选动作的耗时,在一个16x16的块元内出现256个三角形的情况目前来说应该还是很少见。
按照这样的思路可以推算出 1920x1080 60FPS下能实现的每秒三角形筛选能力是:
1920x1080 * 60FPS = 124,416,000 Mtriangles/s
根据上面的算式可以得出在像PowerVR SGX 5上每个块元含有高达256个三角形的情况下,要满足60FPS速率时的三角形筛选个数为124百万三角形,现实的游戏中几乎没有这样的情况会出现,因为目前的制程无法做到一个全程胜任这个三角形规模真实游戏的移动GPU。
在知名的三维性能测试软件3DMark里有一个支持在手机上进行测试的icestorm场景,其三角形规模在Extreme模式时候的为每帧28,000个,达到60FPS时就是每秒1.68百万三角形/秒,对于手机来说这个测试已经算是比较严苛了,但是此时三角形规模也就是每个块元大约3.5个三角形,远远低于每周期256个三角形的处理能力。
PowerVR的渲染
完成块元渲染后,在块元帧缓存中的数据会被写入到显存(在手机中通常显存和系统内存共享)中。在这个写入动作执行的时候,会一并执行抖动操作(只执行一次而非多次)。如果在台PC上,如果指定了超取样抗锯齿,在这一步还会执行一个向下取样的操作,将画面缩小到指定的屏幕分辨率。
在完成了一个块元的渲染后,这个块元的像素会被传输到显存(对于采用一体内存架构的移动设备来说,这块显存是从主内存中分配的)。
然后,GPU继续下一个块元的渲染,直到整帧画面渲染完毕后,以双缓存方式运作的Scene Buffer开始把下一帧的块元递交给渲染单元执行后续工位处理,周而复始。
相较于非TBDR的GPU微架构来说,PowerVR或者说TBDR能对整个画面(场景)进行判别,确定哪些三角形覆盖的片元需要渲染,而“传统”的立即渲染架构无法实现这一点。
Kristof Beets的原文还介绍了infinite plane(无限大平面)和HSR的关系,所谓的infinite plane并不难理解,你可以想象一下:在一个三维空间里存在着一块无限大的平面,这块平面显然会把这个三维空间一分为二。
如果我们在这个三维空间多弄几个这样的平面并使其相交,也就可以构建出一个几何体模型出来了(例如只要六个相交的无限大平面就能构造出一个多边形数很少的立方体)。
这样的建模技术和常见的三角形建模是有很大区别的,所以很难找到合适的建模工具,其应用非常受限,而且随着模型越来越复杂,无限大平面的优势也就没啥感觉了(在Youtube上有一段采用PowerVR PCX2渲染一个由35个无限大平面构建的甜甜圈的视频,帧率只有47 fps),三角形此时是更合理的选择。
好好的三角形不用,为啥要折腾这个无限大平面呢?可能的原因是在当时看来,这样的技术可以节省在Scene Buffer里要存放的三角形数:
在几何阶段,PowerVR会根据从视点发出的一条“测量光”确定最前和最后的平面相交点,藉此得出一个渲染计算约束椎体(effect volume),使得这些无限大平面变成有限的平面,加上隐面消除技术,几何体外突出的平面也被消隐掉。
较少的多边形、可以和TBDR的隐面消除技术完美配合,于是无限大平面建模的合理性也就因此存在了。
据说在PowerVR Series 2以后就不在支持无限大平面,目前为止只有世嘉 DreamCast中的那枚PowerVR芯片是具备无限大平面建模能力的图形芯片,所以无限大平面这个部分我们完全不需要考虑,这里介绍主要是为了强调一下 PowerVR的特点——近乎完美的隐面消除能力(如果不涉及阿尔法混合、阿尔法测试的话,因为这两项操作会导致HSR失效)。
我们上面费了很多口舌来阐述PowerVR的最主要特色TBDR,接下来就让我们说说当前以及即将推出的PowerVR GPU到底会长成什么样子。
ImgTec PowerVR Rogue
ImgTec在2012年发布了名为PowerVR Rogue的第六代PowerVR微架构,现在市场上许多手机里的GPU都是基于该微架构的变种,例如红米Note 3/Note2、魅蓝 Metal、魅族 MX5里的PowerVR G6200。苹果iPhone 6s Plus的GPU经过各种验尸手段查证后确认为PowerVR GT7600,这个GT7600被PowerVR定义为第七代PowerVR(PowerVR Series 7 或者 Rogue 7)微架构。毫无疑问,不论档次高低,现在许多手机、平板电脑中都有基于PowerVR的GPU。
ImgTec属于经营、开发知识产权的芯片公司,本身并不直接售卖芯片,透过研发大量芯片内核,然后将其授权给需要的第三方公司,收取授权金来维持公司的运营,因此他们会弄一大堆内核,以满足不同厂商、市场的需求。
理论上这样的运管方式只牵涉到研发费用和市场拓展费用,弄一大堆内核IP的并不会造成实体产品那样的库存压力。
ImgTec在2012年发布了代号Rogue的PowerVR Series6微架构,最低端的是G60X0和G61X0(x为其中一个数字编号,不同编号型号配置均不一样),对应的D3D规格只能够支持DX9特性级别。
在型号的含义方面,G6050里有0.5个正常规格的USC(通用着色器簇),61X0 里含有1个USC。USC 是PowerVR Series 6引入的统一着色簇简称,区别于以往的PowerVR Series 5时候的USSE。
前面我们所说的TBDR是指渲染流程的方式,而通用着色器簇则是指具体微架构里将若干个计算、贴图部件绑定在一起的单元,一个USC 就类似于CPU中传统概念上的一个内核,正如我们前面所说的,它对应的就是通用计算标准OpenCL中的术语就是Compute Unit。
下图是PowerVR最新的PowerVR Series 7XT的微架构图:
GPU厂商在设计GPU的时候都会把延伸性作为重要的设计因素,因为这样能确保软件、硬件资源的最充分利用,上图的USC规模可以依据具体的应用情况作调整,例如iPhone 6s采用的GT7600就具备6个USC(或者说6个CU)。
上图的PowerVR Series 7XT属于目前ImgTec最强大的GPU微架构,苹果公司的iPhone 6s列就是采用基于该GPU微架构的GT7600。
作为PowerV RSeries 7的GT7600,提供了FP16(半精度)的原生支持,所以如果程序采用了FP16的话,性能会较FP32快一倍,对于手机应用来说,FP16 提供了10位的有效值和5位的指数,是可以满足许多情况下的图形渲染计算的需求。
要正确使用这类FP16需要比FP32更多的技巧,像当年NVIDIA的NV3X就提供了FP32 + FP16设计,但是在和AMD R300的性能竞争中一直处于下风,维持NV3X拉力的主要靠NVIDIA和各个游戏开发商紧密的合作关系。
上表中的GFLOPS指标是指GPU计算单元运行于1GHz时候的情况,不过我们目前尚未有可靠的iPhone 6s系列GPU运行频率规格,wiki百科上写的苹果A9 GPU为450MHz(此时的单精度浮点性能是172 GFLOPS)或者533MHz也只能是参考。
根据GFXBench的ALU测试结果,iPhone6s Plus(GT7600,6 USC)是 12781fps,iPhone6 Plus(GX6450,4 USC)是5847 fps,这意味着前者的计算性能是后者的两倍左右,考虑到ImgTec曾经表示PowerVR Series 7XT浮点性能在同频、同规模下的性能是PowerVRSeries 6XT 1.6 倍,这个测试结果表明iPhone 6s Plus的GT7600频率很可能和iPhone 6 Plus的GX6450相当。
业界也有人认为iPhone 6s系A9采用的并非GT7600,原因是开发文档缺乏一些PowerVR Series 7XT存在的Tessellation等特性以及采用Metal作为API,这其实因为PowerVR的授权本来就允许厂商自行定制驱动,像 Intel的GMA系列GPU就没有开放TBDR这样的PowerVR最核心技术,而且Tessellation对于这个级别的GPU而言意义也不是很大(有多少人用过iPhone 6 GX6450里的那个Tessellation?),所以不必太为此纠结。
下表是常见的PowerVR Series 6 GPU规格表,浮点性能部分依旧是以1GHz频率为参考。
其中的G6200目前在诸如红米Note2/Note 3、魅族 MX5、魅蓝 Metal、索尼 Sony Xperia M5/M5 Dual、亚马逊Fire HD 8/10等智能手机和平板设备中采用,尤其是前三者,目前在市场上属于比较火的产品。
以红米Note 2为例,标准版的G6200频率是550MHz,增强版是750MHz,单精度性能分别是42 GFLOPS和57.6 GFLOPS,和iPhone 6s的150+GFLOS显然是有明显差距的,从GPU的角度而言,搭配G6200的设备在运行重度三维游戏的时候会明显比iPhone 6s慢,以GFXBench为例,各项测试结果差距在3倍到13倍左右。
例如在离屏模式下,1080p算术逻辑单元2测试结果红米Note 2是 749.4 frames,iPhone 6s是 3824 frames,大约是5.1倍,这意味着iPhone 6s GPU的浮点性能是214 GFLOPS左右,推算出来的iPhone 6s GPU频率是550MHz到600MHz左右(假设 Metal API 版渲染动作、精度都是和OpenGL ES版本是一样的)。
在2016年,我们预期会看搭载到比GT7600快接近一倍的顶配PowerVR GPU手机产品。目前手机 AP(应用处理器)还基本能按照摩尔定律高速发展,行业的增长势头还算是比较乐观,厂商有足够多的资金用于制程的而研发改进,例如对16nm/14nm制程进行改进,降低功耗,适当增大电池容量,对微架构进行调优以及内存技术的变化,都有望增加实现速度提升一倍的机会。
上图是ImgTec日前发布的PowerVRSeries XT 7 Plus,顾名思义,它是PowerVR Series XT 7 的加强版,主要加强的地方包括:
增强整数单元的单元数和灵活性,例如每个其中的两个32位整数单元可以同时执行8个8位整数操作,这对于OpenCV这类可视化计算来说是有不少好处的。
首次实现了OpenCL 2.0的支持,CPU和GPU可以在同一块虚拟内存上运作,编程的时候内存指针不需要再作严格区分。
增加了动态并行化功能,可以在无需GPU干预的情况下创建新的GPU线程。
新增了一个2D图片处理数据前端,主要用于不涉及几何和块元的处理,适合做二维以及图片处理应用。
不过按照ImgTec的说法,PVR SXT7 Plus需要到2017年才有望看到,当然,我们不排除在下一代iPhone或者iPad上出现PowerVR Series 7。
中低端方面GPU的提升有可能会更激进一些,假设今年的中档手机也是搭配 MT6795的制程升级版,可以预期GPU也会得到相应的提升,在保持同样功耗的情况下,GPU有望升级至G6430等级(150 GFLOPS)。
高通Adreno系列——ATI血脉
相较于ImgTec而言,高通公司在GPU方面的耕耘其实是有一定差距的,在缺乏底蕴的情况下,一家土豪型的公司最简单、最直接的收购,而对象则是AMD的Imageon。
虽然说是AMD的Imageon,但是Imageon其实是AMD 2006年收购的显卡公司ATI的项目,高通在2009年收购了这个项目并将其更名为Adreno,当年AMD和Intel抛售非x86业务给人的感觉是非常果断的,他们可曾料到一年后乔布斯推出的iPhone所引领的智能手机现在正在给他们带来最痛苦的时刻。
既然是源自ATI的,这个Adreno自然有很深的ATI烙印。在2000年后,NVIDIA和ATI的GPU(NV3X的EarlyZ、R200的HyperZ等)都或多或少地采用分块式立即渲染架构,也就是TBIMR(Tile Based Immediate Mode Rendering),Adreno 200 就是源ATI 2002年时候的Imageon Z430。
TBIMR和TBDR相比,每个三角形都会按照递交的顺序交给着色器处理,理论上所有三角形都必须依照递交的次序处理,不过GPU厂商引入了Early-Z技术来尝试将一些不可见的片元剔除掉。
在高通的“Qualcomm® Adreno™ OpenGL ES Developer Guide”里,对Early-Z有以下的介绍:
在早期(2001年前)的GPU里,Z-test(Z轴深度测试)都是和阿尔法测试一样在像素着色完成后才进行的。
后来到了NVIDIA GeForce 3(NV20)和ATI RADEON 8500(R200)的时候,GPU 中开始引入名为Early-Z的操作(NVIDIA将其归入到名为Lighspeed Memory Architecture的概念中,ATI则将其归入到Hyper-Z里)。
Early-Z在GPU渲染流水线中位于三角形遍历和像素着色器(含纹理单元)之间,它会读取并测试片元的Z深度值,在进入像素着色单元之前抛弃掉不可视的片元。
Early-Z只有在三角形按照从前往后(由近及远)的递交顺序才能起作用,而且为了做到片上高速处理,一般会采取层次化Z缓存(Hierarchical Z-buffer)技术。
在采用Hierarchical Z-buffer的时候,GPU 会把每2×2个片元的四个 Z值中最接近屏幕或者眼睛的Z值取出来,存到一个更“粗糙”的版本。
这个更“粗糙”版本的Z-buffer分辨率只有原 Z-Buffer的四分之一,GPU再对这个“粗糙”版本的Z-buffer再做同样的事,一直重复直到分辨率只有一个片元。这样一来,就形成一个pyramid(金字塔)。
在渲染片元的时候,GPU先比较最粗糙版本的Z-buffer。如果要画的片元Z值还比较远,那这个片元就一定不用画出来了。如果它比较近,就再拿比较细的Z-buffer来比较,一直比较到最细的版本。在理想的情形下,通常大部分的片元都不需要比较到最细的版本,所以可以节省不少时间(要记得,一个“粗糙”版的Z值比较,其实就等于和四个“精细”版的 Z 值比较)。
相较之下,PowerVR的TBDR会在几何阶段的三角形裁剪后将当前 scene(场景或者说画面)的三角形经过筛选排序存放在scene buffer 内,然后由 HSR(隐面消除)算法将摄像机视点不可见的片元剔去掉,这部分实现细节已经在PowerVR一节中有阐述,这里就不再复述了。
按照高通的说法,Adreno从3xx系列采用了名为FlexRender的渲染架构,可以自动在立即渲染和TBDR之间切换,而且这个TBDR的执行过程和PowerVR TBDR是基本一样的(同样有对三角形进行binning和剔除无效片元的处理):
所以从微架构方面而言,高通透露的信息并不多,只能看到个大概,以骁龙820搭配的Adreno 530为例,采用了统一着色架构和FlexRender,配有256个ALU,支持DirectX 12.1、Vulkan、OpenCL 2.0。
采用骁龙820(搭载 Adreno 530)的小米 5(价格1999元版本))在运行OpenCL-Z的FP32 性能测试结果是287 GFLOPS,相较之下,价格799元的红米Note 2(Power VR 6200)只有44 GFLOPS,前者是后者性能的6.52倍,当然,这个测试只是属于底层测试,实际的游戏体验因人、因应用而异。
安谋Mali——弱核化设计
安谋(ARM)最为人熟知的是旗下的各款 ARM CPU内核,目前的主要手机几乎都是采用ARM 阵营的CPU。
ARM的GPU Mali是ARM在2006年收购的挪威公司Falanx获得的,源起于是90年代由ARM在挪威科技大学支持的的项目,到了2001年由Borgar Ljosland与四位在该项目中的GPU团队学生于2001年创办了这家Falanx Microsystems。
Falanx最初是希望打进台式机市场,不过随着3dfx、Matrox等公司的萎靡、败退,台式机GPU市场的格局发生了很大的变化,不再有空间给新丁了,Falanx转向了从事手机、PDA、机顶盒、游戏掌机、信息机等领域,不过他们当时在这个领域其实做得并不算很出色,ARM的收购对他们来说是一个重要的转折点。
ARM收购Falanx推出的第一款GPU就是2007年的Mali-200,是Mali第一款OpenGL ES 2.0 GPU,它和它的换代型号Mali-300、Mali-400、Mali-450都是基于名为Utgard(北欧神话中Utgard-Loki统治下约顿巨人位于仙宫与尘世之外的宫殿)的微架构。Utgar采用的是非统一架构,顶点指令和像素指令有各自专门的单元来执行,到了Mali-400时候实现了多核能力。
Mali最新的微架构代号是Midgard,和Utgard不同的是,Midgard开始采用统一着色架构,几何和片元操作指令都在同一个着色器单元上执行。
Mali同样采用了分块式渲染(块元大小是16x16),但是根据下面这个幻灯片,可以看到其scene buffer或者说primitive buffer保存的图元顺序必须和程序递交的顺序保持一致(画红线部分),不存在PowerVR那样的筛选(sorting)动作。
因此如果按照ImgTec的说法 Mali并不能算是真正的TBDR,当然,它还是具备 Early-Z这样的隐面消除能力,只是粒度上肯定不如PowerVR那么细(PowerVR自称其HSR能力为pixel perfect)。
在渲染流程方面,Mali或者说Midgard和目前你看到的大多数GPU做法有些不一样,那就是作为统一渲染架构,它可以在同一时间里同时对几何和片元进行渲染操作,而其他的GPU在同一时间里要嘛就是几何计算要嘛就是片元计算:
如上图所示,你可以看到Mali可以在同一时间片上同时进行几何和片元操作,这表明Mali内部的任务调度设计非常灵活,原因请看下面的介绍。
上图是Mali的着色器内核(Shader Core)功能模块图,可以看到,如果图示的确是正确的话,那么这个着色器内核里面可谓是五脏俱全,本质上就是一个小 GPU,图形渲染所涉及到的操作都能在一个 Shader Core 上完成,因此配有多个Shader Core的Mali可以做到在同一时间内跑几何和片元处理,多个Shader Core的Mali GPU其实就是一个片上多GPU并行渲染系统。
其实其他厂商尤其是采用TBR的GPU可以像Mali这样片上多核运行多个Tile,但是Mali GPU的特别之处是它的内核内部是没考虑扩展的,至少目前是这样。像ImgTecPower VR XT7等其他厂牌的GPU内部的CU数都是具备延伸能力的,而Mali GPU则对不起,不管什么型号的Mali GPU,上面的Tri-Pipe 都是固定的一个,这就是所谓的“完整的弱内核”设计。
从OpenCL的角度而言,每个Mali内核都是一个CU,只能以多个Partition(分区)的方式实现规模扩张。而像PowerVR则是既可以多个CU 也可以多个Partition的方式实现规模上的性能延伸。
值得一提的是,Mali-T880的Tri-Pipe,这其实就是Mali的可编程渲染/计算单元,其中包含了纹理(T-Pipe)、内存指令(LS-Pipe)和算术逻辑(A-Pipe)单元三部分,在Mali-T880之前,Tri-Pipe的算术逻辑单元大都只有两个,而在Mali-T880上,Tri-Pipe 的算术逻辑单元增加到了3个,使其计算能力提升了50%。
Mali相对于目前大多数其他厂商GPU的另一个区别要点是它的A-Pipe采用了SIMD向量处理设计,寄存器能够像目前CPU的SIMD单元那样灵活地拆分成2xFP64、4xFP32、8xFP16、2xInt64、4xInt32、8xInt16、16xInt8等数据类型访问。
按照ARM的说法,Mali的算术ISA 用了SIMD + VLIW的设计:
三个向量单元(128-bit数据路径)
4路FP32或者8路FP16
16路Int8
两个标量单元(32-bit数据路径)
按照ARM官方博客的一篇文章,Mali-T760的每条A-Pipe单周期单精度计算性能是17FLOP,从上图来看,VMUL和VADD以及SADD、SMUL的FLOPS是应该是10个,余下的7个就是那个VLUT。
LUT的含义并不是很清楚,也许是查表(Look-up Table)的含义,不过这样的话,我觉得似乎不太适合将其归入到人们常说的通用计算性能指标里,即使其使用的是VLIW指令集。
所以我觉得每条A-Pipe的单精度性能应该视作每周期10个比较合适。对于Mali-T880MP16来说,在 650MHz 时候的单精度性能应该是312 GFLOPS,同理,Mali-T760MP8的单精度浮点性能应该是104 GFLOPS,当然这只是我的个人意见。
LS-Pipe执行的是和纹理无关的内存存取动作,例如几何/片元处理时候的属性读取和变量写入操作。通常而言每条指令就是一次内存访问操作,如果是 A-pipe的向量操作就是单指令Vec4操作。
虽然ARM Mali并非TBDR,不具备在进入块元渲染之前透过筛选将无效的片元剔除掉,但是它的某些型号具备名为Forward Pixel Kill(正向像素剔除,简称FPK,见上面Mali-T880 Shader Core架构图中Early-Z后接的就是FPK单元)技术。
具备这个技术的GPU所跑的线程不再是不可撤销的,如果发现稍后的线程要向相同像素位置写入不透明数据,就会将已经在进行的计算终止掉。由于每个像素需要花费一段时间才能完成,因此 FPK可以有一个时间窗口来排空流水线中已有的无效渲染片元。
按照ARM的说法,这个FPK技术在最适中的流水时间窗口下所能达到的消除无效渲染效果可以和PowerVRTBDR w/HSR媲美,而且无需对整个画面的三角形进行筛选、无需在程序里添加筛选代码、能够对半透明对象实行正确处理、不会对帧率产生突变影响。
上面这个表格是维基百科上的Mali各型号规格表,其中的单精度指标是包括了那个VLUT的。
目前市场上大多数采用Mali的中端SoC都还是基于Mali-4XX系列,按照 ARM的说法,目前有75%的数字电视、超过50%的Android平板电脑、大于35% 的智能手机采用了Mali GPU。
例如小米电视3就采用了Mali-T760MP4这个GPU,三星去年的旗舰产品Galaxy S6、Galaxy S6 Edge都有采用Mali-T760,我手头有一台支持智能卡的电信T6有线电视机顶盒,搭配的是全志的SoC,其中的GPU也是ARM Mali-400MP,所以这个看上去有点古怪(完整的弱内核设计)的GPU在市占率方面Mali已经取得了相当不错的成绩。
三星Galaxy S6采用的Mali-T760MP8名义频率是772MHz,理论单精度性能是123.5 GFLOPS(按照每个算术流水线里包含两个4 路FP32 SIMD和两个 FP32标量来统计,未将那个相当于7个FLOPS 的VLUT或者说 SFU 单元计算在内),3DMark Ice Storm Unlimited 得分是 20988 ,而采用PowerVRGT7600的iPhone 6s Plus 3Dmark Ice Storm Unlimited 结果是27811,基本上符合123.5 GFLOPS vs 172.8GFLOPS (按照iPhone 6s Plus的GT7600频率为450MHz时计算出的单精度性能为172.8 GFLOPS)的差距。
我们相信,在新的一年里将有机会看到Mali-T8xx系列初露峥嵘,原因是Mali的完整弱内核比较便于随意搭配,新内核带来的规格、性能提升也可以为新应用带来更好的用户体验。
结语
在这篇文章里,我们介绍了三个常见的智能设备或者说手机/平板电脑的GPU,涉及到的知识面相对坊间的大多数文章而言要更深入一些,例如ImgTec的PowerVR、高通的Adreno、ARM的Mali虽然都属于TBR,但是具体的实现却有着各自的特色。
ImgTec的PowerVR是三个TBR架构中历史最长的,也是10年GPU大战中少数幸存下来并且活的还比较滋润的厂商之一,PowerVR在TBDR方面拥有非常丰富的实作经验,凭借 TBDR 的高能效比特点,在移动设备中站稳了脚跟,成为包括苹果在内众多手机厂商选择的GPU方案。
高通的 Adreno 从3xx系列开始引入了名为FlexRender的渲染技术,能动态在IMR和TBDR渲染模式之间切换,前者可以在兼容性、响应时延方面提供最佳的保证,而后者可以在性能耗电比方面达到更佳的体验效果。
Mali的渲染架构相对简单,属于TBIMR,也就是分块式立即渲染,对递交的三角形顺序不作筛选处理,分块的主要目的是节省带宽,不过它的某些型号具备名为 Forward Pixel Kill的技术,能够随时停掉“预见”到的无效像素(线程)的渲染,号称可以达到媲美PowerVR TBDR 的效果。同时,Mali采用了“完整弱GPU内核”(相对于其他厂商的“完整可延伸GPU内核”而言)设计,内核中的渲染单元不能扩展,性能的规模延伸是透过增加内核数来达到。
我们在本文中没有对NVIDIA的GeForce ULP和Intel的GenX进行介绍,不过它们其实基本上就是同架构的台式机版本的规模缩减版,当然,由于针对的移动设备,其中还有一些省电措施,遗憾的是,这两家厂商的GPU虽然性能不错,但是在手机市场上由于各自自身的因素而缺乏整机厂商的支持。
对大多数读者来说,GPU架构甚至GPU是啥,的确完全可以不需要了解,只要媒体或者朋友介绍说哪一部手机好用甚至是看上去外观比较合眼缘就可以让他们毫不犹豫地掏腰包购买。
所以,本文从一开始就不打算透过这篇文章来影响读者的购买意向,这只是一篇有科普性质的文章,尽可能地较少功利的因素,但求看起来资料尽可能详细有趣同时又能增加一些见识就行。