移动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的实际性能,但最终在游戏中的表现还是很看厂商优化的。所以也不要一味的盯着跑分,多问问玩过的朋友,多看看实测,会更有帮助。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。