移动GPU全解读(二)

【编者按】:本文作者为爱搞机特约作者、技术达人“炮神”@ioncannon

在上一篇移动GPU解读中,对移动GPU的架构、相关参数进行了介绍,本部分介绍的则是移动GPU的Shader、GPU兼容性、“多核”的真相以及跑分问题。

 

说说被忽略的Shader

接下来我们回到Shader。Shader是GPU里负责计算的主要部分,同时占得面积最大,耗电也最多。当今的桌面GPU往往都不再谈三角形生成率,或是像素填充率了,给的指标都是Shader的计算能力——GFLOPS。可见,Shader性能会越来越重要。移动GPU也有着这样的趋势。我们看一下Anandtech测试的各款GPU的GLBenchmark的Egypt HD 1080p Offscreen得分:

 右边的绿色数字是该GPU在FP16精度下大致的计算性能,单位为GFLOPS。可以看到除去个别的GPU,Egypt成绩跟Shader计算能力的相关性还是比较明显的。

 

先做一点铺垫:

首先,对于浮点数做一次加法或者乘法,都算是一次操作,记作1 FLOPS。浮点数是有一定的精度的,比如16bit的浮点数,精度就是FP16。再高一点的FP32就是32bit的浮点数,也就是常说的单精度;更高的就是64bit的双精度FP64了。一般来说,只有FP32和FP64的操作才能算是FLOPS。

在移动平台的OpenGL ES里,可以指定高、中、低三种不同的精度。对不同的GPU来说,高、中、低精度的实际值略有差别。如下图所示:

对于Adreno和GC系列,无论何种选择何种精度,都会按照FP32精度进行计算。而Mali-400和Tegra的ULP GeForce的Pixel Shader部分不支持高精度,最高只支持中等的FP16精度。绝大部分游戏的Pixel Shader计算都采用中等(FP16)的精度,而Vertex Shader的计算一般是FP32的精度。

其次,关于统一渲染架构(Unified Shader)和分离的渲染架构(Discrete Shader)。前者的Shader既能进行Vertex的计算,也能进行Pixel的计算,例如PowerVR,Adreno,GC系列。后者的Vertex Shader和Pixel Shader是分开的,典型的比如Mali-400和ULP GeForce。相对来说,统一渲染架构的Shader利用率会高些,在遇到三角形特别多像素特别少,或者相反的情况下,Shader的计算能力不容易被浪费。

最后,由于顶点坐标(xyzw)和像素颜色(rgba)都具有四个属性,为了提高效率,Shader往往被设计成Vec4的SIMD,也就是可以对四个数据进行打包,然后用一条指令同样的处理。当然如果数据少于四个,计算能力就被浪费了。也有设计成一次只能处理一个数据的标量(scalar)单元。

 

各家GPU的Shader组成

1. 高通Adreno系列

Adreno系列为统一渲染架构,shader ALU为典型的Vec4 + Scalar,Vec4每周期可以处理4个FP32的MAD运算(乘加运算,记为2 FLOPS),Scalar单元不能做MAD,所以,

一个Adreno的Shader单元,每周期可提供的浮点操作数为4×2 + 1= 9 FLOPS。

主流Adreno GPU运算能力:

Adreno 200, 2 Vec4+1, 133MHz,2.4GFLOPS

Adreno 205, 4 Vec4+1, 266MHz,9.5GFLOPS 

Adreno 220, 8 Vec4+1, 266MHz,19.1GFLOPS 

Adreno 225, 8 Vec4+1, 400MHz,28.8GFLOPS 

Adreno 320, 如果是16Vec4+1, 跑400MHz的话,就是57GFLOPS

以上都是FP32的计算能力,由于OPENGL ES里,高中低精度Adreno都是按照FP32跑,因此在低精度的情况下,也不能获得性能提升。

 

2. PowerVR SGX系列

2.1 旧的SGX5系列

包括SGX530/531/535/540/545,其Shader计算单元为USSE。USSE一个周期,可以对4个FX10(10bit的定点数,比FP16精度更低) 或者 2个FP16 或者 1个FP32 进行MADD操作。由于FP32才算是正常意义上的FLOPS,所以其性能每周期2 FLOPS。但是当两个FP32的操作共享一个操作数时,USSE也可以在一个周期里处理,此时就是2个FP32的MAD操作,4 FLOPS。所以,USSE的FP32性能,每周期为2~4 FLOPS。

