移动GPU全解读
Posted mfmdaoyou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动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的计算能力不easy被浪费。
最后,因为顶点坐标(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的实际性能,但终于在游戏中的表现还是非常看厂商优化的。所以也不要一味的盯着跑分,多问问玩过的朋友,多看看实測。会更有帮助。
以上是关于移动GPU全解读的主要内容,如果未能解决你的问题,请参考以下文章
2020.04.10 线上性能优化以及Linux下NIO/Epoll模型全解--实战
GitHub上这份《Android 移动安全知识技术全解》火了~