移动GPU架构浅析
发表于2016-01-13
一、移动GPU的历史
GPU是Graphic Processor Unit的简称,顾名思义就是图形处理器。GPU的概念最早是从图形工作站发展而来,从90年代的个人电脑普及开始,GPU迎来了其大发展的时代。在90年代中期,桌面GPU经历了2D到3D的跨越,从此3D图形渲染取代2D成为PC游戏的主流。经过激烈竞争后桌面GPU形成了NVIDIA,AMD和INTEL的三足鼎立之势。在其后的10年内这个格局都没有大的变化。但是随着智能手机大潮的兴起,GPU在移动设备领域又迎来了一次高速发展,不幸的是桌面GPU的王者们没有抓住这个机遇。对于用户来说又是幸运的,因为我们可以见识到其它厂商GPU的魅力。目前在移动GPU领域市场份额前5的厂商分别是Imagination,ARM,Qualcomm,Vivante和NVIDIA。
Imagination绝对是移动平台GPU授权的老大,他们的触角伸得很广,并不局限于ARM阵营,即便是Intel的Atom处理器及桌面的GMA 500也使用了PowerVR系列GPU核心。
Imagination是一家英国公司。在3D加速卡方兴未艾的那个年代,Imagination也曾参与了Voodoo、NVIDIA、ATI等公司激战3D加速卡的战役,可惜最终存活的只有NVIDIA,ATI(AMD)和Intel。不过失之东隅收之桑榆,Imagination的移动GPU技术部门PowerVR反倒有所收获,在移动市场上他们又可以俯视NVIDIA了。PowerVR的复兴依赖于苹果在智能手机市场的开拓。Imagination公司的授权伙伴主要有Intel、苹果、联发科、LG、高通、瑞萨、三星、海思、Marvell、索尼等等。
ARM公司也有一整套GPU授权方案——Mali。很多不具备独立开发GPU技术的芯片供应商都直接使用了ARM处理器+Mali GPU的设计,比如三星、瑞芯微、展讯、意法半导体、全志等。其中三星和全志还是出货量大户,所以Mali GPU的份额和出货量不低。ARM官方声称Mali GPU在智能电视和Android平板中市场占有率第一。说到Mali的历史,ARM原本也是没有GPU授权的。此前他们也是使用Imagination的GPU核心。Mali其实是源于2006年收购的一家挪威特隆赫姆地区的移动GPU芯片厂商Falanx,ARM公司的Mali GPU开发中心也就落户在那里。
高通的Adreno其实是ATI旗下的移动GPU部门,当时叫做Imageon,主要为当时的掌上平台提供图形核心,2006年AMD收购了ATI, Imageon部分也进入了AMD公司。收购ATI之后AMD就进行了改组,Imageon部分很不幸地成为多余资产,最终在2008年末被高通以区区6500万美元的代价买走,现在就是高通的Adreno图形部门了。(不知道AMD看到现在的情况是否会后悔?)
在移动GPU这个江湖里NVIDIA算是后起之秀,虽然创建时间短,但是后来居上,再加上NVIDIA在PC市场的影响力,他们虽然是资历最浅的,但在GPU技术上实力雄厚,前途无量。在2016年CES上面NVIDIA展出了其最新的Maxwell架构GPU Tegra X1,其性能超过目前所有移动GPU。
与PowerVR、Mali、Adreno等明星相比,Vivante公司的GC系列GPU核心就不太为人熟知了,就连市场份额比它少的Tegra系列都比Vivante知名。让Vivante露一大脸的是华为海思的K3V2芯片,这颗号当年号称 “世界最快四核”的移动处理器,被用在华为的Ascend D1、荣耀2以及Ascend D2上面。其16核GPU实际上就源于Vivante的GC2000。
二、移动GPU与桌面GPU
移动GPU相对桌面GPU只能算是小弟弟。移动GPU的劣势主要表现在理论性能和带宽。移动GPU受限于芯片的面积,能耗以及成本所以必须牺牲部分性能和带宽来求得性价比和电池续航力的平衡。与桌面GPU动辄256bit甚至512bit的位宽、1.2-1.5GHz的高频显存相比,移动GPU不仅要和CPU共享内存带宽,而且普遍使用的是双32bit位宽、LPDDR2-800或1066左右的内存系统,总带宽普遍在10GB/s以内。
在上图中移动处理器中内存带宽最高的是iPad 3/4,因为他们使用Retina屏幕,2048x1536的高分辨率对GPU带宽要求更高,不过就算是这两款产品,17GB/s的带宽与PC显卡上动辄200GB/s以上的带宽相比还是小儿科。没有高带宽就没有大容量纹理数据,也就不会有高画质。尽管带宽不是制约移动GPU发展的唯一因素,但是在目前的限制下,移动GPU厂商关心的头等大事就是如何在尽可能小的带宽需求下提升GPU性能及画质,纹理压缩是一个方法,还有一种就是使用不同的渲染架构。目前在GPU领域主要有IMR、TBR及TBDR等三种主流架构。
三、移动GPU的模式
1、IMR模式
IMR(Immediate Mode Rendering)就如字面意思一样,提交的每个渲染命令都会立即开始执行,并且该渲染命令会在整条流水线中执行完毕后才开始执行下一个渲染命令。
这种模式的优点:
· GPU架构比TBR模式简单直接。
· 在一帧里面执行FBO操作时,不会因为需要清空缓冲的渲染指令而影响性能。
· 不用像TBR架构一样需要片上高速缓存来保存中间结果。
· 不用像TBR架构一样缓存Triangle List,因此在有大量顶点运算的场景时比TBR有优势。例如PC上面的复杂模型可能有几百万个triangle。
这种模式的缺点就是:
· IMR的渲染会存在浪费带宽的情况。例如,当两次渲染有前后遮蔽关系时,IMR模式因为两次draw命令都要执行,因此会存在经过Pixel Shader后的Pixel被Depth test抛弃,这样就浪费了Shader Unit运算能力。不过幸运的是,目前几乎所有的IMR架构的GPU都会提供Early Z的判断方式,一般是在Rasterizer里面对图形的遮蔽关系进行判断,如果需要渲染的图形被遮挡住,那么就直接抛弃该图形而不需要执行Pixel Shader。
· IMR的另外一个缺点就是其渲染命令在执行需要随时读写frame buffer,depth buffer和stencil buffer,这带来大量的内存带宽消耗,在移动平台上面访问片外内存是最消耗电量和最耗时的操作。
因此在桌面GPU领域,TBR节省带宽和低性能不符合PC机的要求,IMR一统江湖。但是在移动GPU领域,TBR的低带宽消耗,低功耗正好满足移动设备需求,与其在PC端的待遇相反,移动设备领域TBR几乎一统江湖。
IMR模式的代表是NVIDIA的Tegra和Vivante的GC系列芯片。在此列出Vivante GC芯片的内部架构图,我们可以看到Vivante的GPU架构相当的简单。
2、TBR模式
与IMR简单粗暴的做法不同,TBR(Tile Based Rendering)它将需要渲染的画面分成一个个的矩形区块(tile),tile一般是4x4或者8x4的矩形块。模型的顶点经过Vertex Shader运算以后会组装成一个个的triangle,这些triangle会被缓存在一个triangle cache里面。如果某个triangle需要在某个tile里面绘制,那么就会在该tile的triangle list中存一个索引。等一帧里面所有的渲染命令都经执行完Vertex Shader生成triangle以后,每个tile就会有一个triangle list,这list就包含了需要在该tile内部绘制的所有triangle。然后GPU再基于triangle list执行每个tile的raster和Per-fragment operation。
TBR的优点是执行raster和Per-fragment operation时不需要反复的访问frame buffer,depth buffer,stencil buffer。这是因为GPU可以把整个tile的frame buffer/depth buffer/stencil buffer保存在一个片上的高速缓存中,这样GPU就直接访问tile,而不需要访问外部内存。这大大减少了内存的带宽消耗,也意味着能耗的降低。
TBR的缺点是:
需要保存Vertex Shader执行后的结果以及每个tile的triangle list。这意味着如果场景里面有很多的顶点,那么片上缓存就不可能存下这么多顶点信息和triangle list,就不得不依靠外部内存来存储,就会有额外的带宽消耗。不过庆幸的是当前的移动3D绘制都不会有太多的triangle的场景。一个复杂的模型也就1万多个triangle,因此一个通常的场景大概就是几十万triangle。随着移动游戏越来越复杂精美,模型的复杂程度也会快速上升,这也是TBR架构在未来将会面临的一大挑战。
如果在一帧里面有两遍及其以上的渲染,那么就需要使用Frame buffer object来缓存中间结果,这对TBR又是一大性能损耗。根据我们前面的讲解,TBR需要缓冲一帧所有的图元,所有图元执行完毕后才开始raster和Per-fragment operation。在这种情况下,一旦后面的draw命令需要使用到前面渲染生成的结果,那么就不得不在该命令执行前,要求GPU把缓存的所有draw命令都执行完毕,然后放弃当前缓存内容。在极端情况下,例如每次draw都需要读取前一次draw渲染的结果,那么TBR就会直接退化成IMR模式。
基于以上的缺点,我们可以看出在桌面GPU领域TBR没有任何优势,因此其完全退出桌面GPU市场。但是在移动GPU市场它更能适应性能/带宽/能耗三者的平衡。
TBR的代表有ARM的Mali和高通的Adreno。下图是Mali的架构图:
3、TBDR模式
TBDR(Tile Based Deferred Rendering,贴图延迟渲染)算是TBR的近亲,它跟TBR原理相似,但是通过HSR(Hidden Surface Removal,隐藏面消除)操作,在执行Pixel Shader之前进一步减少了不需要渲染的fragment,降低了带宽需求。在执行Pixel Shader之前,对Raster生成的每个像素都做depth test的比较,剔除被遮挡的像素,这就是HSR的原理。理论上经过HSR剔除以后,TBDR每帧需要渲染的像素上限就是屏幕像素的数量(没有考虑alpha blend的情况下)。而传统的TBR在执行复杂一点的游戏时可能需要渲染6倍于屏幕的像素。
TBDR是PowerVR的王牌,因为TBR和HSR带来的带宽与运算开销的降低,使得苹果手机的续航能力让人惊叹。下图是PowerVR的SGX系列的GPU架构图,可以看到其复杂程度大大超过Vivante这类IMR的架构。