【转自:http://tieba.baidu.com/p/1966590296?from=prin】
1. 都是测GPU的
2. 恩 确实比较奇怪,但也不奇怪shader的GFLOPS,反映了GPU的计算能力
桌面显卡,现在好多都拼GFLOPS。而移动GPU,标称三角形生成率和填充率,实际上是过时的算法。加上各家的三角形生成率和填充率的计算法则(或测试规范)并不一致,实际上不见得特别靠谱。
比如,PowerVR SGX(540/543),200MHz的真实填充率是400Mpix/s,但因为PVR特有的TBDR技术(下文说),可以不渲染被遮挡的部分,所以减轻了工作量,IMGtec按照2.5X的系数算,认为等效1000Mpix/s,所以标称为1Gpix/s的填充率
而其他家的最大填充率,也只是生成“无色点”的能力,例如Mali-400 MP4,275MHz下1.1G的填充率,是指输出1.1G的无色点。实际应用中,大家不可能都去玩无色点的,肯定有shader的渲染计算,以及纹理贴图,此时,是绝对达不到标称值的。
而实际的表现,又会跟很多因素相关。
3.1 Vec4如果遇到非4个一组的操作,比如x.rgb + y.rgb这种Vec3的计算,那么一部分性能就相当于浪费了
如果碰到scalar(标量)的计算,比如p.r + q.r,那么浪费的更多
有时候将vec4设计成vec3+1的结构,那么上述的2个计算可以在一个周期内完成,也就是所谓的co-issue(双发射)
3.2 计算精度问题
最常见的,是FP32,32bit的单精度
更高的,有FP64,64bit的双精度,不过图像处理一般用不到,把GPU当科学计算工具使才会用到吧。。。
严格的说,只有FP32和FP64的操作,才能算FLOPS
不过在图形计算中,还有更低精度的,如
FP16,16bit,半精度
FX10,10bit,都不是浮点,而是定点数了
3.3 各家的GPU的shader支持的计算精度
3.3.1 PowerVR SGX系列
USSE:SGX530/535/540用的,结构就像上面说的,是vec4,也就是4-wide SIMD
(实际上好像是vec4+scalar,只是后面的scalar单元用于一些特殊函数的计算,比如三角函数啊,对数啊,并且scalar和vec4不能并发,所以一般只算前面vec4的计算能力了)
USSE一个周期,可以对
4个FX10 或者 2个FP16 或者 1个FP32 进行MADD操作
所以,一个USSE单元,工作在200MHz下时,其GFLOPS为
4×200×2 = 1.6GFLOPS
一个SGX540含有4个USSE,那么200MHz的SGX540(蜂鸟),其计算性能为6.4GFLOPS
但严格的说,这并不确切,因为这是按照FX10精度计算的。
如果是FP32精度,那么要除以4,只剩下1.6GFLOPS了。
不过无所谓,如果游戏里,设置为低精度,按照FX10渲染,那么SGX540就牛b轰轰的了(降低精度你也不见得能看出啥,没记错的话,DX8就是FX10精度的,8.1到FX12,DX9开始要求FP24)
所以:SGX530/535 2USSE
SGX540 4USSE 大家自己算吧
-----
USSE2: SGX543/544
USSE2做了一些改进,号称能co-issue,但我并不清楚这个co-issue跟我3.1里说的是否一样。有资料称USSE2的GFLOPS性能是USSE的2倍。IMGtec官方称在侧重shader计算的测试里,采用USSE2GPU能比采用USSE的GPU快40%。
同样,USSE2对应的高/中/低精度为 FP32/FP16/FX10
按照FX10算,200MHz的USSE2,计算能力为3.2GFLOPS
FP16则为1/2, FP32则为1/4
单个543/544含有4个USSE2
所以,一个200MHz的543MP2,FX10计算能力为2×12.8GFLOPS=25.6GFLOPS
3.3.2 喜闻乐见的Adreno系列
类似于PowerVR SGX,其单个计算单元,同样采用vec4+1的架构,当然那1个也是拿来做specialfunction的貌似,所以算前面的vec4,能力是一样的。
但不同的是,Adreno系列只支持FP32计算,即高/中/低精度,全部用FP32精度进行计算,所以可以说,计算能力是实打实的GFLOPS吧。
Adreno 200, 2Vec4 + 1TMU, 133MHz,2.1GFLOPS
Adreno 205, 4Vec4 + 1TMU, 266MHz,8.5GFLOPS
Adreno 220, 8Vec4 + 2TMU, 266MHz,17GFLOPS
Adreno 225, 8Vec4 + 2TMU, 400MHz,25.6GFLOPS
Adreno 320, 目测16vec4 + 4TMU, 如果500MHz的话,就是51GFLOPS
3.3.3 Vivante的GC系列
跟Adreno差不多,也是vec4 SIMD,同样只支持FP32精度
不过Vivante这货的特点是跑高频。。。所以他们一直鼓吹同样的性能,面积最小
所以
RK29的GC800, 1Vec4, 450MHz,3.6GFLOPS
飞思卡尔i.MX6的GC2000, 4Vec4,~600MHz,19.2GFLOPS
华为海思K3V2,GC4000+(或者叫GC6000?),8Vec4,680MHz, 43.5GFLOPS
3.3.4 Mali系列
因为T系列还没产品上市。。。所以说说Mali-400吧
Mali-400并非Unified Shader,是顶点和像素处理分开的
一个顶点处理器包含一个Vertex shader ,vec4,支持FP32精度
一个像素处理器包含一个vec4的pixel shader,以及一个TMU, shader支持FP16精度
所以,一个Mali-400“单核”,400MHz下,计算能力为6.4GFLOPS
如果是MP4,266MHz,则为10.6GFLOPS
MP4, 400MHz,则为16GFLOPS
3.3.5 GeForce ULP
GeForce ULP的vertex shader和pixel shader都是scalar的,并非vec4
顶点支持FP32精度,像素部分支持FP20和FX10精度
所以,“8核”tegra 2, 300MHz,计算能力为4.8GFLOPS
“12核”Terga3, 600MHz,计算能力为14.4GFLOPS
之后说一下,GPU架构 和 纹理格式
4.1 架构,或者说是渲染模式
4.1.1 Imgtec,PowerVR系列,TBDR(TileBasedDeferred Rendering)
特点: 分块,把画面分成小块,这样可以在片上的高速缓存里处理
HSR(Hidden Surface Removal),有专有的硬件单元,在筛掉图像中被遮挡的部分后,才进行光栅化,这样被遮挡的部分就不用被渲染了。节省了计算资源(shader)和带宽(纹理拾取)。
看着非常雕的样子,确实很牛x,imgtec认为能提供等效2.5X的能力(一般按照3的overdraw算到话。。。其实想想也是,场景中被遮挡的看不到的部分太多了。。)不过场景非常复杂时,就容易撑爆管线或者cache,就sb掉了,另外做alphatest的代价也很大(碰到一堆半透明的玩意就哭了,测试代价很大)
不过现在的PowerVR都太牛x了,貌似还没被撑爆过。。。(或者说高压力下会悲剧?谁拿个SGX530跑1080p Glbenchmark 2.5试试?)
4.1.2 Mali/ Adreno, Tiled Based Rendering
这俩也是分块渲染的,同样把画面切成小块,丢到片上高速存储里渲染,不同的是没有HSR功能
不过,还是支持些early-z的测试,减少overdraw(具体我就说不清了,自己还没吃透)
但区别是,Mali和SGX的“块”比较小,一般是16×16这样的
而Adreno的“块”很大。。。以256K为单位,确切的说,大部分的Adreno都带有256K的缓存,画面以这个大小为单位进行渲染
就像上下这两种区别:
不过,新一代的Adreno 3xx,除去tiled渲染,也开始支持传统的渲染方式(IMR,见下)
4.1.3 IMR,immediate mode rendering,或者说是传统的渲染方式
主要是Tegra的GeForce ULP和Vivante的GC系列了
桌面显卡也基本采用这种模式…… 大概就是抓的啥渲染啥了。。。orz……
不过还是会做Z-culling,不过和SGX的deffered rendering还是有区别的(具体。。太专业了)
貌似Adreno的这种大块渲染,比较脆弱,容易sb掉(到底是为什么我也不知道。。。传说的)
所以Adreno 3xx开始增加IMR模式的支持了。
5. 纹理格式
5.1 ETC1
OPENGL ES2.0的支持纹理格式,大家都得支持。但是这个不太给力,竟然不支持alpha通道,所以如果要有alpha通道的纹理,就要读取2次:第一次读rgb,第二次读alpha…… 这样带宽占用就2倍了去:
但偏偏Mali-400这货只支持ETC1,如果为了通用,让SGX/Adreno/GeForce跟着Mali一起读两次,可是大大吃亏了
Mali-400 MP4: 反正哥有4个TMU,给哥充足的带宽,多读就多读吧!
Adreno 220:一堆shader+2个TMU的,压力巨大。。
SGX543:虽然2个TMU,不过哥有defferred rendering,看不到的地方可以不渲染不读纹理。。。
所以GL ES 3.0开始推ETC2了,支持alpha通道,貌似压缩比也牛b了不少
5.2 PVRTC(powerVR的) ATC(Adreno的),都支持alpha通道,读一次就够了,压缩比也不错。遇到自家格式,SGX和Adreno自然会很爽。
5.3 DXT(1/2/3/4/5),DirectX的纹理格式,GeForce ULP,Vivante GC,和ZMS 支持
也支持alpha通道。
--
不过实际上呢,对于纹理的处理,不同的GPU也不太一样
比如PvowerVR,对于一个tile里同样的纹理,只要读一次就可以了
而Mali就需要用几次读几次
这方面又会导致带宽消耗的差别
所以总的来说,不同的GPU有不同的侧重点
比如PowerVR,特别的TBDR架构,不渲染被遮挡的部分,有效节省计算资源和带宽
但是说在32bit计算精度下的绝对性能呢,其实并不高
如果跑FX10的低精度渲染,就很吃香
Adreno呢,shader资源丰富,计算能力强劲,但是只有2个可怜的TMU,纹理拾取的能力不够,而且架构上说是不是很健康。。。驱动也渣渣
Mali呢,不是统一渲染架构,计算能力也一般,但TMU多,4个,跟543MP2一样了,贴起图来应该嗷嗷的
最后呢,如果大量的shader计算,shader成为瓶颈的时候,adreno就突出了。而遇到大量贴图的时候,Mali可能吃香点。当然SGX什么的,各种情况下适应能力都挺强。。。要么来个复杂场景+强制FP32精度渲染。。。
典型的比如创新Zii的Mandelmark,就是完全利用pixel shader做计算,并且强制高精度(FP32)
这时候Adreno 225都能快接近543MP4了(FP32)
而不支持FP32精度的Tegra和Mali,就会出现图案不正确
目测这个测试 K3V2也会碉堡
而Ziilabs自家的ZMS-40,靠着12个Vec8的高频ALU,58GFLOPS的计算能力,得分足足是543MP4的2倍。。。但实际跑GLbenchmark 2.1, 性能好像就540水平。。。。
所以shader的计算能力,跟实际的游戏表现,又是两回事了
最后呢,SGX,Adreno,Tegra,Mali,各家都有些优化工具,包括三角形的顶点按照什么顺序喂等等细节,都可以做优化……所以说到底还是靠“优化”啊
“神油”才是王道啊
http://tieba.baidu.com/p/1815909366?pn=1
http://tieba.baidu.com/p/1970934768?pn=1
iPad 4 GPU Performance Analyzed:PowerVR SGX 554MP4 Under the Hood
http://www.anandtech.com/show/6426/ipad-4-gpu-performance-analyzed-powervr-sgx-554mp4-under-the-hood