【编者按】:本文作者为爱搞机特约作者、技术达人“炮神”@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全解读(二)的更多相关文章

  1. jQuery.Callbacks 源码解读二

    一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...

  2. Xcode括号自动补全以及二次编译后不显示输入

    今天遇到了一个大坑,在使用栈来进行计算表达式的时候,发现输入括号就报错,以及二次编译后不显示. 测试了好久,经过无数次debug后. 二次编译不显示还是没搞明白,不过输入倒是没什么问题,就是不显示出来 ...

  3. Java NIO 粘包 拆包 (实战) - 史上最全解读

    疯狂创客圈 Java 聊天程序[ 亿级流量]实战系列之13 [博客园 总入口 ] 本文的源码工程:Netty 粘包/半包原理与拆包实战 源码 本实例是<Netty 粘包/半包原理与拆包实战> ...

  4. Netty 粘包 拆包 | 史上最全解读

    Netty 粘包/半包原理与拆包实战(史上最全) 疯狂创客圈 Java 聊天程序[ 亿级流量]实战系列之13 [博客园 总入口 ] 本文的源码工程:Netty 粘包/半包原理与拆包实战 源码 本实例是 ...

  5. 4K超清,2500万人在线,猫晚直播技术全解读

    摘要: 作为双11的必备节目,今年的猫晚通过优酷.浙江卫视.东方卫视进行了全程网络直播和电视直播,吸引了超过全球超过2.4亿人收看.猫晚期间,优酷基于阿里云最新的广播级高可靠直播方案,为近2500万的 ...

  6. 边缘控制平面Ambassador全解读

    Ambassador是由Datawire开源的一个API网关项目,主要在Kubernetes的容器编排框架中使用.Ambassador本质上是一个通过配置边缘/API来管理Envoy数据面板的控制面板 ...

  7. java多线程解读二(内存篇)

    线程的内存结构图 一.主内存与工作内存 1.Java内存模型的主要目标是定义程序中各个变量的访问规则.此处的变量与Java编程时所说的变量不一样,指包括了实例字段.静态字段和构成数组对象的元素,但是不 ...

  8. 通过trie树单词自动补全(二)

    经常使用iciba进行单词查询, 关于他的搜索建议是通过单词前缀做的索引, 所以自己想动手实现下, 当然如果借助mysql的话,一条sql语句就能实现, 网上查询了下trie正适合做这个,所以通过C语 ...

  9. mybatis源码解读(二)——构建Configuration对象

    Configuration 对象保存了所有mybatis的配置信息,主要包括: ①. mybatis-configuration.xml 基础配置文件 ②. mapper.xml 映射器配置文件 1. ...

随机推荐

  1. Linux LVM在线扩容

    环境: 虚拟化环境,SUSE Linux Enterprise Server 11sp3,直接把虚拟磁盘从100G改成150G. 现有的LVM是100G,/home 的LV需要再加50G. 步骤: f ...

  2. Python 生成器 Generator 和迭代器 Iterator

    #最近一周刚开始接触python,基本的语法,和使用特性和Java差别还是蛮大的. 今天接触到Python的迭代器和生成器有点不是很明白,所以搜索了先关资料整理了一些自己的理解和心得 简述(Profi ...

  3. BNUOJ 4049 四叉树

    四叉树 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Ma ...

  4. ECNUOJ 2143 端午节快乐

    端午节快乐 Time Limit:1000MS Memory Limit:65536KBTotal Submit:1720 Accepted:868 Description  有一段有趣的传说.公元前 ...

  5. CSS3绘制砖墙-没实用不论什么图片

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 在VPS上用Outline Manager 建立*** 增强版服务器

    在VPS上用Outline Manager 建立*** 增强版服务器 原文 https://free.com.tw/google-outline/ Outline 是Google Jigsaw的一款开 ...

  7. BZOJ2016: [Usaco2010 Feb]Chocolate Eating

    [传送门:BZOJ2016] 简要题意: 贝西收到了N 块巧克力,她会在接下来的D 天里吃掉这些巧克力,她想制定一个计划,让她每 天的快乐度都保持在较高的水品上. 在第一天刚开始的时候,贝西的快乐度为 ...

  8. P1824 进击的奶牛

    题目描述 Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000 ...

  9. iOS菜鸟成长笔记(1)——第一个iOS应用

    前言:阳光小强最近抽时间学习iOS开发,在学习过程中发现了很多有趣的东西也遇到了很多问题,为了在学习过程中能和大家交流,记录下学习的心得和学习成果,所以就有了这一个系列文章,希望这一系列文章能形成一个 ...

  10. 巧用Linux 架设TFTP Server备份路由器的配置文件

    本文首发<网管员世界>  转载本文站点: ChinaITLAB TFTP (普通文件传输协议或一般文件传输协议) 大家一定记得在2003年8月12日全球爆发冲击波(Worm.Blaster ...