主流SGX5 GPU运算能力:

SGX530, 2USSE,200MHz,0.8~1.6 GFLOPS

MTK的SGX531,2USSE,300MHz,2USSE,1.2~2.4 GFLOPS

三星蜂鸟SGX540,4USSE,200MHz,1.6~3.2 GFLOPS

OMAP4460,ATOM Z2460的SGX540 400MHz, 4USSE,3.2~6.4 GFLOPS

不过在FP16下,也就是大多数游戏的Pixel Shader精度下,相比FP32的最差情况下就能翻倍了。同样在更低精度的FX10下,还能再翻倍。

 

2.2 SGX 5XT系列

包括SGX543/544/554,和它们的各种多核版本。其Shader计算单元为USSE2。USSE2不像之前那样了,是个Vec4+scalar的架构,单周期支持4个FP32的MAD操作,外加一个简单的scalar操作(ADD/MUL),这样跟Adreno一样,每周期 9 FLOPS。

单个543/544包含4个USSE2,性能基本一样,544多一些DX的API支持。单个554则包含8个USSE2。

主流SGX5XT GPU运算能力:

iPhone 4S里的543MP2,2×4=8个USSE2,200MHz,14.4 GFLOPS

OMAP4470里的单个544,384MHz,4USSE2,跟上面类似

全志A31里的544MP2,所谓的8管线就是8USSE2,300MHz,也有21.6 GFLOPS

iPad3里的A5X,543MP4,16USSE2,250MHz,36 GFLOPS

iPad4的A6X,554MP4,32USSE2,280MHz,就突破80 GFLOPS了


在运算较低精度的FP16时,USSE2的性能还能有一定的提升。

 

3. ARM Mali系列

3.1 Mali-400

Mali-400并非Unified Shader,是顶点和像素处理分开的

一个顶点处理器包含一个Vertex Shader ,Vec4,支持FP32精度

一个像素处理器包含一个Vec4的Pixel Shader,以及一个TMU, Shader支持FP16精度

主流Mali GPU运算能力:

一个Mali-400“单核”,400MHz下,计算能力为6.4 GFLOPS

Exynos 4210的Mali-400 MP4,266MHz,则为10.6 GFLOPS

Galaxy S3的Mali-400 MP4, 440MHz,则为17.6 GFLOPS

Note2的Mali-400 MP4,运行在533MHz,则为21 GFLOPS

当然这些都是FP16…… 因为Mali-400的Pixel Shader不支持FP32精度。

 

3.2 Mali-T6xx系列

T6xx采用新架构,Shader为统一渲染架构。其中T604/624/628 ,一个核心含有2个ALU,而T658/678,为强化计算型,一个core含有4个ALU。

 

每个ALU是个128bit wide的Vector Unit加上一个32bit的Scalar单元组成。

所以,单精度(FP32)性能为每周期9个,同USSE2。

那么Exynos 5250里533MHz的Mali-T604 四核,FP32的计算能力为 38.4 GFLOPS

同样,因为游戏里用的多的Pixel Shader是FP16精度,而T604的VU ALU此时处理能力能翻倍变成8个,这样每周期就是8*2 + 1 =17个。符合ARM宣称的500MHz下单个T604核心17GFLOPS,四核心68GFLOPS的数据。

那么Exynos 5250里533MHz的Mali-T604 四核,FP16的计算能力为 72.5 GFLOPS

 

4. GeForce ULP

GeForce ULP同Mali-400,是分离的Shader架构。其Vertex Shader和Pixel Shader都是Scalar的,并非Vec4。顶点支持FP32精度,像素部分支持FP20和FX10精度。所以,

“8核”Tegra 2, 4VS + 4PS,300MHz,计算能力为4.8 GFLOPS

“12核”Terga3,4VS + 8PS,520MHz,计算能力为12.5 GFLOPS 

 

5. Vivante的GC系列

跟Adreno差不多,也是Vec4 +1的结构,同样高中低精度都按照FP32计算,低精度下不会有提升。

RK29的GC800, 1Vec4+1, 450MHz,4 GFLOPS

飞思卡尔i.MX6的GC2000, 4Vec4+1,600MHz,21.6 GFLOPS

海思K3V2的GC4000,8Vec4+1,480MHz,34.6 GFLOPS

 

