传统上,GPU的应用被局限于处理图形渲染计算任务。随着GPU可编程性的不断提高,利用GPU完成通用计算渐渐活跃起来。将GPU用于图形渲染以外领域的计算称为GPGPU(General-Purpose computing on Graphics Processing,基于GPU的通用计算)。GPGPU计算通常采用CPU+GPU异构模式,由CPU负责执行复杂逻辑处理和事务管理等不适合数据并行的计算,由GPU负责计算密集型的大规模数据并行计算。这种利用GPU强大处理能力和高带宽弥补CPU性能不足的计算方式在发掘了计算机潜在的性能,在成本和性价比方面有显著优势。
GPU计算拥有性价比高,性耗比高,设备易得的优势,在图像视频处理、石油勘探、分子动力学、信号处理、人工智能、数据挖掘、基因测序、密码学等领域得到了广泛应用。在移动计算中,Google在Android 4.2开始使用GPU加速renderscript进行图像处理和图像/视频压缩。Nvidia和ARM则分别使用GPU加速照相处理架构,代替部分ISP功能。
自2010年以来,移动设备GPU的性能快速提高,发展速度远远超过了摩尔定律。
进入2014年,市场上在销售的中高端处理器性能已经达到100GFlosp左右,并且已经发布和即将发布一批搭载Kepler,Mali-T760 MP16等理论性能超过300GFlops GPU的处理器。预计到2015年末,高端移动处理器的性能将达到1TFlops左右。
以下是2014Q1手机/平板常见移动处理器的CPU、GPU及处理能力:
SoC Model |
CPU Type |
CPU GFlops |
GPU Type |
GPU GFlops |
Qualcomm APQ8064AB (SnapDragon 600) |
4xKrait300 @1.9GHz |
60.8 |
Adreno320 (96ALU) |
97.2 |
Qualcomm APQ8974AB (SnapDragon 800) |
4xKrait400 @1.9GHz |
73.6 |
Adreno330 (128 ALU) |
158.4 |
Nvidia Tegra 4 |
4xcortex-A15 @1.9GHz |
60.8 |
GeforceULP x 72 |
96 |
AppleA6X |
2xApple [email protected] |
22.4 |
SGX554 MP4 |
76.8 |
AppleA7 |
2xApple [email protected] |
48 |
G6430 (4 Clusters) |
115.2 |
MTK MT6592 |
27.2 |
Mali-450 MP4 |
41.8 |
|
MTK MT8135 |
32 |
G6200
|
40 |
表 1 2014Q1市场常见移动处理器CPU/GPU性能
以下是2014Q1新发布处理器CPU、GPU及处理能力:
SoC Model |
CPU Type |
CPU GFlops |
GPU Type |
GPU GFlops |
MTK MT6595 |
80.8 |
Adreno330 (128 ALU) |
158.4 |
|
Intel Z3580 |
N/A |
PowerVR G6430 |
136 |
|
Tegra K1 Quad A15 |
73.6 |
Kepler |
364.8 |
表 2 2014Q1新发布处理器CPU/GPU性能
从表一、表二可以看到,即使以NEON向量处理器计算理论性能,同一SoC上的GPU性能也要超过CPU。而且GPU和CPU的性能差距在高端和较新的处理器上更加明显。事实上,GPU与CPU的处理能力差距比理论峰值还要更大:
目前的ARM架构移动处理器主要通过NEON SIMD指令或者VFP指令集进行浮点运算。在进行相同的操作时,VFP的吞吐量只有NEON的大约四分之一。标准Android操作系统的dalvik虚拟机不支持生成Neon指令,在运行Java时只能使用VFP指令。即使通过NDK或者JNI,如果要调用数学函数或者除法等较为复杂的处理,也需要使用VFP指令集。而GPU的执行单元可以直接执行数学函数,甚至有专门的硬件单元进行超越函数运算。而且,在进行图形/图象处理时,GPU除了运算单元外,纹理采样单元也可以进行一些运算。
GPU的缺点在于执行单元在运行条件指令时,某些情况下需要的时间是几个分支之和,而不是一个分支所需要的时间。另外,只有存在大量数据并行计算时,才能完全发挥GPU性能。因此GPU适合进行分支较少、线程间通信较少的大规模数据并行任务。
目前移动GPU主要厂商有:Imagination Technologies、 Qualcomm、ARM、 NVIDIA、 Vivante、Intel。其市场占有率如下表所示:
|
1H’12 |
1H’13 |
Qualcomm |
29.3% |
32.3% |
NVIDIA |
4.9% |
1.4% |
ARM IP |
13.5% |
18.4% |
DMP IP |
0.0% |
0.5% |
Imagination Technologies IP |
52.0% |
37.6% |
Vivante IP |
0.3% |
9.8% |
Total |
100.0% |
100.0% |
表 3 2013年上半年与2012年上半年移动GPU市场占有率
表1中:DMP IP仅见于任天堂3DS游戏机,不在本文讨论之列。2013上半年Intel尚未推出采用自有HD Graphics架构的处理器。
Imagination Technologies的PowerVR系列GPU的IP授权伙伴包括Intel、苹果、联发科、LG、高通、瑞萨、三星、海思、Marvell、索尼、华为等公司。目前使用Power VR系列的移动处理器主要是苹果全系列,三星和intel部分产品。
GPU Name |
Chip |
Clock |
GFlops |
SGX530 |
OMAP 3530 |
110 MHz |
0.88 |
DM3730 |
200 MHz |
1.6 |
|
--- |
300 MHz |
2.4 |
|
|
|
|
|
SGX531 |
MT6513 MT6573 MT6575M |
281 MHz |
2.25 |
SGX531 Ultra |
MT6515 MT6575 MT6517 MT6517T MT6577 MT6577T MT8317 MT8317T |
522 MHz |
4.2 |
|
|
|
|
SGX535 |
Apple A4 |
200 MHz |
1.6 |
Apple A4 (iPad) |
250 MHz |
2.0 |
|
--- |
300MHz |
2.4 |
|
|
|
|
|
SGX540 |
Exynos 3110 |
200 MHz |
3.2 |
OMAP 4430 |
307 MHz |
4.9 |
|
OMAP 4460 |
384 MHz |
6.1 |
|
Atom Z2420 |
400 MHz |
6.4 |
|
ATM7021a RK3168 |
500 MHz |
8.0 |
|
|
|
|
|
SGX543 |
--- |
200 MHz |
7.2 |
SGX543 MP2 |
Apple A5 Apple A5 (iPad2) |
200 MHz 250 MHz |
14.4 18.0 |
SGX543 MP3 |
Apple A6 |
250 MHz |
27.0 |
SGX543 MP4 |
Apple A5X |
250 MHZ |
36.0 |
|
|
|
|
SGX544 |
MT6589M MT8121 |
156 MHz |
4.9 |
MT6589 MT8389 |
286 MHz |
9.2 |
|
MT8125 |
300 MHz |
9.6 |
|
MT6589T MT8389T |
357 MHz |
11.4 |
|
OMAP 4470 |
384 MHz |
12.3 |
|
SGX544 MP2 |
Atom Z2520 |
300 MHZ |
19.2 |
Allwinner A31 Allwinner A31s |
350 MHZ |
22.4 |
|
Atom Z2560 |
400 MHz |
25.6 |
|
ATM7039 |
450 MHz |
28.8 |
|
Atom Z2580 |
533 MHz |
34.1 |
|
SGX544 MP3 |
Exynos 5410 |
533 MHz |
51.1 |
|
|
|
|
SGX545 |
--- |
300 MHz |
4.8 |
SGX545 |
Atom Z2460 Atom Z2760 |
533MHz |
8.5 |
|
|
|
|
SGX554 |
--- |
300 MHz |
19.2 |
SGX554 MP2 |
--- |
300 MHz |
38.4 |
SGX554 MP4 |
Apple A6X |
300 MHz |
76.8 |
|
|
|
|
G6100 (1 Clusters) |
--- |
300 MHz |
19.2 |
G6200 (2 Clusters) |
--- |
300 MHz |
38.4 |
MT8135 |
??? MHz |
??? |
|
--- |
500 MHz |
64.0 |
|
G6230 (2 Clusters) |
--- |
300 MHz |
38.4 |
G6400 (4 Clusters) |
--- |
300 MHz |
76.8 |
G6430 (4 Clusters) |
--- |
300 MHz |
76.8 |
Apple A7 Apple A7 (iPad Air) |
450 MHz |
115.2 |
|
--- |
560 MHz |
143.4 |
|
G6630 (6 Clusters) |
--- |
300 MHz |
115.4 |
--- |
450 MHz |
173.0 |
|
--- |
650 MHz |
250 |
Qualcomm的Adreno系列GPU仅被用于Qualcomm的SnapDragon系列处理器。
GPU Name |
Chip |
Clock |
GFlops |
Adreno130 |
MSM7x01 MSM7x01A |
133 MHz |
1.2 |
|
|
|
|
Adreno200 |
MSM7225 MSM7625 MSM7227 MSM7627 QSD8250 QSD8650 (Snapdragon S1) |
133 MHz |
2.1 |
MSM7225A MSM7625A (Snapdragon S1) |
200 MHz |
3.2 |
|
MSM7227A MSM7627A (Snapdragon S1) |
245 MHz |
3.92 |
|
|
|
|
|
Adreno203 |
MSM8225 MSM8625 (Snapdragon S4 Play) MSM8225Q MSM8625Q (Snapdragon 200) |
245 MHz |
7.84 |
|
|
|
|
Adreno205 |
MSM7230 MSM7630 MSM8255 MSM8655 APQ8055 (Snapdragon S2) |
266 MHz |
8.5 |
|
|
|
|
Adreno220 |
MSM8260 MSM8660 APQ8060 (Snapdragon S3) |
266MHz |
17 |
|
|
|
|
Adreno225 |
MSM8260A APQ8060A (Snapdragon S4 Plus) |
200 MHz |
12.8 |
MSM8660A (Snapdragon S4 Plus) |
300 MHz |
19.2 |
|
MSM8960 (Snapdragon S4 Plus) |
400 MHz |
25.6 |
|
|
|
|
|
Adreno305 |
MSM8227 MSM8627 (Snapdragon S4 Plus) MSM8226 MSM8626 MSM8230 MSM8630 MSM8930 MSM8030AB MSM8230AB MSM8630AB MSM8930AB (Snapdragon 400) |
400 MHz |
19.2 |
MSM8228 MSM8928 (Snapdragon 400) |
450 MHz |
21.6 |
|
--- |
--- |
--- |
|
|
|
|
|
Adreno306 |
MSM8916 (Snapdragon 410) |
??? MHz |
??? |
|
|
|
|
Adreno320 (64 ALU) |
MSM8960T APQ8064 APQ8064 1AA (Snapdragon S4 Pro) MPQ8064 (Snapdragon S4 Prime) |
400 MHZ |
57 |
Adreno320 (96 ALU) |
APQ8064T (Snapdragon 600) |
400 MHz |
86.4 |
APQ8064AB (Snapdragon 600) |
450 MHz |
97.2 |
|
|
|
|
|
Adreno330 (128 ALU) |
MSM8974 APQ8074 (Snapdragon 800) |
450 MHz |
129.6 |
MSM8274AB MSM8974AB MSM8974AC (Snapdragon 800) |
550 MHz |
158.4 |
|
|
--- |
--- |
|
|
|
|
|
Adreno420 |
APQ8084 (Snapdragon 805) |
500 MHz |
??? |
ARM的mali系列GPU以IP授权的方式见于联发科、三星、海思、全志、瑞芯微、展讯、华为等公司的处理器中。
GPU Name |
Chip |
Clock |
GFlops |
Mali-400 |
--- |
200 MHz |
2 |
AML8726-M3 |
250 MHz |
2.25 |
|
ST-E U8500 |
275 MHz |
2.48 |
|
SC7710 SC8810 Allwinner A10 Allwinner A10s Allwinner A13 |
300 MHz |
2.7 |
|
ST-E U8520 Rk2926 RK2928 MT6290 MT8638T MT6572M |
400 MHz |
3.6 |
|
MT6572 MT8312 MT8382 |
500 MHz |
4.5 |
|
--- |
533 MHz |
4.8 |
|
Mali-400 MP2 |
LC1810 |
300 MHz |
5.4 |
SC6825 SC8825 Allwinner A20 Allwinner A23 |
350 MHz |
6.3 |
|
SC7730 SC8830 MT6582M AML8726-MX AML8726-MXS AML8726-MXL NS115 |
400 MHz |
7.2 |
|
MT6582 |
500 MHz |
9.0 |
|
Mali-400 MP4 |
RK3066 Exynos 4210 |
266 MHz |
9.6 |
SC7735s SC8735s SC8835s Exynos 4212 |
400 MHz |
14.4 |
|
Exynos 4412 |
440 MHz |
15.84 |
|
Exynos 4412 RK3188 |
533 MHz |
19.2 |
|
|
|
|
|
Mali-450 |
--- |
375 MHz |
5.6 |
Mali-450 MP4 |
AML8726-M803 AML8726-M805 |
500 MHz |
29.8 |
MT6588 |
600 MHz |
35.8 |
|
MT6592 MT8392 V9R1 |
700 MHz |
41.8 |
|
Mali-450 MP6 |
AML8726-M801 AML8726-M802 AML8726-S802 |
600 MHz |
53.8 |
Mali-450 MP8 |
--- |
600 MHz |
71.7 |
|
|
|
|
Mali-T720 |
--- |
600 MHz |
10.2 |
Mali-T720 MP8 |
--- |
600 MHz |
81.6 |
|
|
|
|
Mali-T604 |
--- |
500 MHz |
17 |
Mali-T604 MP2 |
Exynos 5250 |
500 MHz |
34 |
Mali-T604 MP4 |
--- |
600 MHz |
81.6 |
|
|
|
|
Mali-T628 |
--- |
533 MHz |
17.06 |
Mali-T628 MP6 |
Exynos 5420 |
533 MHz |
102.4 |
|
|
|
|
Mali-T760 |
--- |
600 MHz |
20.4 |
Mali-T760 MP4 |
RK3288 |
600 MHz |
81.6 |
Mali-T760 MP16 |
--- |
600 MHZ |
326.4 |
NVIDIA早期推出过Gofroce系列移动GPU,目前已被Tegra系列处理器取代。Tegra1至Tegra4系列使用的是Geforce ULP GPU。Tegra K1则采用了与同时期主流桌面平台相同的Kepler架构GPU。NVIDIA 移动GPU除用于NVIDIA Tegra系列处理器外,也向ARM厂商开放Kepler GPU授权。
GPU Name |
Chip |
Clock |
GFlops |
GeforceULP x 8 |
Tegra 2 (AP20H) |
300 MHz |
4.8 |
Tegra 2 (T20) |
333 MHz |
5.6 |
|
Tegra 2 (AP25、T25) |
400 MHz |
6.7 |
|
|
|
|
|
GeforceULP x 12 |
Tegra 3 (T30L、AP33) |
416 MHz |
10 |
Tegra 3 |
450 MHz |
10.8 |
|
Tegra 3 (T30、T33、AP37) |
520 MHz |
12.5 |
|
|
|
|
|
GeforceULP x 60 |
Tegra 4i |
660 MHz |
79.2 |
|
|
|
|
GeforceULP x 72 |
Tegra 4 |
672 MHz |
96.8 |
|
|
|
|
KeplerCores x 192 |
Tegra K-1 |
950 MHz |
365 |
Vivante GPU以IP授权方式见于华为海思K3V2处理器。
GPU Name |
Chip |
Clock |
GFlops |
GC530 |
PXA920 |
315 MHz |
0.96 |
|
|
|
|
GC800 |
--- |
450 MHz |
3.6 |
GC800 |
RK2918 |
575 MHz |
4.6 |
|
|
|
|
GC1000 |
PXA986 PXA988 PXA1088 |
600 MHz |
9.6 |
GC1000 Plus |
ATM7029 |
630 MHz |
10.1 |
|
|
|
|
GC2000 |
i.MAX6 |
600 MHz |
19.2 |
|
|
|
|
GC4000 |
K3V2 |
480 MHz |
30.7 |
GC4000 |
--- |
680 MHz |
43.5 |
|
|
|
|
GC6400 |
--- |
800 MHz |
128 |
GC7000 |
--- |
--- |
--- |
GC8000 |
--- |
--- |
--- |
|
|
|
|
VideoCore1 |
VC01 |
--- |
--- |
VideoCore2 |
BCM2702 BCM2705 BCM2722 BCM2724 |
--- |
--- |
VideoCore3 |
BCM2727 BCM11181 |
--- |
--- |
VideoCore4 |
BCM2763 BCM2820 BCM2835 BCM11182 BCM11311 BCM21533 BCM21654 BCM21663 BCM21664 BCM21664T BCM28145 BCM28150 BCM28155 BCM23550 |
250 MHz |
24 |
Intel自Bay Trail 架构Atom开始使用与桌面CPU相同架构的HD Graphics GPU。
Name |
type |
EUs |
Clock(MHz) |
GFlops |
HD Graphics (22nm Bay trail Atom) |
Gen 7 |
4 |
667 |
42.7 |
|
|
|
|
|
HD Graphics (14nm Cherry trail Atom) |
Gen 8 |
16 |
??? |
??? |
下表是同样使用Kepler架构的Tegra K1移动处理器和高端桌面显卡Geforce Titan Black、入门桌面显卡GT650,以及同样适用Intel第七代图形架构的的Bay Trail架构Atom Z3770与Haswell架构Core i7-4770R、Core i3-4330T的对比:
|
CPU GFlops |
GPU GFlops |
GPU BandWidth(GB/s) |
TDP(W) |
Tegra K1 Quad A15 |
73.6 |
364.8 |
17 |
5 |
Geforce GTX Titan Black |
N/A |
5000 |
336.4 |
250 |
GeForce GTX 650 |
N/A |
812.54 |
80 |
64 |
Atom Z3770 |
70.08 |
44.03 |
17.1 |
<4 |
Core i3-4330T |
192 |
368 |
25.6 |
35 |
Core i7-4770R |
409.6 |
832 |
25.6 |
65 |
表 4 使用相同GPU架构的桌面与移动处理器对比
注意本表中表中所列TDP (Thermal Design Power,热设计功耗)数据取厂商标称数据,即移动处理器/桌面处理器的典型频率或典型应用场景下全芯片数据,或独立显卡的典型频率下数据。表中所列GFlops为单精度,取典型频率下数据。
由表可见,移动GPU具有以下几个特点:
1. 处理能力较弱。桌面GPU和CPU受芯片面积和TDP限制较小,执行单元数量和频率超过移动处理器。高端移动处理器的GPU处理能力接近中低端集成GPU的水平。
2. 带宽较小。独立GPU拥有独立于内存的显存,可以通过增加显存控制器数量与位宽提高显存带宽。集成GPU的桌面和移动处理器的内存控制器数量一般只有1-2个,并且由CPU和GPU共享带宽,与独立GPU相比有很大差距。
3. 功耗低,单位功耗下性能较强。移动GPU使用了较低的电压和频率,以及漏电较低的工艺,以达到更低的功耗。
DirectX 10.0规范前的GPU中的主要可编程单元是顶点着色器和像素着色器。在没有采用统一渲染架构的GPU中,两者在物理上是分离的,数量上的比例也是固定的。一个具体的应用程序很难同时完全利用两种可编程着色器的性能。此外,传统GPU不允许计算单元之间通过片内的存储器进行通信,因此GPGPU也只能采用严格的SIMD模型。不允许数据间的通信,就限制了很多算法,也就制约了传统GPGPU的应用范围和代码效率。
最早的GPGPU开发直接使用了图形学API编程。这种开发方式要求编程人员将数据打包成纹理,将计算任务映射为对纹理的渲染过程,用汇编或者高级着色器语言(如GLSL、Cg、HLSL)编写shader程序,然后通过图形学API(Direct3D、OpenGL)执行。这种“曲线救国”的方式要求编程人员不仅要熟悉自己需要实现的计算和并行算法,还要对图形学硬件和编程接口有深入的了解。
2003年,斯坦福大学的Ian Buck等人对ANSI C进行扩展,开发了基于NVIDIA Cg的Brook源到源编译器。Brook可以将类似C的brook C语言通过brcc编译器编译为Cg代码,隐藏了利用图形学API实现的细节,大大简化了开发过程。但早期的Brook编译效率很低,并且只能使用像素着色器进行运算。受GPU架构限制,Brook也缺乏有效的数据通信机制。AMD/ATI公司在其GPGPU通用计算产品Stream中采用了Brook的改进版本Brook+作为高级开发语言。Brook+的编译器的工作方式与Brook不同,提高了效率。在2009年推出Brook+ 1.3以前,Brook+早期版本与Brook相比在语法和编程模型上没有显著改进,同样缺乏有效的数据通信手段。
2006年NVIDIA推出了第一个专用GPU通用计算编程API CUDA。与传统开发方式相比,CUDA硬件引入了SIMT概念,允许在细粒度上进行通信。CUDA的可编程性和某些应用程序的运行效率比传统GPGPU编程方式高。
2008年6月16日,Khronos的通用计算工作小组成立。5个月后的2008年11月18日,该工作组完成了OpenCL 1.0规范的技术细节。该技术规范在由Khronos成员进行审查之后,于2008年12月8日公开发表[3]。2010年6月14日,OpenCL 1.1 发布。由于性能优化程序高度硬件相关,同样的OpenCL程序在不同的硬件上需要分别优化才能达到最佳性能。
Google在Android 4.1中实验性的加入了renderscript,并在Android 4.2中允许使用GPU加速renderscript。总体而言,renderscript的可编程性与使用openGL基本相当。
目前市场上主流GPU对通用计算API支持如下:
|
OpenGL ES |
DirectX |
CUDA |
OpenCL |
renderscript |
SGX554 |
2.0 |
9 level |
N |
1.1 |
Y |
Nvidia Geforce ULP |
2.0 |
9 |
N |
N |
Y |
Nvidia Kepler |
3.0 |
11 |
Y |
1.2 |
Y |
Adreno3xx |
3.0 |
11 |
N |
1.1 |
Y |
HD Graphics |
3.0 |
11 |
N |
1.1 |
Y |
Mali-T6xx |
3.0 |
11 |
N |
1.1 |
Y |
GC4000 |
3.0 |
10 |
N |
1.1 |
N/A |
表 5 2014Q1市场流行GPU架构对图形学和通用计算API支持
目前主流移动操作系统对通用计算API支持如下:
|
OpenGL ES |
DirectX |
CUDA |
OpenCL |
renderscript |
iOS 7 |
Y |
N |
N |
N (native API) |
N |
Android 4.4 |
Y |
N |
N (supported by NVIDIA SDK) |
N |
Y |
Windows 8 RT |
Y |
Y |
Y |
N/A |
N |
表 6 主流操作系统对图形学和通用计算API支持
由表可知,尽管主流硬件都能够支持openCL,但目前主流移动操作系统对专用通用计算API支持程度不佳。最适合的编程方式仍然是使用较为传统的OpenGL ES,这样可以实现良好的可移植性。如果是Android独占应用,可以考虑使用renderscript。在不考虑可移植性的前提下,可以在特定平台上使用CUDA或者OpenCL以获得更高效率和可编程性。
(2015年3月29日补充:iOS上可以考虑使用metal)
移动GPU通用计算呈现以下几个趋势:
1. 移动GPU性能快速提高,绝对性能受到芯片面积、带宽和功耗限制,单位功耗下性能对比桌面GPU具有优势。
2. 移动GPU架构转向统一渲染架构,有些直接使用与桌面GPU相同的架构。移动GPU对图形和通用计算API支持已与桌面GPU同步。
3. 主流移动操作系统对图形学API和GPU通用计算API支持不断完善,但目前在移动平台仍未出现统一的专用GPU通用计算API。通过OpenGL ES进行通用计算是未来数年中可以获得跨操作系统和硬件平台,具有良好可移植性的现实选择。
4. 利用GPU进行移动平台通用计算的软件数量正在增长,目前主要应用领域为图像与视频处理和编解码。未来可能成为热点的模式识别和增强现实应用需要大量计算和渲染,对GPU通用计算有迫切需求。