• 移动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的实际性能,但终于在游戏中的表现还是非常看厂商优化的。所以也不要一味的盯着跑分,多问问玩过的朋友,多看看实測。会更有帮助。

  • 相关阅读:
    【AT1219】歴史の研究(回滚莫队模板)
    【洛谷4245】【模板】任意模数多项式乘法
    同余与逆元
    线性推逆元
    大整数类型!
    浅谈扩展欧几里得定理(附裴蜀定理)
    二进制串题解(国际考试备用题)
    String 的成员函数
    关于快速幂
    string的赋值
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7019620.html
Copyright © 2020-2023  润新知