本文作者为爱搞机特约作者、技术达人“炮神”@ioncannon。
本文将从移动GPU的结构、参数、兼容性、跑分几方面让读者全方位对移动GPU有一定的概念。由于篇幅较长,分成两部分介绍,这是第一部分,讲解的是移动GPU的结构和相关参数。
前言
现在移动设备的“核战”越来越激烈,已经从CPU引发到了GPU上,于是“16核”、“8管线”、“MP4”、“三角形生成率”和“填充率”等各种吸引眼球的宣传铺天盖地而来。一直很希望能有些文章来介绍科普下,但或许是专业人士都觉得这些太基础,最后忍不住,只能由我这个半桶水的非专业人士来写点啥了。本文参考和引用了网上的一些资料,篇幅有限恕不一一列举。内容尽可能的科普浅显,但限于个人的知识层次、理解能力和表达能力,如果有不确切或者错误的地方,还请多多指正。
基本的3D流水线
首先我们来简单的介绍下3D的画面是如何生成的,一个基本的3D流水线如下图所示:
首先,运行在CPU上游戏引擎根据游戏中的一些参数,产生一系列的图元,将它们的顶点数据发送给GPU。
第二步,顶点处理器(Vertex
但是,到这一步,画面还只是一些多边形,而实际显示在屏幕上的是一个个像素,这里就需要Rasterizer进行光栅化(Rasterization,3),从而将画面变成一个像素图。
第四步,对这些像素进行上色,Fragment
参数,究竟靠不靠谱?
终端厂商在宣传他们手机芯片的GPU如何强劲时,往往会提到一些参数,最常见的就是三角形生成率和填充率。但实际上,不同公司的GPU,他们的这些理论参数,并不具有直接的可比性。我们也可以发现,有些GPU可能给出的理论参数很高,但实际表现却很一般,甚至不如一些参数低的GPU。这是因为,各个GPU的供应商,比如IMGtec(PowerVR
比如三角形生成率,本身就受到很多测试因素的影响。例如,有些三角形在一开始就会被剔除掉(比如在屏幕外,或者太小了根本覆盖不到一个像素),不会被显示也不会需要执行太多的运算,那么这部分三角形到底应该算吗?如果算进去的话,三角形生成率自然就高了。或者,测试程序把一些已经计算好的坐标提交给GPU,那么GPU的Vertex
同样,填充率反映了GPU的像素输出能力。但是厂家给出的理论值,很多都是没有贴图,没有Shader计算,仅仅是生成无色点的能力,跟实际使用的情况有较大的差距。又比如Imagination
事实上三角形生成率和像素填充率作为衡量GPU性能的参数,在PC平台上,几年前就已经被淘汰了。由于从DX8开始,现代GPU都已经由可编程的Shader来代替固定功能的单元实现各种特效,所以Shader的计算能力成为很重要的一点,在移动平台也是一样的。
移动平台的特点和移动GPU的架构
不过呢,移动平台相比于PC平台,还是有很多不同的。从本质上看,是由功耗和体积两方面限制的,对于图形处理来说,主要是两点:
第一,是有限的带宽。实际上,要增加计算能力,在功耗允许的情况下,堆核心并不是一件难事,事实上我们也看到了不少SOC集成了四核乃至“16核”GPU。但是难点在于,需要有足够的带宽去满足这颗强大的GPU,避免其出现“饿死”的情况。在左图的移动平台中,CPU、GPU和总线被共同集成在一颗芯片上,称之为SOC。整个SOC,包括其中的CPU和GPU,共享有限的内存带宽。即使是相对高端的,采用64bit内存位宽的一些SOC,如三星4412,高通8064等,也只是6.4
第二,相比PC平台的CPU,移动平台的CPU浮点较弱,在Cortex-A9开始虽然有所好转,但64bit的NEON跟桌面128bit甚至256bit的SIMD还是有显著差距,外加主频的差别。因此更多的计算也依赖硬件Vertex
因此,移动平台的GPU相对于PC平台,也会有一些不同。我们回过头来看一下移动平台的GPU的一些架构。
首先是传统的IMR(Immediate
目前几乎所有的桌面GPU(nVIDIA,AMD)都是IMR架构,在移动领域,nVIDIA的GeForce
另一方面,由于IMR架构的GPU频繁的读写和修改帧缓存,因此对带宽的要求比较高,同时也增加了电力的消耗。
所以,大部分的移动GPU都采用TBR(Tile
ARM的Mali
当然,不同的GPU分块的大小也有所不同,PowerVR和Mali一般是16*16像素的块大小,而大部分的高通Adreno都带有256K的缓存,以256K作为块的大小进行渲染,高通称之为binning。
但是,除去PowerVR外的TBR
而PowerVR的不同之处在于,它采用的TBDR(Tile
相比TBR更进一步的是,TBDR在光栅化之后,有一个HSR(Hidden
说说被忽略的Shader
接下来我们回到Shader。Shader是GPU里负责计算的主要部分,同时占得面积最大,耗电也最多。当今的桌面GPU往往都不再谈三角形生成率,或是像素填充率了,给的指标都是Shader的计算能力——GFLOPS。可见,Shader性能会越来越重要。移动GPU也有着这样的趋势。我们看一下Anandtech测试的各款GPU的GLBenchmark的Egypt
先做一点铺垫:
首先,对于浮点数做一次加法或者乘法,都算是一次操作,记作1
在移动平台的OpenGL
对于Adreno和GC系列,无论何种选择何种精度,都会按照FP32精度进行计算。而Mali-400和Tegra的ULP
其次,关于统一渲染架构(Unified
最后,由于顶点坐标(xyzw)和像素颜色(rgba)都具有四个属性,为了提高效率,Shader往往被设计成Vec4的SIMD,也就是可以对四个数据进行打包,然后用一条指令同样的处理。当然如果数据少于四个,计算能力就被浪费了。也有设计成一次只能处理一个数据的标量(scalar)单元。
各家GPU的Shader组成
1.
Adreno系列为统一渲染架构,shader
一个Adreno的Shader单元,每周期可提供的浮点操作数为4×2
主流Adreno GPU运算能力:
Adreno
Adreno
Adreno
Adreno
Adreno
以上都是FP32的计算能力,由于OPENGL
2.
2.1
包括SGX530/531/535/540/545,其Shader计算单元为USSE。USSE一个周期,可以对4个FX10(10bit的定点数,比FP16精度更低)
主流SGX5 GPU运算能力:
SGX530,
MTK的SGX531,2USSE,300MHz,2USSE,1.2~2.4
三星蜂鸟SGX540,4USSE,200MHz,1.6~3.2
OMAP4460,ATOM
不过在FP16下,也就是大多数游戏的Pixel
2.2
包括SGX543/544/554,和它们的各种多核版本。其Shader计算单元为USSE2。USSE2不像之前那样了,是个Vec4+scalar的架构,单周期支持4个FP32的MAD操作,外加一个简单的scalar操作(ADD/MUL),这样跟Adreno一样,每周期
单个543/544包含4个USSE2,性能基本一样,544多一些DX的API支持。单个554则包含8个USSE2。
主流SGX5XT GPU运算能力:
iPhone
OMAP4470里的单个544,384MHz,4USSE2,跟上面类似
全志A31里的544MP2,所谓的8管线就是8USSE2,300MHz,也有21.6
iPad3里的A5X,543MP4,16USSE2,250MHz,36
iPad4的A6X,554MP4,32USSE2,280MHz,就突破80
在运算较低精度的FP16时,USSE2的性能还能有一定的提升。
3.
3.1
Mali-400并非Unified
一个顶点处理器包含一个Vertex
一个像素处理器包含一个Vec4的Pixel
主流Mali GPU运算能力:
一个Mali-400“单核”,400MHz下,计算能力为6.4
Exynos
Galaxy
Note2的Mali-400
当然这些都是FP16……
3.2
T6xx采用新架构,Shader为统一渲染架构。其中T604/624/628
每个ALU是个128bit
所以,单精度(FP32)性能为每周期9个,同USSE2。
那么Exynos
同样,因为游戏里用的多的Pixel
那么Exynos
4.
GeForce
“8核”Tegra
“12核”Terga3,4VS
5.
跟Adreno差不多,也是Vec4
RK29的GC800,
飞思卡尔i.MX6的GC2000,
海思K3V2的GC4000,8Vec4+1,480MHz,34.6
GPU“兼容性”
现在还有个经常被提到的是GPU的“兼容性”问题,这里就要涉及到各个GPU支持的纹理格式了。
首先是ETC1,这个是OPENGL
而PVRTC是PowerVR自家的纹理格式,同样ATITC是高通Adreno的纹理格式,此外S3TC就是桌面很常见的DXT,微软DirectX
PowerVR
当然,纹理的支持度只是兼容性的一方面,并不是兼容性问题的全部。
各家的“多核”
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
而游戏是给人玩的,终端厂商或是SOC厂商可以跟游戏厂商合作,针对GPU的特点进行相应的优化。不同GPU侧重很不一样,比如Mali-400,三角形很弱,像素部分,填充率强。高通Adreno
最后,GPU的跑分在一定程度上能反映GPU的实际性能,但最终在游戏中的表现还是很看厂商优化的。所以也不要一味的盯着跑分,多问问玩过的朋友,多看看实测,会更有帮助。