GPU“兼容性”

现在还有个经常被提到的是GPU的“兼容性”问题,这里就要涉及到各个GPU支持的纹理格式了。

首先是ETC1,这个是OPENGL ES 2.0支持的纹理格式,大家都得支持。但这个纹理的一个缺点是不支持alpha通道,所以对于有alpha通道的纹理,就要拆成2个纹理去读取,效率低,浪费了带宽。

而PVRTC是PowerVR自家的纹理格式,同样ATITC是高通Adreno的纹理格式,此外S3TC就是桌面很常见的DXT,微软DirectX 3D的纹理格式,这些都是支持alpha通道的。

PowerVR GPU支持自家的PVRTC和通用的ETC1(iOS下的PVR GPU只支持PVRTC),Adreno支持自家的ATITC和通用的ETC1,NV的GeForce和Vivante的GC系列支持DXT和ETC1,剩下Mali-400只支持ETC1。所以,对应不同的GPU,会有不同的游戏数据包。通用数据包,一般都会采用ETC1,虽然通用,但由于不支持alpha通道要贴图2次,对于非Mali的GPU其实都算是吃亏了。如果用自己支持的其他格式,就不用受这个苦了。对于贴图单元(TMU,Texture Mapping Unit)数目相对较少的Adreno 2xx系列,恐怕更是吃亏。

当然,纹理的支持度只是兼容性的一方面,并不是兼容性问题的全部。

 

各家的“多核”

GPU硬件的部分基本说完了,这里总结一个表格,同时给出了GPU厂商官方定义的一个“核”的内容,谁的核里料多,谁比较不厚道,应该也是一目了然了吧。面对各种“16核”“8管线”的宣传,大家也应该能比较清楚的辨别了吧。

 

跑分跟实际表现不一样?优化很重要!

最后,规格只是GPU的一个方面,实际表现跟架构也有很大的关系。更进一步的,就算是Benchmark中跑分差不多的GPU,在不同的游戏中,实际表现也会有差别。

首先,Benchmark程序,大部分都是公平的,所以本质上,Benchmark都是“零优化”程序,公平起见,他们的纹理会用RGBA的PNG,TGA,或者ETC1纹理,不会用到各个GPU自家的格式。

但是游戏不一样,游戏可以做相应的优化。例如PVR的GPU,可以用4bpp甚至2bpp的PVRTC纹理,相比于未压缩的贴图就可以节省8倍甚至16倍的带宽。而没有被优化到的情况下,可能只能跟着Mali用不支持alpha通道的ETC1,做2次贴图,浪费带宽。部分厂商甚至在通用数据包里放了一些未压缩贴图,那差距就更大了。同款游戏,跑分接近的GPU,iOS上的特效更好,流畅度更佳,就有优化的原因。

其次,Benchmark在一定程度上都是相对超前的。大部分GPU跑Benchmark的帧率,都不会到流畅的级别(要是满帧了还怎么测出区别)。早期的Benchmark可能更加侧重贴图和像素部分。新一代的Benchmark则提升了场景复杂度,对多边形和Shader计算的压力进一步增大,例如GLBenchmark 从2.1到2.5的提升。因此,一些三角形生成能力和原生Shader计算能力高的GPU,比如Adreno 220/225,得分提升就会比较明显。而Mali-400则在2.5中遇到三角形生成的瓶颈,得分表现不如之前。

而游戏是给人玩的,终端厂商或是SOC厂商可以跟游戏厂商合作,针对GPU的特点进行相应的优化。不同GPU侧重很不一样,比如Mali-400,三角形很弱,像素部分,填充率强。高通Adreno 2xx,Vivante的GPU,多边形很强,Shader计算强,但填充率较弱。如果场景对Mali优化,游戏商可以减少画面中多边形的量,用贴图和像素部分实现更多的特效。这样对Adreno 2xx系列不利。如果对Adreno优化,则可以增加场景复杂度,用更多的三角形进行更精细的建模,但这样对Mali则不利。这只是一方面,在一些细节上,还可以进行更深层次的优化,各家的GPU也都会提供相应的工具。

最后,GPU的跑分在一定程度上能反映GPU的实际性能,但最终在游戏中的表现还是很看厂商优化的。所以也不要一味的盯着跑分,多问问玩过的朋友,多看看实测,会更有帮助。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。