移动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全解读(二)的更多相关文章
- jQuery.Callbacks 源码解读二
一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...
- Xcode括号自动补全以及二次编译后不显示输入
今天遇到了一个大坑,在使用栈来进行计算表达式的时候,发现输入括号就报错,以及二次编译后不显示. 测试了好久,经过无数次debug后. 二次编译不显示还是没搞明白,不过输入倒是没什么问题,就是不显示出来 ...
- Java NIO 粘包 拆包 (实战) - 史上最全解读
疯狂创客圈 Java 聊天程序[ 亿级流量]实战系列之13 [博客园 总入口 ] 本文的源码工程:Netty 粘包/半包原理与拆包实战 源码 本实例是<Netty 粘包/半包原理与拆包实战> ...
- Netty 粘包 拆包 | 史上最全解读
Netty 粘包/半包原理与拆包实战(史上最全) 疯狂创客圈 Java 聊天程序[ 亿级流量]实战系列之13 [博客园 总入口 ] 本文的源码工程:Netty 粘包/半包原理与拆包实战 源码 本实例是 ...
- 4K超清,2500万人在线,猫晚直播技术全解读
摘要: 作为双11的必备节目,今年的猫晚通过优酷.浙江卫视.东方卫视进行了全程网络直播和电视直播,吸引了超过全球超过2.4亿人收看.猫晚期间,优酷基于阿里云最新的广播级高可靠直播方案,为近2500万的 ...
- 边缘控制平面Ambassador全解读
Ambassador是由Datawire开源的一个API网关项目,主要在Kubernetes的容器编排框架中使用.Ambassador本质上是一个通过配置边缘/API来管理Envoy数据面板的控制面板 ...
- java多线程解读二(内存篇)
线程的内存结构图 一.主内存与工作内存 1.Java内存模型的主要目标是定义程序中各个变量的访问规则.此处的变量与Java编程时所说的变量不一样,指包括了实例字段.静态字段和构成数组对象的元素,但是不 ...
- 通过trie树单词自动补全(二)
经常使用iciba进行单词查询, 关于他的搜索建议是通过单词前缀做的索引, 所以自己想动手实现下, 当然如果借助mysql的话,一条sql语句就能实现, 网上查询了下trie正适合做这个,所以通过C语 ...
- mybatis源码解读(二)——构建Configuration对象
Configuration 对象保存了所有mybatis的配置信息,主要包括: ①. mybatis-configuration.xml 基础配置文件 ②. mapper.xml 映射器配置文件 1. ...
随机推荐
- [笔记-图论]Dijkstra
用于求正权有向图 上的 单源最短路 优化后时间复杂度O(mlogn) 模板 // Dijkstra // to get the minumum distance with no negtive way ...
- Python安装selenium启动浏览器
1:在Python运行火狐或谷歌的浏览器是需要下载相对应的驱动 例如:你想在Python中使用代码命令打开firefox的网页 如果没有安装驱动,直接运行的话会出下面的错误 所以我们要安装相对应的浏览 ...
- SpringMVC拓展
### 原生SpringMVC有如下缺陷 参数的JSON反序列化只支持@RequestBody注解,这意味着不能在controller方法中写多个参数,如下代码是不对的 public Map test ...
- hdu5336XYZ and Drops
题意:给出r*c的网格,有的网格为空.有的有水.再给出一个爆炸点,从这个点向四周爆出四个水滴,若碰到水则融为一体,若碰到其它水滴直接跑过去互不影响.每秒可跑一格,若水中水滴数量超过4则爆开.问T秒后网 ...
- 我持续推动Rust语言支持Windows XP系统
前言 Rust好像长期以来不支持Windows XP系统.有不少用户发帖提议官方支持XP,基本上都被Rust官方开发人员明白的拒绝了.他们的对话大致上是以这种形式開始和结束的(当中乙方代表官方及其拥趸 ...
- 维护的JSP站点数据丢失
两个月前换了份工作,然后接手了三台server.上面乱七八糟的网站和应用大把. 当中有维护一个瀚石苑:http://www.hanshiyuan.com/.三天两头的丢失数据. 都不知道怎么找回,好在 ...
- 6. 使用Axis开发WebService程序
转自:http://www.itkeyword.com/doc/7529577946427268306/Apache-Servlet-WebSOAPWebService 所谓Web Service就是 ...
- Sql Server通用分页存储过程
Sql Server2005通用分页存储过程 CREATE PROCEDURE [dbo].[Common_GetPagedList] ( @TableName nvarchar(100), --表名 ...
- Debian9.5 VNC Server远程桌面配置
VNC概述 VNC (Virtual Network Console)是虚拟网络控制台的缩写.VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在基于 ...
- Linux常用图片查看处理软件
1.Shotwell是一款轻量级的图片管理软件,GNOME桌面环境默认自带,您可以使用它来从数码相机中导入相片.shotwell允许用户对图片进行管理,并且提供了一些基本的编辑功能,您可以对图片进行剪 ...