SlideShare a Scribd company logo
1 of 17
Download to read offline
GPU 通用计算调研报告
                            东南大学 杨春山            revised by 同济大学 程微宏

摘要:NVIDIA 公司在 1999 年发布 GeForce256 时首先提出 GPU(图形处理器)的概念,随后
大量复杂的应用需求促使整个产业蓬勃发展至今。GPU 在这十多年的演变过程中,我们看到
GPU 从最初帮助 CPU 分担几何吞吐量,到 Shader(着色器)单元初具规模,然后出现 Shader
单元可编程性,    到今天 GPU 通用计算领域蓬勃发展这一清晰轨迹。         本报告首先根据搜集到的
资料记录 GPU 通用计算的发展过程中硬件和软件的演变,          然后介绍并简要比较现在比较流行
的 GPU 通用计算编程模型,最后对 GPU 通用计算在不同领域的成功应用进行概述。
关键词:GPU GPU 通用计算 可编程单元 编程模型 GPGPU 应用


1、GPU 通用计算的背景和动机
    GPU 英文全称 Graphic Processing Unit,中文翻译为“图形处理器”。GPU 从诞生之
日起就以超越摩尔定律的速度发展,            运算能力不断提升。    业界很多研究者注意到 GPU 进行计
算的潜力, 2003 年 SIGGRAPH 大会上提出了 GPGPU General-purpose computing on graphics
          于                           (
processing units)的概念。GPU 逐渐从由若干专用的固定功能单元(Fixed Function Unit)组
成的专用并行处理器向以通用计算资源为主,固定功能单元为辅的架构转变。

1.1 为什么要用 GPU 进行计算
     GPU 在处理能力和存储器带宽上相对于 CPU 有明显优势,在成本和功耗上也不需要
付出太大代价。由于图形渲染的高度并行性,使得 GPU 可以通过增加并行处理单元和存储
器控制单元的方式提高处理能力和存储器带宽。       GPU 设计者将更多的晶体管用作执行单元,
而不是像 CPU 那样用作复杂的控制单元和缓存并以此来提高少量执行单元的执行效率[1]。
图 1 对 CPU 与 GPU 中的逻辑架构进行了对比。




                         图 1 CPU 和 GPU 逻辑架构对比
  CPU 的整数计算、分支、逻辑判断和浮点运算分别由不同的运算单元执行,此外还有
一个浮点加速器。因此,CPU 面对不同类型的计算任务会有不同的性能表现。而 GPU 是由
同一个运算单元执行整数和浮点计算,因此,GPU 的整型计算能力与其浮点能力相似。目
前,主流 GPU 都采用了统一架构单元,凭借强大的可编程流处理器阵容,GPU 在单精度浮
点运算方面将 CPU 远远甩在身后[1]。最顶级的英特尔 Core i7 965 处理器,在默认情况下,
它的浮点计算能力只有 NVIDIA GeForce GTX 280 的 1/13,与 AMD Radeon HD 4870 相比
差距就更大。
图 2 CPU 和 GPU 的每秒浮点运算次数和存储器带宽

   GPU 运算相对于 CPU 还有一项巨大的优势,那就是其内存子系统,也就是 GPU 上的
显存[1]。当前桌面级顶级产品 3 通道 DDR3-1333 的峰值是 32GB/S,实测中由于诸多因素
带宽在 20 GB/S 上下浮动。AMD HD 4870 512MB 使用了带宽超高的 GDDR5 显存,内存总
线数据传输率为 3.6T/s 或者说 107GB/s 的总线带宽。       NVIDIA GTX280 使用了高频率 GDDR3
显存,但是其显存控制器支持的位宽达到了 512bit,搭载 16 颗 0.8ns GDDR3 显存,带宽高
达惊人的 142GB/s。而主流 GPU 普遍拥有 40-60 GB/s 显存带宽。存储器的超高带宽让巨大
的浮点运算能力得以稳定吞吐,也为数据密集型任务的高效运行提供了保障。
   还有,从 GTX200 和 HD 4870 系列 GPU 开始,AMD 和 NVIDIA 两大厂商都开始提供
对双精度运算的支持,     这正是不少应用领域的科学计算都需要的。                NVIDIA 公司最新的 Fermi
架构更是将全局 ECC(Error Checking and Correcting)、可读写缓存、分支预测等技术引入
到 GPU 的设计中,明确了将 GPU 作为通用计算核心的方向。
   GPU 通用计算被越来越多的采用,除了 GPU 本身架构的优越性,市场需求也是重要的
原因。比如很多企业或科研单位无法布置昂贵的的计算机集群,而大部分普通用户 PC 上装
配的 GPU 使用率很低,  提高 GPU 利用率的有效途径就是将软件的部分计算任务分配到 GPU
上,从而实现高性能、低功耗的最终目标。
1.2 什么适合 GPU 进行计算
    尽管 GPU 计算已经开始崭露头角,但 GPU 并不能完全替代 X86 解决方案,很多操作
系统、软件以及部分代码现在还不能运行在 GPU 上,所谓的 GPU+CPU 异构超级计算机也
并不是完全基于 GPU 进行计算。一般而言适合 GPU 运算的应用有如下特征[2]:
    • 运算密集。
    • 高度并行。
    • 控制简单。
    • 分多个阶段执行。
    符合这些条件或者是可以改写成类似特征的应用程序,就能够在 GPU 上获取较高的性
能。


2、GPU 通用计算的前世今生
  GPU 通用计算其实是从 GPU 渲染管线发展来的。GPU 渲染管线的主要任务是完成 3D
模型到图像的渲染工作。常用的图形学 API(DirectD/OpenGL)编程模型中渲染过程被分成
几个可以并行处理的阶段,  分别由 GPU 中渲染管线的不同单元进行处理。 GPU 渲染管线
                                           在
的不同阶段,需要处理的对象分别是顶点(Vertex)、几何图元(primitive)
                                         、片元(fragment)、
像素(pixel)
        。图形渲染过程具有内在的并行性:顶点之间、图元之间、片元之间的数据相
关性很弱,对它们的计算可以独立并行进行,这使得通过并行处理提高吞吐量成为可能[3]。
这儿不对 GPU 渲染管线进行详细介绍, 而是着重于介绍 GPU 可编程器件和编程模型的发展
历程。

2.1 GPU 可编程器件的发展
    1999 年 8 月,NVIDIA 正式发表了具有跨世纪意义的产品 NV10——GeForce 256。
GeForce256 是业界第一款 256bit 的 GPU,       也是全球第一个集成 T&L Transforming&Lighting
                                                     (
几何光照转换)、动态光影、三角形设置/剪辑和四像素渲染等 3D 加速功能的图形引擎。通
过 T&L 技术,   显卡不再是简单像素填充机以及多边形生成器,                  它还将参与图形的几何计算从
而将 CPU 从繁重的 3D 管道几何运算中解放出来。可以说,T&L 技术是显卡进化到 GPU 的标
志。
    从某种意义上说,GeForce 256 开创了一个全新的 3D 图形时代,再到后来 GeForce 3
开始引入可编程特性,       能将图形硬件的流水线作为流处理器来解释,                   基于 GPU 的通用计算也
开始出现。GeForce3 被用于实现矩阵乘法运算和求解数学上的扩散方程,这是 GPU 通用计
算的早期应用。
    研究人员发现,要实现更加复杂多变的图形效果,不能仅仅依赖三角形生成和硬件 T&L
实现的固定光影转换,而要加强顶点和像素运算能力。Shader(着色器)就是在这样的背景
下提出的。Pixel Shader(顶点着色器)和 Vertex Shader(像素着色器)的硬件逻辑支持
可编程的像素和顶点,虽然当时可编程性很弱,硬件限制太多,顶点部分出现可编程性,像
素部分可编程性有限,但这的确是硬件 T&L 之后 PC 图形技术的又一重大飞跃。3D 娱乐的视
觉体验也因此向接近真实迈进了一大步。                   可编程管线的引入,    也为 GPU 发展翻开了新的篇章,
GPU 开始向 SIMD(Single Instruction Multiple Data,单指令多数据流)处理器方向发展,凭借
强大的并行处理性能,使得 GPU 开始用有了部分流式处理器特征。
1
    随后到来的 DirectX 9.0 时代, Shader 单元具备了更强的可编程性。
                              让                         2002 年底微软
发布的 DirectX 9.0 中,Pixel Shader 单元的渲染精度已达到浮点精度,传统的硬件 T&L
单元也被取消。全新的 Vertex Shader 编程将比以前复杂得多,新的 Vertex Shader 标准增
加了流程控制,更多的常量,每个程序的着色指令增加到了 1024 条。
    Shader Model 2.0 时代突破了以前限制 PC 图形图像质量在数学上的精度障碍,它的每
条渲染流水线都升级为 128 位浮点颜色,             让游戏程序设计师们更容易更轻松的创造出更漂亮
的效果,让程序员编程更容易。而从通用性方面理解,支持浮点运算让 GPU 已经具备了通用
计算的基础,这一点是至关重要的。
    图形流水线中可编程单元的行为由 Shader 单元定义,着色器的性能由 DirectX 中规定
的 Shader Model 来区分,并可以由高级的 Shading 语言(例如 NV 的 Cg,OpenGL 的 GLSL,
Microsoft 的 HLSL)编写。Shader 源码被译为字节码,然后在运行时由驱动程序将其转化
为基于特定 GPU 的二进制程序,         具备可移植性好等优势。          传统的图形渲染流线中有两种不同
的可编程着色器,       分别是顶点着色单元       (Vertex Shader, 和像素着色单元
                                              VS)      (Pixel Shader,
PS)。
    在 Shader Model 4.0 之前,VS 和 PS 两种着色器的架构既有相同之处,又有一些不同。
两者处理的都是四元组数据(顶点着色器处理用于表示坐标的 w、x、y、z,但像素着色器
处理用于表示颜色的 a、r、g、b),顶点渲染需要比较高的计算精度;而像素渲染则可以
使用较低的精度,从而可以增加在单位面积上的计算单元数量。传统的分离架构中,两种着
色器的比例往往是固定的。在 GPU 核心设计完成时,各种着色器的数量便确定下来,比如著
名的“黄金比例”——顶点着色器与像素着色器的数量比例为 1:3。但不同的游戏对顶点
资源和像素资源的计算能力要求是不同的。                 如果场景中有大量的小三角形,     则顶点着色器必
须满负荷工作,而像素着色器则会被闲置;如果场景中有少量的大三角形,又会发生相反的
情况。因此,固定比例的设计无法完全发挥 GPU 中所有计算单元的性能。
    Shader Model 4.0 统一了两种着色器,顶点和像素着色器的规格要求完全相同,都支
持 32 位浮点数。这是 GPU 发展的一个分水岭。过去只能处理顶点和只能处理像素的专门处
理单元被统一之后,        更加适应通用计算的需求,         应用程序调用着色器运算能力的效率也更高。
    DirectX 11 提出的 Shader Model 5.0 版本继续强化了通用计算的地位,微软提出的全
新 API—Direct Compute 将把 GPU 通用计算推向新的巅峰。同时 Shader Model 5.0 是完全
针对流处理器而设定的,所有类型的着色器,如:像素、顶点、几何、计算、Hull 和 Domaim
(位于 Tessellator 前后)都将从新指令集中获益[4]。
    着色器的可编程性也随着架构的发展不断提高,下表给出每代模型的大概特点[1]。

      Shader Model            GPU 代表        显卡时代                         特点


                         1999 年第一         DirectX 7       GPU 可以处理顶点的矩阵变换和
                         代 NV                             进行光照计算  (T&L) 操作固定,
                                                                       ,
                                          1999~2001
                         Geforce256                       功能单一,不具备可编程性


          SM 1.0         2001 年第二         DirectX 8       将图形硬件流水线作为流处理器
                         代 NV                             来解释,顶点部分出现可编程性,
                                                          像素部分可编程性有限(访问纹

1
  DirectX 并不是一个单纯的图形 API,它是由微软公司开发的用途广泛的 API,它包含有 Direct Graphics(Direct 3D+Direct
Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects 等多个组件,它提
供了一整套的多媒体接口方案。只是其在 3D 图形方面的优秀表现,让它的其它几个组件几乎被人们忽略。
Geforce3                        理的方式和格式受限,不支持浮
                                              点)


     SM 2.0   2003 年         DirectX          顶点和像素可编程性更通用化,
                             9.0b             像素部分支持 FP16/24/32 浮点,
              ATI R300
                                              可包含上千条指令,处理纹理更
              和第三代 NV                         加灵活:可用索引进行查找,也
              Geforce FX                      不再限制[0,1]范围, 从而可用作
                                              任意数组(这一点对通用计算很
                                              重要)


     SM 3.0   2004 年         DirectX          顶点程序可以访问纹理 VTF,支
                             9.0c             持动态分支操作,像素程序开始
              第四代 NV
                                              支持分支操作(包括循环、
              Geforce 6
                                              if/else 等),支持函数调用,
              和 ATI X1000                     64 位浮点纹理滤波和融合,多个
                                              绘制目标


     SM 4.0   2007 年         DirectX 10       统一渲染架构,支持 IEEE754 浮
                                              点标准,引入 Geometry Shader
              第五代 NV         2007~2009
                                              (可批量进行几何处理),指令
              G80 和 ATI
                                              数从 1K 提升至 64K,  寄存器从 32
              R600
                                              个增加到 4096 个,纹理规模从
                                              16+4 个提升到 128 个,材质
                                              Texture 格式变为硬件支持的
                                              RGBE 格式,最高纹理分辨率从
                                              2048*2048 提升至 8192*8192


     SM 5.0   2009 年         DirectX 11       明确提出通用计算 API Direct
                                              Compute 概念和 Open CL 分庭抗
              ATI RV870      2009~
                                              衡,以更小的性能衰减支持
              和 2010 年 NV                     IEEE754 的 64 位双精度浮点标
              GF100                           准,硬件 Tessellation 单元,更
                                              好地利用多线程资源加速多个
                                              GPU

                       表1   Shader Model 版本


2.2 AMD 与 NVIDIA 最新 GPU 架构比较
    在图形计算领域,NVIDIA 和 ATI/AMD 把持着民用市场的绝大部分份额和大部分专用
市场。为了抢占更大的市场,两家公司不断曾经改进自家 GPU 的架构以实现更逼真的 3D
效果,  现在他们同样代表了 GPU 通用计算的方向,     这儿对两家公司最新的 GPU 架构进行简
单的分析和比较。
AMD 的最新 GPU 架构是 RV870,又被命名为 Cypress,采用了第二代“TeraScale 2”核
心架构。RV870 包括流处理器在内的所有核心规格都比上一代架构 RV770 翻了一倍,也就
是“双核心”设计,几乎是并排放置两颗 RV770 核心,另外在装配引擎内部设计有两个
Rasterizer 光栅器) Hierarchial-Z
          (       和              (多级 Z 缓冲模块) 以满足双倍核心规格的胃口。
                                             ,                          RV870
的晶体管数量的达到了 21 亿个,流处理器也从 RV770 时代的 800 个扩充到了 1600 个,每
个流处理器单元的“1 大 4 小”结构包括一个全功能 SP 单元和 4 个能执行乘加运算的 SP[5]。
     NVIDIA 的最新 GPU 架构是 GF100,又被命名为 Fermi,这是 NVIDIA 为了抢占 GPU
通用计算性能制高点和完整支持 DirectX 11 而设计的架构。GF100 拥有三层分级架构:4 个
GPC (Graphics Processing Clusters,图形处理图团簇) 16 个 SM
                                            、       (Streaming Multiprocessors,
流阵列多处理器) 512 个 CUDA 核心。
                、                   每个 GPC 包括 4 个 SM,每个 SM 包括 32 个 CUDA
核心。一个完整的的 GF100 还有 6 个内存控制器(Memory Controller)            。GF100 核心,除具
备前一代架构 GT200 的 L1 纹理缓存之外,还拥有真正意义的可读写 L1 缓存和 L2 缓存。
GF100 的晶体管数量达到了 30 亿个,可以认为 GF100 是一颗 4 核心(GPC)处理器,因为
GPC 几乎是一颗全能的处理器[6]。
     两种架构最明显的区别就是流处理器结构。RV870 选择延续上一代非统一执行架构
GPU 产品的 SIMD 结构,用庞大的规模效应压制对手,偏向于 ILP(Instruction-Level
Parallelism,指令并行度)     方向, GF100 则使用了 G80 以来创新的 MIMD
                             而                            (Multiple Instruction
Multiple Data)架构,更偏重于 TLP(Thread-Level Parallelism,线程并行度)方向。在单指
令多数据流(SIMD)的结构中,单一控制部件向每条流水线分派指令,同样的指令被所有
处理部件同时执行。另一种控制结构多指令多数据流(MIMD)中,每条流水线都能够独立
于其他流水线执行不同的程序。MIMD 能比较有效率地执行分支程序,而 SIMD 体系结构
运行条件语句时会造成很低的资源利用率。TLP 要求强大的仲裁机制,丰富的共享 cache 和
寄存器资源以及充足的发射端,这些都是极占晶体管的部件,幸好 Fermi 架构在增大缓存和
分支论断上迈出了坚实的一步。




                    图 3 NVIDIA 和 AMD 使用了两种不同的流处理器架构
   两种架构的另一个不同在于它们的缓存配置,虽然在在 RV870 与 GF100 上,我们都看
到了一级缓存与二级缓存的设计。AMD RV870 提供了 32KB 的 LDS(Local Data Store)         ,作
用类似于 NVIDIA 传统的 shared memory,     但是目前的资料来看这个 LDS 并不具备配置为硬
件 cache 的能力。GF100 同时提供了 shared memory 和 cache,并允许程序员选择对它们的
划分。  GF100 的每个 SM 都有 64KB 可配置为 48KB shared memory + 16KB L1 cache 或者
16KB shared memory + 48KB L1 cache 的高速片上 RAM。AMD 的 RV870 提供了 64KB
Global Data Shared,本质上是一个可读写的 cache,     可用于各个 SIMD Core 之间的数据交换。
GF100 提供了 768KB 的一体化 L2 cache,这个 L2 cache 为所有的 Load/Store 以及纹理请求
提供高速缓存,对所有的 SM 来说 L2 cache 上的数据都是连贯一致的,从 L2 cache 读取到
的数据就是最新的数据。RV870 的 L2 cache 则不能提供 GF100 中 L2 Cache 共享内核间数
据的特性。
    还有一个不同是两家厂商选择了不同的最小线程执行粒度。                    粒度越细,  能够调用并行度
来进行指令延迟掩盖的机会越大,性能衰减越小。细化粒度偏向 TLP 方向,对 GPU 的线程
仲裁机制要求很大,最终会导致硬件开销过大。GPU 通用计算中最小的执行单位是线程
(Thread)  ,多个线程会被打包成一个线程束,NVIDIA 称线程束为 Warp,AMD 称之为
Frontwave。Frontwave 包含 64 个线程,NVIDIA 的线程管理粒度更小,每个 Warp 包含 32
个线程。RV870 每凑够 64 个线程,仲裁器就会动作一次,把一个 Frontwave 发送给空闲的
一个 SIMD Core。NVIDIA 的 GF100 比较特殊,还存在 Half-Warp,也就是说每 16 个线程就
可以发送给 SM 一次。Half-Warp 由线程中的前 16 个线程或者后 16 个线程组成。
    还要提到的是 GF100 架构首次在 GPU 中引入全局 ECC(Error Checking and Correcting
内存错误检查和修复)          。在使用 GPU 做大数据量的处理和高性能计算的时候,ECC 有大量
的需求,尤其在医疗图像处理和大型集群中,ECC 是非常有用的特性。
    总体来说,两家厂商的差异在于:AMD 堆砌了更大规模的运算器单元,NVIDIA 则更
注重如何利用有限的运算器资源。AMD 将更多的晶体管消耗在大量的 SIMD Core 单元上,
NVIDIA 则将更多的晶体管消耗在仲裁机制、              丰富的共享缓存资源和寄存器资源以及充足的
发射端方面。       AMD 的 GPU 偏向于 ILP 结构,   NVIDIA 偏向于 TLP 结构。 (线程并行度)
                                                       TLP
考验线程能力和并行能力,ILP(指令并行度)则考验指令处理。

2.3 GPU 通用计算编程模型
     GPU 通用计算通常采用 CPU+GPU 异构模式,由 CPU 负责执行复杂逻辑处理和事务处
理等不适合数据并行的计算, GPU 负责计算密集型的大规模数据并行计算。
                      由                                这种利用 GPU
强大处理能力和高带宽弥补 CPU 性能不足的计算方式在发掘计算机潜在性能,在成本和性
价 比 方面 有显 著 的优 势。 在 2007 年 NVIDIA 推 出 CUDA ( Compute Unified Device
Architecture,统一计算设备架构)之前,GPU 通用计算受硬件可编程性和开发方式的制约,
开发难度较大。2007 年以后,CUDA 不断发展的同时,其他的 GPU 通用计算标准也被相继
提出,如由 Apple 提出 Khronos Group 最终发布的 OpenCL,AMD 推出的 Stream SDK,
Microsoft 则在其最新的 Windows7 系统中集成了 DirectCopmute 以支持利用 GPU 进行通用
计算。
2.3.1 传统 GPU 通用计算开发
     最早的 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 编译效率很低,并且只能使用像素着色
器(Pixel Shader)进行运算。受 GPU 架构限制,Brook 也缺乏有效的数据通信机制。AMD
在其 GPGPU 通用计算产品 Stream 中采用 Brook 的改进版本 Brook+作为高级开发语言。
Brook+的编译器工作方式与 Brook 不同,提高了效率[7]。
2.3.2 CUDA –C/C++及其 SDK
     2007 年 6 月,  NVIDIA 推出了 CUDA 技术。   CUDA 是一种将 GPU 作为数据并行计算设
备的软硬件体系,         硬件上 NVIDIA GeForce 8 系列以后的 GPU  (包括 GeForce、ION、Quadro、
Tesla 系列)  已经采用支持 CUDA 的架构,        软件开发包上 CUDA 也已经发展到 CUDA Toolkit
3.2(截止到 2010 年 11 月)      ,并且支持 Windows、Linux、MacOS 三种主流操作系统。CUDA
采用比较容易掌握的类 C 语言进行开发,而且正在开发适用于 CUDA 架构的用于科学计算
的 Fortran 版本。无论是 CUDA C-语言或是 OpenCL,指令最终都会被驱动程序转换成 PTX
(Parallel Thread Execution,并行线程执行,CUDA 架构中的指令集,类似于汇编语言)代
码,交由显示核心计算[8]。
     CUDA 编程模型将 CPU 作为主机(Host)         ,GPU 作为协处理器(co-processor)或者设
备(Device)   。在一个系统中可以存在一个主机和若干个设备。CPU、GPU 各自拥有相互独
立的存储地址空间:主机端内存和设备端显存。CUDA 对内存的操作与一般的 C 程序基本
相同,但是增加了一种新的 pinned memory;操作显存则需要调用 CUDA API 存储器管理函
数。一旦确定了程序中的并行部分,就可以考虑把这部分计算工作交给 GPU。运行在 GPU
上的 CUDA 并行计算函数称为 kernel(内核函数)            。一个完整的 CUDA 程序是由一系列的设
备端 kernel 函数并行步骤和主机端的串行处理步骤共同组成的。                  这些处理步骤会按照程序中
相应语句的顺序依次执行,满足顺序一致性。




                              图 4 异构编程模型

   CUDA SDK 提供的 API 分为 CUDA runtime API(运行时 API)和 CUDA driver API(驱
动程序 API)    。CUDA runtime API 在 CUDA driver API 的基础上进行了封装,隐藏了一些实
现细节,编程更加方便。CUDA runtime API 函数前都有 CUDA 前缀。CUDA driver API 是一
种基于句柄的底层接口,可以加载二进制或汇编形式的 kernel 模块,指定参数并启动运算。
CUDA driver API 编程复杂,但有时能通过直接操作硬件的执行实现一些更加复杂的功能或
者获得更高的性能。           由于它使用的设备端代码是二进制或者汇编代码,               因此可以在各种语言
中调用。     CUDA driver API 所有函数的前缀为 cu。     另外 CUDA SDK 也提供了 CUFFT (CUDA
Fast Fourier Transform,基于 CUDA 的快速傅立叶变换)         、CUBLAS(CUDA Basic Linear
Algebra Subprograms, 基于 CUDA 的基本矩阵与向量运算库) CUDPP    和    (CUDA Data Parallel
Primitives,基于 CUDA 的常用并行操作函数)等函数库,提供了简单高效的常用函数供开
发者直接使用。
     从 CUDA Toolkit3.0 开始支持 NVIDIA 最新的 Fermi 架构,最大程度上利用 Fermi 架构
在通用计算方面的优势。CUDA 3.0 也开始支持 C++的继承和模板机制提高编程灵活性,同
时 CUDA C/C++内核现在以标准 ELF 格式进行编译,开始支持硬件调试,还增加了一个新
的 Direct3D、OpenGL 统一协作 API,支持 OpenGL 纹理和 Direct3D 11 标准,支持所有的
OpenCL 特征。

2.3.3 OpenCL
      OpenCL (Open Computing Language,开放计算语言) 是一个为异构平台编写程序的框
架,  此异构平台可由 CPU、        GPU 或其他类型的处理器组成。        OpenCL 由用于编写 kernels (在
OpenCL 设备上运行的函数)的语言(基于 C99)和一组用于定义并控制平台的 API 组成。
OpenCL 提供了基于任务分区和数据分区的并行计算机制。
      OpenCL 最初由 Apple 公司开发,Apple 拥有其商标权,并在与 AMD,IBM,Intel 和
NVIDIA 技术团队的合作之下初步完善。               随后,Apple 将这一草案提交至 Khronos Group。 2008
年 6 月 16 日,Khronos 的通用计算工作小组成立。5 个月后的 2008 年 11 月 18 日,该工作
组完成了 OpenCL 1.0 规范的技术细节。           该技术规范在由 Khronos 成员进行审查之后, 2008 于
年 12 月 8 日公开发表。2010 年 6 月 14 日,OpenCL 1.1 发布[9]。
      OpenCL 也是基于 C 的一个程式语言,分为 Platform Layer、Runtime、Compiler 三个部
分:  Platform Layer 用来管理计算装置,       提供启始化装置的界面,     并用来建立 compute contexts
和 work-queues。Runtime 用来管理资源,并执行程序的 kernel。Compiler 则是 ISO C99 的
子集合,     并加上了 OpenCL 特殊的语法。 OpenCL 的执行模型中,
                                    在                 有所谓的 Compute Kernel
和 Compute Program。 Compute Kernel 基本上类似于 CUDA 定义的 kernel,是最基本的的
计算单元; Compute Program 则是 Compute Kernel 和内建函数的集合,
           而                                             类似一个动态函数
库。很大程度上 OpenCL 与 CUDA Driver API 比较相像。
      自从 2008 年 12 月 NVIDIA 在 SIGGRAPH Asia 大会上在笔记本电脑上展示全球首款
OpenCL GPU 演示以来,AMD、NVIDIA、Apple、RapidMind、Gallium3D、ZiiLABS、IBM、
Intel 先后发布他们自己的 OpenCL 规范实现           (当一台机器上存在不同厂家的支持 OpenCL 的
设备时,这样也给开发应用程序带来不统一的一些麻烦)                      。除了 AMD 和 NVIDIA,其他厂
商如 S3、VIA 等也纷纷发布他们支持 OpenCL 的硬件产品[10]。

2.3.4 DirectCopmute
     Directcompute 是一种由 Microsoft 开发和推广的用于 GPU 通用计算的应用程序接口,
集成在 Microsoft DirectX 内,  允许 Windows Vista 或 Windows 7 平台上运行的程序利用 GPU
进行通用计算。        虽然 DirectCompute 最初在 DirectX 11 API 中得以实现,   但支持 DX10 的 GPU
可以利用此 API 的一个子集进行通用计算              (DirectX 10 内集成 Directcompute 4.0,DirectX 10.1
内集成 Directcompute 4.1)
                     ,支持 DirectX11 的 GPU 则可以使用完整的 DirectCompute 功能
(DirectX 11 内集成 Directcompute 5.0)。Directcompute 和 OpenCL 都是开放标准,得到
NVIDIA CUDA 架构和 ATI Stream 技术的支持。
    Windows 7 增加了视频即时拖放转换功能,           可以将电脑中的视频直接转换到移动媒体播
放器上,如果电脑中的 GPU 支持 Directcompute,那么这一转换过程就将由 GPU 完成。其
转换速度将达到 CPU 的 5-6 倍。Internet Explorer 9 加入了对 Directcompute 技术的支持,可
以调用 GPU 对网页中的大计算量元素做加速计算,另外 Excel2010、Powerpoint2010 均提供
Directcompute 技术支持[11]。

2.3.5 Stream SDK
     AMD 的流计算模型其实也包含了流处理器架构和相应的软件包。AMD 在 2007 年 12
月发布运行在 Windows XP 系统下的 Steam SDK v1.0, 此 SDK 采用了 Brook+作为开发语言,
Brook+是 AMD 对斯坦福大学开发的 Brook 语言(基于 ANSI C)的改进版本。Stream SDK
为开发者提供对系统和平台开放的标准以方便合作者开发第三方工具。                   软件包包含了如下组
件:支持 Brook+的编译器,支持流处理器的设备驱动 CAL(Compute Abstraction Layer)   ,
程序库 ACML(AMD Core Math Library)以及内核函数分析器。




                       图 5 AMD 流计算软件系统之间的关系
    在 Stream 编程模型中,在流处理器上执行的程序称为 kernel(内核函数)    ,每个运行在
SIMD 引擎的流处理器上的 kernel 实例称为 thread(线程) 线程映射到物理上的运行区域称
                                     ,
为执行域。     流处理器调度线程阵列到线程处理器上执行,      直到所有线程完成后才能运行下一
个内核函数。
    Brook+是流计算的上层语言,抽象了硬件细节,开发者编写能够运行在流处理器上的
内核函数,只需指定输入输出和执行域,无需知道流处理器硬件的实现。Brook+语言中两
个关键特性是:Stream 和 Kernel。Stream 是能够并行执行的相同类型元素的集合;Kernel
是能够在执行域上并行执行的函数。Brook+软件包包含 brcc 和 brt。brcc 是一个源语言对源
语言的编译器,能够将 Brook+程序翻译成设备相关的 IL(Intermediate Language),这些代
码被后续链接、      执行。 是一个可以执行内核函数的运行时库,
                brt                     这些库函数有些运行在 CPU
上, 有些运行在流处理器上。      运行在流处理器上的核函数库又称为 CAL   (Compute Abstraction
Layer)。CAL 是一个用 C 编写的设备驱动库,允许开发者在保证前端一致性的同时对流处
理器核心从底层进行优化。CAL 提供了设备管理、资源管理、内核加载和执行、多设备支
持、 3D 图形 API 交互等功能。
   与                     同时, Stream SDK 也提供了常用数学函数库 ACML        (AMD
Core Math Library)供开发者快速获得高性能的计算。ACML 包括基本完整的线性代数子例
程、FFT 运算例程、随机数产生例程和超越函数例程[12]。
    面对 NVIDIA 在 GPU 通用计算上的不断创新,       AMD 也不甘示弱,    不断改进自己的 Stream
 SDK。 截止到 2010 年 11 月,AMD 发布了 Stream SDK v2.2,能够在 WindowsXP SP3、Windows
 7 和部分 Linux 发行版上运行,开始支持 OpenCL 1.1 规范和双精度浮点数操作。


3、GPU 通用计算的应用领域
    从 SIGGRAPH 2003 大会首先提出 GPU 通用计算概念,到 NVIDIA 公司 2007 年推出
CUDA 平台,GPU 通用计算依靠其强大的计算能力和很高的存储带宽在很多领域取得了成
功。越来越多的信号告诉我们,GPU 通用计算是一片正在被打开的潜力巨大的市场[13]。
    GPGPU 项目研究中的先行者是英国剑桥大学的 BionicFx 课题组。早在 2004 年 9 月,
剑桥大学的 BionicFx 课题组便宣布在 NVIDIA 的 GeForce FX 5900 产品中实现了专业的实时
音频处理功能,并且准备进行商业化的运作,对其产品进行销售,给音乐创作者带来实惠。
在随后的一段时间,GPGPU 进入了深入研究阶段,但是由于编程语言架构和编程环境都难
以通用,该领域的发展能力受到广泛质疑。就在人们认为 GPGPU 的研究即将偃旗息鼓的时
候,ATI 在 2006 年 8 月惊人地宣布即将联手斯坦福大学在其 Folding@Home 项目中提供对
ATI Radeon X1900 的支持。在显卡加入 Folding@Home 项目后,科研进展速度被成倍提升,
人们第一次感受到了 GPU 的运算威力。
    毫无疑问,在 GPGPU 研究上,ATI 跨出了极具意义的一步。同时将 GPGPU 的应用领
域和普及程度推向高潮。随后 NVIDIA 凭借 GeForce 8800GTX 这款业界首个 DirectX 10
GPU,在 GPU 通用计算方面实现了大步跨越,特别是 CUDA 概念的提出(该工具集的核心
是一个 C 语言编译器)       ,在新的通用计算领域后来居上。
    下面对 GPU 通用计算在各个领域的成功应用做一个概述。




                     图 6 不同项目使用 CUDA 后获得的加速比
3.1 常见软件
    最新版本的 MATLAB 2010b 中 Parallel Computing Toolbox 与 MATLAB Distributed
Computing Server 的最新版本可利用 NVIDIA 的 CUDA 并行计算架构在 NVIDIA 计算能力
1.3 以上的 GPU 上处理数据,        执行 GPU 加速的 MATLAB 运算,        将用户自己的 CUDA Kernel
函数集成到 MATLAB 应用程序当中。               另外,  通过在台式机上使用 Parallel Computing Toolbox
以及在计算集群上使用 MATLAB Distributed Computing Server 来运行多个 MATLAB worker
程序,从而可在多颗 NVIDIA GPU 上进行计算[14]。AccelerEyes 公司开发的 Jacket 插件也
能够使 MATLAB 利用 GPU 进行加速计算。Jacket 不仅提供了 GPU API(应用程序接口)                     ,
而且还集成了 GPU MEX 功能。在一定程度说,Jacket 是一个完全对用户透明的系统,能够
自动的进行内存分配和自动优化。                Jacket 使用了一个叫“on-the- fly”的编译系统, MATLAB
                                                                 使
交互式格式的程序能够在 GPU 上运行。目前,Jacket 只是基于 NVIDIA 的 CUDA 技术,但
能够运行在各主流操作系统上[15]。
     Photoshop 虽然已经支持多核心处理器,但在某些时候的速度仍然让人抓狂,比如打开
一个超大文件,或者应用一个效果复杂的滤镜。从 Photoshop CS4 开始,Adobe 将 GPU 通
用计算技术引入到自家的产品中来。GPU 可提供对图像旋转、缩放和放大平移这些常规浏
览功能的加速,还能够实现 2D/3D 合成,高质量抗锯齿,HDR 高动态范围贴图,色彩转换
等。而在 Photoshop CS5 中,更多的算法和滤镜也开始支持 GPU 加速。另外,Adobe 的其
他产品如 Adobe After Effects CS4、Adobe Premiere Pro CS4 也开始使用 GPU 进行加速。这
些软件借助的也是 NVIDIA 的 CUDA 技术[16]。
     下一代主流操作系统 Windows 7 的核心组成部分包括了支持 GPU 通用计算的
Directcompute API,为视频处理、动态模拟等应用进行加速。Windows 7 借助 Directcompute
增加了对由 GPU 支持的高清播放的 in-the-box 支持,            可以流畅观看,      同时 CPU 占用率很低。
Internet Explorer 9 加入了对 Directcompute 技术的支持,   可以调用 GPU 对网页中的大计算量
元素做加速计算;Excel2010、Powerpoint2010 也开始提供对 Directcompute 技术的支持。

3.2 高性能计算
     超级计算机一般指在性能上居于世界领先地位的计算机,                           通常有成千上万个处理器以及
专门设计的内存和 I/O 系统。它们采用的架构与通常的个人计算机有很大区别,使用的技术
也随着时代和具体应用不断变动。                GPU 通用计算提出以后,          不断有超级计算机开始安装 GPU
以提高性能。2010 年 9 月,全球超级计算机领军企业 Cray 公司正式宣布,该公司将为 Cray
XE6 系列产品开发基于 NVIDIA Tesla20 系列 GPU 的刀片服务器。2010 年 11 月揭晓的世界
上最快的超级计算机 top500 列表中,             最快的 5 个系统中有 3 个使用了 NVIDIA 的 Tesla 型号
GPU 产品,其中中国国防科技大学研发的“天河一号”荣膺榜首,最快运算速度达到 2.507
petaflops。2009 年 10 月 29 日完成的“天河一号”一期系统有 3072 颗 Intel Quad Core Xeon
E5540 2.53GHz 和 3072 颗 Intel Quad Core Xeon E5450 3.0GHz 以及 2560 块 AMD Radeon HD
4870 X2,峰值性能为每秒 1206 万亿次(top500 中排名第 5)                。2010 年 10 月,升级优化后的
“天河一号”,配备了 14336 颗 Xeon X5670 处理器(32nm 工艺,六核 12 线程,2.93GHz 主
频)  ,7168 块基于 NVIDIA Fermi 架构的 Tesla M2050 计算卡(主频 1.15GHz,双精度浮点性
能 515Gflops、 单精度浮点性能 1.03Tflops)        以及 2048 颗国防科技大学研制的飞腾处理器             (八
核 64 线程,   主频 1GHz) 峰值性能每秒 4700 万亿次、
                     ,                            持续性能每秒 2507 万亿次     (LINPACK
实测值)     。
     计算机集群    (简称集群)      是一种通过松散集成的计算机软件和硬件连接起来高度紧密地
完成计算工作的系统,          采用将计算任务分配到集群的不同计算节点而提高计算能力,                           主要应
用在科学计算领域。         比较流行的集群采用 Linux 操作系统和其它一些免费软件来完成并行运
算。
     2006 年 10 月,全球最大的分布式计算项目——Folding@home 中提供对 ATI Radeon
X1900 的支持后,任何一台个人电脑都可以下载客户端参与,科研进展速度被成倍提升。该
项目可精确地模拟蛋白质折叠和错误折叠的过程,以便能更好地了解多种疾病的起因和发
展。在目前的大约 10 万台参与该项目的计算机中,仅有的 11370 颗支持 CUDA 的 GPU 提
供总计算能力的一半,而运行 Windows 的 CPU 共计 208268 颗,却只能提供该项目总能力
的约 6%的计算[1]。
     早在 2007 年, AMAX,    Supermicro 等公司就已经开始探索和研究 GPU 用于服务器和集
群。时至今日,AMAX 已成为集 CPU+GPU 塔式服务器、机柜式服务器、CPU+GPU 集群
等几十种系列产品的生产和销售为一体的一站式 GPU 解决方案供应商,可以满足不同领域
科研群体的计算需求。         AMAX GPU 集群相对于传统 CPU 集群产品,            可以以十分之一的价格,
二十分之一的功耗,       获得 20-150 倍的计算性能提高和 60%的空间节余。               AMAX 采用 NVIDIA
支持大规模并行计算的 CUDA 架构 GPU,支持 IEEE 754 单精度和双精度浮点计算,支持
CUDA 编程环境、     多种编程语言和 API,         包括 C、 + +、
                                           C     OpenCL、DirectCompute 或 Fortran,
支持 ECC、NVIDIA Parallel DataCache 技术,以及 NVIDIA GigaThread 引擎技术,支持异
步传输和系统监控功能[17]。目前众多科研机构和公司(如哈佛大学、中国科学院、剑桥大
学、英国航空公司等等)都已经架设了基于 NVIDIA Tesla(支持 CUDA)系列 GPU 的通用
计算机集群。2010 年 7 月,AMD 也宣称其合作伙伴,荷兰公司 ClusterVision,已经开始利
用其新一代的 Opteron 处理器(12 核心 CPU)和 FireStream 图形计算加速卡组建服务器集
群。
     云计算指服务的交付和使用模式,通过网络以按需、易扩展的方式获得所需的服务。
“云”是一些可以自我维护和管理的虚拟计算资源,通常为一些大型服务器集群,包括计算服
务器、存储服务器、宽带资源等等。此前的种种云计算,都是通过网络传输 CPU 的运算能
力,为客户端返回计算结果或者文件;而 GPU 云计算则偏重于图形渲染运算或大规模并行
计算。2009 年 10 月,NVIDIA 联合 Mental Images 公司推出基于 GPU 的云计算平台
RealityServer,利用 Tesla RS 硬件和 RealityServer 3.0 软件,为 PC、笔记本、上网本、智能
手机提供逼真的交互式 3D 图形渲染服务。2010 年 11 月,Amazon 与 NVIDIA 宣布推出基
于亚马逊集群 GPU 计算实例(Amazon Cluster GPU Instances)的 EC2      (弹性计算云)        服务[18],
亚马逊 GPU 集群实例提供了 22GB 的存储容量,              33.5 个 EC2 计算单元,   并且利用亚马逊 EC2
集群网络为高性能计算和数据集中处理提供了很高的吞吐量和低延迟。每一个 GPU 实例都
配有两个 NVIDIA Tesla(R) M2050 GPU,     提供了甚至超过每秒 100 万兆次的双精度浮点计算
的超高的性能。       通过 GPU 实例的数百个内核并行处理能力,                许多工作负载可以被大大加速。

3.3 信号与图像处理
    很多信号与图像处理算法的计算密度非常高,随着 GPU 通用计算的快速发展,越来越
多的算法实现了在 GPU 上运行,获得令人满意的加速。在 NVIDIA 推出 CUDA 技术之前,
尽管开发不方便,不少研究者利用图形 API 和各种 Shader 语言(HLSL、GLSL、Cg 等)实
现了一些图像分割、CT 图像重建、快速傅立叶变换、图像以及音视频编解码等算法。AMD
的 Brook+尤其是 CUDA 技术的推出极大地方便了在 GPU 上开发信号与图像处理并行算法。
    AMD 的 Stream SDK 和 NVIDIA 的 CUDA SDK 发布时就包含了各自经优化后的基本线
性代数例程(BLAS)和快速傅立叶变换库(FFT)              。2008 年 Georgia Tech 的 Andrew Kerr 等
开发了基于 CUDA 平台的 VSIPL(Vector Signal Image Processing Library)[19],支持向量和
矩阵运算,快速 FIR(Finite Impulse Response,有限冲击响应)滤波,矩阵的 QR 分解等;
2009 年 6 月,NVIDIA 又发布了专注于图像和视频处理的库 NPP(NVIDIA Performing
Primitives) 对一些统计函数、
           ,             JPEG 编解码、 滤波函数、   边缘检测算法进行了封装[20];            2010
年 8 月,   TunaCode 宣布对 NPP 库进行扩展,   推出了 CUVI Lib(CUDA for Vision and Imaging
Lib),增加了 NPP 中不包含的一些高级计算机视觉和图像处理算法,如光流法、离散小波
变换、Hough 变换、颜色空间转换等[21]。另外,2010 年 9 月,Graz 大学的研究人员发布
了专用于图像边缘分割的 GPU4Vision 库,用 GPU 实现图像分割算法的加速[22]。NVIDIA
主导的 OpenVIDIA 项目在 2010 年 6 月发布了 CUDA VisionWorkbench v 1.3.1.0,里面使用
OpenGL,Cg,CUDA-C 等语言,而且支持 OpenCL 和 DirectCompute 的例子会于近期添加,
该项目实现了立体视觉、光流法、特征跟踪的一些算法[23]。
    在特征提取领域,瑞典的 Marten Bjorkman 和美国北卡罗来纳大学的 Wu 等实现了基于
CUDA 的 SIFT(Lowe's Scale Invariant Feature Transform,尺度不变特征)的提取[24];北卡
罗来纳州立大学的 Christopher Zach 等则在 GPU 上实现 KLT 算法用于视频中的特征跟踪。
在机器学习领域,       斯坦福大学的 Rajat Raina 等在 GPU 上实现了大规模深度无监督算法 DBNs
(Deep Belief Networks)和稀疏编码(Sparse Coding)算法;谷歌上的开源项目 multisvm
则基于 CUDA 实现了 SVM(Support Vector Machine,支持向量机)的多分类器,实验表明
加速效果明显[25]。
    另外值得一提的是,         医学成像是最早利用 GPU 计算加快性能的应用之一,              GPU 通用计
算在这一领域的应用日趋成熟,当前许多医学成像领域的算法已在 GPU 上实现。Digisens
和 Acceleware AxRecon 已经分别开发出能够利用 GPU 进行计算的用于 X 线 CT 和电子断层
摄影术的 3D 成像软件和在无损图像质量的情况下可实时重建图像的软件。Techniscan 的开
发人员在其新一代全乳房超声波成像系统中将其专有的逆向散射算法在 CUDA 平台上实
现,获得很高的加速比。东京大学 Takeyoshi Dohi 教授与他的同事则在其实时医疗成像的裸
眼立体成像系统中使用 GPU 加速体绘制过程和后期文件格式转换。另外,比利时安特卫普
大学,通用电气医疗集团,西门子医疗,东芝中风研究中心和纽约州立大学水牛城分校的都
针对 GPU 加速 CT 重建进行了各自的研究,不仅如此,西门子医疗用 GPU 实现了加速 MRI
中的 GRAPPA 自动校准,完成 MR 重建,快速 MRI 网格化,随机扩散张量磁共振图像
(DT-MRI)连通绘图等算法。其他的一些研究者则把医学成像中非常重要的二维与三维图
像中器官分割(如 Level Set 算法)       ,不同来源图像的配准,重建体积图像的渲染等也移植到
GPU 上进行计算。

3.4 数据库与数据挖掘
    面对当前海量增加的数据,搜索数据库并找到有用信息已经成为一个巨大的计算难题。
学术界以及微软、Oracle、SAP 等公司的研究人员正在研究利用 GPU 的强大计算能力来找
到一款可扩展的解决方案。
    加利福尼亚大学的 Santa Cruz 等      (现任职于 Oracle)      比较早地提出把 GPU 强大的运算能
力应用于数据库技术。         2009 年 Oracle 的 Blas, Tim Kaldewey 在 IEEE Spectrum 上著文分析为
什么图形处理器将彻底改变数据库处理(Why graphics processors will transform database
processing) 在另一篇文章中他们探索了利用 GPU 实现并行的搜索算法[27],
           ,                                                          如并行二分搜
索和 P-ary 搜索;  更多的研究者如深圳先进技术研究院和香港中文大学的 S. Chen, A. Heng,               P.
加州伯克利大学的 Nadathur Satish[28],微软研究院的 Naga K. Govindaraju 等[29],瑞典的
Erik Sintorn 等[30]则研究了在 GPU 上实现高效率的并行排序算法。香港科技大学的
Bingsheng He 等研究了使用 GPU 进行查询协同处理[31]。
    在数据挖掘领域,HP 实验室的 Wu,Zhang,Hsu 等研究了使用 GPU 对商业智能分析进
行加速[32]。福尼吉亚理工大学的 Sean P. Ponce 在其硕士论文中应用算法转换于临时数据挖
掘,使其数据并行化,更适合在 GPU 上实现加速[33]。北卡罗来纳州立大学的 Y. Zhang 和
美国橡树岭国家实验室的 X. Cui 联合研究了利用 CUDA 加速文本挖掘,开发了优化的文本
搜索算法[34]。马里兰大学的 Schatz,Trapnel 等开发的 Cmatch 和 MUMmerGPU[35][36],
在 GPU 上实现了高效的的后缀树算法,能够对一系列查询字符串及其子串进行并行搜索,
从而进行快速准确的字符串匹配。香港科技大学的 Fang 和微软亚洲研究院的 He 等开发了
一个小工具 GPUMiner,实现了 K-均值聚类算法和先验频率模式挖掘算法,用 CPU 对控制
数据 I/O 和 CPU 与 GPU 之间的数据传输,用 CPU 和 GPU 联合实现并行算法并提供可视化
界面[26]。
    另有一些研究者正在研究将 Map-Reduce 架构扩展到 GPU 上实现。香港科技大学的
Bingsheng He 和 Wenbin Fang 在单 GPU 上开发的 Mars,目前已经包含字符串匹配,矩阵乘
法,倒序索引,字词统计,网页访问排名,网页访问计数,相似性评估和 K 均值等 8 项应
用,能够在 32 与 64 位的 linux 平台下运行[37]。德克萨斯大学的 Alok Mooley 等也在分布
式的 GPU 网络上实现了功能类似的系统 DisMaRC[38]。加州伯克利大学的 Bryan Catanzaro
等则在基于 CUDA 实现的 Map-Reduce 框架下实现了 SVM(Support Vector Machine,支持
向量机)的训练和分类。


4、总结和展望
   GPU 拥有超高的计算密度和显存带宽,         CPU+GPU 混合架构凭借其高性能、     低功耗等优
势在许多领域有优异的表现。巨大的运算能力让人们对 GPU 充满期待,似乎在一夜之间,
GPU 用于通用计算(General Purpose GPU)及其相关方面的问题成为一个十分热门的话题。
视频编解码应用、矩阵运算及仿真、医疗行业应用、生命科学研究等需要大量重复的数据集
运算和密集的内存存取,纷纷利用 GPU 实现了比 CPU 强悍得多的计算能力[39]。
   展望未来 GPU 发展,以下几个问题是必须解决的。首先是分支预测能力,GPU 需要拥
有更好的分支能力,才能运行更多复杂程序,更好的利用 cache 来掩盖分支的延迟;然后是
更大的缓存和 Shared memory(AMD 称之为 LDS ,Local Data Share),这种共享寄存器负
责共享数据和临时挂起线程,容量越大,线程跳转和分支能力就越强;线程粒度同样重要,
粒度越细能够调用并行度来进行指令延迟掩盖的机会越大,性能衰减越小,而细化粒度对
GPU 的线程仲裁机制要求很大。
   GPU 发展到今天,已经突破了无数技术屏障,最初因图形处理而诞生的硬件发展成为
今天大规模并行计算领域的明星。我们完全可以相信 GPU 的架构还会不断优化,并被越来
越多的大型计算所采用。


参考文献:
[1] 张舒,褚艳丽等著, GPU 高性能计算之 CUDA, 中国水利水电出版社, 2009
[2] John D. Owens, Mike Houston,et al,GPU Computing, Proceedings of the IEEE, Vol. 96, No. 5,
    May 2008
[3] GPGPU website, http://gpgpu.org/
[4] 10 年 GPU 通用计算回顾, http://vga.zol.com.cn/172/1721480.html
[5] Programming Guide:ATI Stream Computing,
    http://developer.amd.com/gpu/ATIStreamSDK/assets/ATI_Stream_SDK_CAL_Programming_
    Guide_v2.0%5B1%5D.pdf
[6] Fermi Compute Architecture White Paper
    http://www.nvidia.com/content/PDF/fermi_white_papers/NVIDIA_Fermi_Compute_Architect
    ure_Whitepaper.pdf
[7] John D. Owens1, David Luebke, et al, A Survey of General-Purpose Computation on Graphics
    Hardware, COMPUTER GRAPHICS forum, Volume 26 (2007), number 1 pp. 80–113
[8] NVIDIA CUDA Programming Guide
    http://developer.download.nvidia.com/compute/cuda/2_0/docs/NVIDIA_CUDA_Programmin
    g_Guide_2.0.pdf
[9] OpenCL Website, http://www.khronos.org/opencl/
[10] 维基百科 OpenCL Website, http://en.wikipedia.org/wiki/OpenCL
[11] 百度百科 DirectCompute Website, http://baike.baidu.com/view/3245449.html?fromTaglist
[12] Technical Overview:ATI Stream Computing,
     http://developer.amd.com/gpu_assets/Stream_Computing_Overview.pdf
[13] 维基百科 GPGPU Website, http://en.wikipedia.org/wiki/GPGPU
[14] Matlab Parallel Computing, http://www.mathworks.com/products/parallel-computing/
[15] Jacket Website, http://www.accelereyes.com/
[16] http://www.nvidia.com/object/builtforadobepros.html
[17] AMAX GPU 集群开创高性能计算新纪元, http://server.zol.com.cn/189/1891144.html
[18] Announcing Cluster GPU Instances for Amazon EC2, http://aws.amazon.com/ec2/
[19] GPU VSIPL: High-Performance VSIPL Implementation for GPUs
     http://gpu-vsipl.gtri.gatech.edu/
[20] NVIDIA Performance Primitives (NPP) Library
     http://developer.nvidia.com/object/npp_home.html
[21] CUDA Vision and Imaging Library, http://www.cuvilib.com/
[22] GPU4Vision, http://gpu4vision.icg.tugraz.at/
[23] OpenVIDIA: Parallel GPU Computer Vision
     http://openvidia.sourceforge.net/index.php/OpenVIDIA
[24] SiftGPU: A GPU Implementation of Scale Invariant Feature Transform (SIFT)
     http://www.cs.unc.edu/~ccwu/siftgpu/
[25] Multisvm Website, http://code.google.com/p/multisvm/
[26] GPUMiner Website, http://code.google.com/p/gpuminer/
[27] Parallel Search On Video Cards
     http://www.usenix.org/event/hotpar09/tech/full_papers/kaldeway/kaldeway.pdf
[28] Nadathur Satis, et al, Designing Efficient Sorting Algorithms for Manycore GPUs, 23rd IEEE
        International Parallel and Distributed Processing Symposium, May 2009
     http://mgarland.org/files/papers/gpusort-ipdps09.pdf
[29] Naga K. Govindaraju, et al, GPUTeraSort:High Performance Graphics Coprocessor Sorting
for Large Database Management, Microsoft Technical Report 2005
     http://research.microsoft.com/pubs/64572/tr-2005-183.pdf
[30] Erik Sintorn, et al, Fast Parallel GPU-Sorting Using a Hybrid Algorithm,
     http://www.cse.chalmers.se/~uffe/hybridsort.pdf
[31] GPUQP: Query Co-Processing Using Graphics Processors, http://www.cse.ust.hk/gpuqp/
[32] Ren Wu, et al, GPU-Accelerated Large Scale Analytics, HP Laboratories
     http://www.hpl.hp.com/techreports/2009/HPL-2009-38.pdf
[33] Sean P. Ponce, Towards Algorithm Transformation for Temporal Data Mining on GPU,
      Master Thesis of Sean P. Ponce, Virginia Polytechnic Institute and State University
     http://scholar.lib.vt.edu/theses/available/etd-08062009-133358/unrestricted/ponce-thesis.pdf
[34] Yongpeng Zhang, Frank Mueller, et al, GPU-Accelerated Text Mining, EPHAM’09
     http://moss.csc.ncsu.edu/~mueller/ftp/pub/mueller/papers/epham09.pdf
[35] Cmatch: Fast Exact String Matching on the GPU,http://www.cbcb.umd.edu/software/cmatch/

[36] MUMmerGPU: High-throughput sequence alignment using Graphics Processing Units
     http://sourceforge.net/apps/mediawiki/mummergpu/index.php?title=MUMmerGPU
[37] Mars: A MapReduce Framework on Graphics Processors
     http://www.cse.ust.hk/gpuqp/Mars.html
[38] DisMaRC: A Distributed Map Reduce framework on CUDA
     http://www.cs.utexas.edu/~karthikm/dismarc.pdf
[39] NVIDIA 行业软件解决方案,http://www.nvidia.cn/object/vertical_solutions_cn.html

More Related Content

Similar to GPU通用计算调研报告

ProtoStar:“次世代”的移动端渲染
ProtoStar:“次世代”的移动端渲染ProtoStar:“次世代”的移动端渲染
ProtoStar:“次世代”的移动端渲染Ning Hu
 
TI702_Android_MID
TI702_Android_MIDTI702_Android_MID
TI702_Android_MIDguestd2ec7f
 
GTC Taiwan 2017 NVIDIA VRWorks SDK 加速性能與提升 VR 使用經驗
GTC Taiwan 2017 NVIDIA VRWorks SDK 加速性能與提升 VR 使用經驗GTC Taiwan 2017 NVIDIA VRWorks SDK 加速性能與提升 VR 使用經驗
GTC Taiwan 2017 NVIDIA VRWorks SDK 加速性能與提升 VR 使用經驗NVIDIA Taiwan
 
Microsoft CNTK, Cognitive Toolkit 微軟深度學習工具
Microsoft CNTK, Cognitive Toolkit 微軟深度學習工具Microsoft CNTK, Cognitive Toolkit 微軟深度學習工具
Microsoft CNTK, Cognitive Toolkit 微軟深度學習工具HO-HSUN LIN
 
王團 01-15 考題 & 解答
王團  01-15 考題 & 解答王團  01-15 考題 & 解答
王團 01-15 考題 & 解答T客邦
 
Tiny6410um hw-20101026
Tiny6410um hw-20101026Tiny6410um hw-20101026
Tiny6410um hw-20101026syed_sifa
 
使用Qt+和open gl®+创建跨平台可视化ui
使用Qt+和open gl®+创建跨平台可视化ui使用Qt+和open gl®+创建跨平台可视化ui
使用Qt+和open gl®+创建跨平台可视化uilsdsjy
 
麗明營造 NVIDIA 使用成效分享
麗明營造 NVIDIA 使用成效分享麗明營造 NVIDIA 使用成效分享
麗明營造 NVIDIA 使用成效分享NVIDIA Taiwan
 
Gentek应用介绍20111123
Gentek应用介绍20111123Gentek应用介绍20111123
Gentek应用介绍20111123oemgame
 
高效益、設計專利保護 如何達成雙贏?
高效益、設計專利保護 如何達成雙贏?高效益、設計專利保護 如何達成雙贏?
高效益、設計專利保護 如何達成雙贏?NVIDIA Taiwan
 
GPU和视频编解码
GPU和视频编解码GPU和视频编解码
GPU和视频编解码pluschen
 
First nVidia Tegra 4 SmartPhone - Xiaomi Mi-3 (TDSCDMA/China Mobile) (Simple ...
First nVidia Tegra 4 SmartPhone - Xiaomi Mi-3 (TDSCDMA/China Mobile) (Simple ...First nVidia Tegra 4 SmartPhone - Xiaomi Mi-3 (TDSCDMA/China Mobile) (Simple ...
First nVidia Tegra 4 SmartPhone - Xiaomi Mi-3 (TDSCDMA/China Mobile) (Simple ...JJ Wu
 
Deep learning hardware architecture and software deploy with docker
Deep learning hardware architecture and software deploy with dockerDeep learning hardware architecture and software deploy with docker
Deep learning hardware architecture and software deploy with dockerYa-Lun Li
 
Bro hyper mill-2016-1-tw
Bro hyper mill-2016-1-twBro hyper mill-2016-1-tw
Bro hyper mill-2016-1-twRandy_lee
 
VR-Zone 中文版 - 追蹤新奇科技脈動 2012 Issue 3
VR-Zone 中文版 - 追蹤新奇科技脈動 2012 Issue 3VR-Zone 中文版 - 追蹤新奇科技脈動 2012 Issue 3
VR-Zone 中文版 - 追蹤新奇科技脈動 2012 Issue 3VR-Zone .com
 
First nVidia Tegra K1 Tablet - Xiaomi Tablet(Simple Chinese Only)
First nVidia Tegra K1 Tablet - Xiaomi Tablet(Simple Chinese Only)First nVidia Tegra K1 Tablet - Xiaomi Tablet(Simple Chinese Only)
First nVidia Tegra K1 Tablet - Xiaomi Tablet(Simple Chinese Only)JJ Wu
 

Similar to GPU通用计算调研报告 (20)

ProtoStar:“次世代”的移动端渲染
ProtoStar:“次世代”的移动端渲染ProtoStar:“次世代”的移动端渲染
ProtoStar:“次世代”的移动端渲染
 
TI702_Android_MID
TI702_Android_MIDTI702_Android_MID
TI702_Android_MID
 
GTC Taiwan 2017 NVIDIA VRWorks SDK 加速性能與提升 VR 使用經驗
GTC Taiwan 2017 NVIDIA VRWorks SDK 加速性能與提升 VR 使用經驗GTC Taiwan 2017 NVIDIA VRWorks SDK 加速性能與提升 VR 使用經驗
GTC Taiwan 2017 NVIDIA VRWorks SDK 加速性能與提升 VR 使用經驗
 
Microsoft CNTK, Cognitive Toolkit 微軟深度學習工具
Microsoft CNTK, Cognitive Toolkit 微軟深度學習工具Microsoft CNTK, Cognitive Toolkit 微軟深度學習工具
Microsoft CNTK, Cognitive Toolkit 微軟深度學習工具
 
9439AD2
9439AD29439AD2
9439AD2
 
王團 01-15 考題 & 解答
王團  01-15 考題 & 解答王團  01-15 考題 & 解答
王團 01-15 考題 & 解答
 
Tiny6410um hw-20101026
Tiny6410um hw-20101026Tiny6410um hw-20101026
Tiny6410um hw-20101026
 
使用Qt+和open gl®+创建跨平台可视化ui
使用Qt+和open gl®+创建跨平台可视化ui使用Qt+和open gl®+创建跨平台可视化ui
使用Qt+和open gl®+创建跨平台可视化ui
 
麗明營造 NVIDIA 使用成效分享
麗明營造 NVIDIA 使用成效分享麗明營造 NVIDIA 使用成效分享
麗明營造 NVIDIA 使用成效分享
 
Gentek应用介绍20111123
Gentek应用介绍20111123Gentek应用介绍20111123
Gentek应用介绍20111123
 
LinkIt 7697 IoT tutorial
LinkIt 7697 IoT tutorialLinkIt 7697 IoT tutorial
LinkIt 7697 IoT tutorial
 
How to Make a Scanning Drone in Chinese
How to Make a Scanning Drone in ChineseHow to Make a Scanning Drone in Chinese
How to Make a Scanning Drone in Chinese
 
高效益、設計專利保護 如何達成雙贏?
高效益、設計專利保護 如何達成雙贏?高效益、設計專利保護 如何達成雙贏?
高效益、設計專利保護 如何達成雙贏?
 
GPU和视频编解码
GPU和视频编解码GPU和视频编解码
GPU和视频编解码
 
First nVidia Tegra 4 SmartPhone - Xiaomi Mi-3 (TDSCDMA/China Mobile) (Simple ...
First nVidia Tegra 4 SmartPhone - Xiaomi Mi-3 (TDSCDMA/China Mobile) (Simple ...First nVidia Tegra 4 SmartPhone - Xiaomi Mi-3 (TDSCDMA/China Mobile) (Simple ...
First nVidia Tegra 4 SmartPhone - Xiaomi Mi-3 (TDSCDMA/China Mobile) (Simple ...
 
Deep learning hardware architecture and software deploy with docker
Deep learning hardware architecture and software deploy with dockerDeep learning hardware architecture and software deploy with docker
Deep learning hardware architecture and software deploy with docker
 
Bro hyper mill-2016-1-tw
Bro hyper mill-2016-1-twBro hyper mill-2016-1-tw
Bro hyper mill-2016-1-tw
 
Lecture 3
Lecture 3Lecture 3
Lecture 3
 
VR-Zone 中文版 - 追蹤新奇科技脈動 2012 Issue 3
VR-Zone 中文版 - 追蹤新奇科技脈動 2012 Issue 3VR-Zone 中文版 - 追蹤新奇科技脈動 2012 Issue 3
VR-Zone 中文版 - 追蹤新奇科技脈動 2012 Issue 3
 
First nVidia Tegra K1 Tablet - Xiaomi Tablet(Simple Chinese Only)
First nVidia Tegra K1 Tablet - Xiaomi Tablet(Simple Chinese Only)First nVidia Tegra K1 Tablet - Xiaomi Tablet(Simple Chinese Only)
First nVidia Tegra K1 Tablet - Xiaomi Tablet(Simple Chinese Only)
 

GPU通用计算调研报告

  • 1. GPU 通用计算调研报告 东南大学 杨春山 revised by 同济大学 程微宏 摘要:NVIDIA 公司在 1999 年发布 GeForce256 时首先提出 GPU(图形处理器)的概念,随后 大量复杂的应用需求促使整个产业蓬勃发展至今。GPU 在这十多年的演变过程中,我们看到 GPU 从最初帮助 CPU 分担几何吞吐量,到 Shader(着色器)单元初具规模,然后出现 Shader 单元可编程性, 到今天 GPU 通用计算领域蓬勃发展这一清晰轨迹。 本报告首先根据搜集到的 资料记录 GPU 通用计算的发展过程中硬件和软件的演变, 然后介绍并简要比较现在比较流行 的 GPU 通用计算编程模型,最后对 GPU 通用计算在不同领域的成功应用进行概述。 关键词:GPU GPU 通用计算 可编程单元 编程模型 GPGPU 应用 1、GPU 通用计算的背景和动机 GPU 英文全称 Graphic Processing Unit,中文翻译为“图形处理器”。GPU 从诞生之 日起就以超越摩尔定律的速度发展, 运算能力不断提升。 业界很多研究者注意到 GPU 进行计 算的潜力, 2003 年 SIGGRAPH 大会上提出了 GPGPU General-purpose computing on graphics 于 ( processing units)的概念。GPU 逐渐从由若干专用的固定功能单元(Fixed Function Unit)组 成的专用并行处理器向以通用计算资源为主,固定功能单元为辅的架构转变。 1.1 为什么要用 GPU 进行计算 GPU 在处理能力和存储器带宽上相对于 CPU 有明显优势,在成本和功耗上也不需要 付出太大代价。由于图形渲染的高度并行性,使得 GPU 可以通过增加并行处理单元和存储 器控制单元的方式提高处理能力和存储器带宽。 GPU 设计者将更多的晶体管用作执行单元, 而不是像 CPU 那样用作复杂的控制单元和缓存并以此来提高少量执行单元的执行效率[1]。 图 1 对 CPU 与 GPU 中的逻辑架构进行了对比。 图 1 CPU 和 GPU 逻辑架构对比 CPU 的整数计算、分支、逻辑判断和浮点运算分别由不同的运算单元执行,此外还有 一个浮点加速器。因此,CPU 面对不同类型的计算任务会有不同的性能表现。而 GPU 是由 同一个运算单元执行整数和浮点计算,因此,GPU 的整型计算能力与其浮点能力相似。目 前,主流 GPU 都采用了统一架构单元,凭借强大的可编程流处理器阵容,GPU 在单精度浮 点运算方面将 CPU 远远甩在身后[1]。最顶级的英特尔 Core i7 965 处理器,在默认情况下, 它的浮点计算能力只有 NVIDIA GeForce GTX 280 的 1/13,与 AMD Radeon HD 4870 相比 差距就更大。
  • 2. 图 2 CPU 和 GPU 的每秒浮点运算次数和存储器带宽 GPU 运算相对于 CPU 还有一项巨大的优势,那就是其内存子系统,也就是 GPU 上的 显存[1]。当前桌面级顶级产品 3 通道 DDR3-1333 的峰值是 32GB/S,实测中由于诸多因素 带宽在 20 GB/S 上下浮动。AMD HD 4870 512MB 使用了带宽超高的 GDDR5 显存,内存总 线数据传输率为 3.6T/s 或者说 107GB/s 的总线带宽。 NVIDIA GTX280 使用了高频率 GDDR3 显存,但是其显存控制器支持的位宽达到了 512bit,搭载 16 颗 0.8ns GDDR3 显存,带宽高 达惊人的 142GB/s。而主流 GPU 普遍拥有 40-60 GB/s 显存带宽。存储器的超高带宽让巨大 的浮点运算能力得以稳定吞吐,也为数据密集型任务的高效运行提供了保障。 还有,从 GTX200 和 HD 4870 系列 GPU 开始,AMD 和 NVIDIA 两大厂商都开始提供 对双精度运算的支持, 这正是不少应用领域的科学计算都需要的。 NVIDIA 公司最新的 Fermi 架构更是将全局 ECC(Error Checking and Correcting)、可读写缓存、分支预测等技术引入 到 GPU 的设计中,明确了将 GPU 作为通用计算核心的方向。 GPU 通用计算被越来越多的采用,除了 GPU 本身架构的优越性,市场需求也是重要的 原因。比如很多企业或科研单位无法布置昂贵的的计算机集群,而大部分普通用户 PC 上装
  • 3. 配的 GPU 使用率很低, 提高 GPU 利用率的有效途径就是将软件的部分计算任务分配到 GPU 上,从而实现高性能、低功耗的最终目标。 1.2 什么适合 GPU 进行计算 尽管 GPU 计算已经开始崭露头角,但 GPU 并不能完全替代 X86 解决方案,很多操作 系统、软件以及部分代码现在还不能运行在 GPU 上,所谓的 GPU+CPU 异构超级计算机也 并不是完全基于 GPU 进行计算。一般而言适合 GPU 运算的应用有如下特征[2]: • 运算密集。 • 高度并行。 • 控制简单。 • 分多个阶段执行。 符合这些条件或者是可以改写成类似特征的应用程序,就能够在 GPU 上获取较高的性 能。 2、GPU 通用计算的前世今生 GPU 通用计算其实是从 GPU 渲染管线发展来的。GPU 渲染管线的主要任务是完成 3D 模型到图像的渲染工作。常用的图形学 API(DirectD/OpenGL)编程模型中渲染过程被分成 几个可以并行处理的阶段, 分别由 GPU 中渲染管线的不同单元进行处理。 GPU 渲染管线 在 的不同阶段,需要处理的对象分别是顶点(Vertex)、几何图元(primitive) 、片元(fragment)、 像素(pixel) 。图形渲染过程具有内在的并行性:顶点之间、图元之间、片元之间的数据相 关性很弱,对它们的计算可以独立并行进行,这使得通过并行处理提高吞吐量成为可能[3]。 这儿不对 GPU 渲染管线进行详细介绍, 而是着重于介绍 GPU 可编程器件和编程模型的发展 历程。 2.1 GPU 可编程器件的发展 1999 年 8 月,NVIDIA 正式发表了具有跨世纪意义的产品 NV10——GeForce 256。 GeForce256 是业界第一款 256bit 的 GPU, 也是全球第一个集成 T&L Transforming&Lighting ( 几何光照转换)、动态光影、三角形设置/剪辑和四像素渲染等 3D 加速功能的图形引擎。通 过 T&L 技术, 显卡不再是简单像素填充机以及多边形生成器, 它还将参与图形的几何计算从 而将 CPU 从繁重的 3D 管道几何运算中解放出来。可以说,T&L 技术是显卡进化到 GPU 的标 志。 从某种意义上说,GeForce 256 开创了一个全新的 3D 图形时代,再到后来 GeForce 3 开始引入可编程特性, 能将图形硬件的流水线作为流处理器来解释, 基于 GPU 的通用计算也 开始出现。GeForce3 被用于实现矩阵乘法运算和求解数学上的扩散方程,这是 GPU 通用计 算的早期应用。 研究人员发现,要实现更加复杂多变的图形效果,不能仅仅依赖三角形生成和硬件 T&L 实现的固定光影转换,而要加强顶点和像素运算能力。Shader(着色器)就是在这样的背景 下提出的。Pixel Shader(顶点着色器)和 Vertex Shader(像素着色器)的硬件逻辑支持 可编程的像素和顶点,虽然当时可编程性很弱,硬件限制太多,顶点部分出现可编程性,像 素部分可编程性有限,但这的确是硬件 T&L 之后 PC 图形技术的又一重大飞跃。3D 娱乐的视 觉体验也因此向接近真实迈进了一大步。 可编程管线的引入, 也为 GPU 发展翻开了新的篇章, GPU 开始向 SIMD(Single Instruction Multiple Data,单指令多数据流)处理器方向发展,凭借 强大的并行处理性能,使得 GPU 开始用有了部分流式处理器特征。
  • 4. 1 随后到来的 DirectX 9.0 时代, Shader 单元具备了更强的可编程性。 让 2002 年底微软 发布的 DirectX 9.0 中,Pixel Shader 单元的渲染精度已达到浮点精度,传统的硬件 T&L 单元也被取消。全新的 Vertex Shader 编程将比以前复杂得多,新的 Vertex Shader 标准增 加了流程控制,更多的常量,每个程序的着色指令增加到了 1024 条。 Shader Model 2.0 时代突破了以前限制 PC 图形图像质量在数学上的精度障碍,它的每 条渲染流水线都升级为 128 位浮点颜色, 让游戏程序设计师们更容易更轻松的创造出更漂亮 的效果,让程序员编程更容易。而从通用性方面理解,支持浮点运算让 GPU 已经具备了通用 计算的基础,这一点是至关重要的。 图形流水线中可编程单元的行为由 Shader 单元定义,着色器的性能由 DirectX 中规定 的 Shader Model 来区分,并可以由高级的 Shading 语言(例如 NV 的 Cg,OpenGL 的 GLSL, Microsoft 的 HLSL)编写。Shader 源码被译为字节码,然后在运行时由驱动程序将其转化 为基于特定 GPU 的二进制程序, 具备可移植性好等优势。 传统的图形渲染流线中有两种不同 的可编程着色器, 分别是顶点着色单元 (Vertex Shader, 和像素着色单元 VS) (Pixel Shader, PS)。 在 Shader Model 4.0 之前,VS 和 PS 两种着色器的架构既有相同之处,又有一些不同。 两者处理的都是四元组数据(顶点着色器处理用于表示坐标的 w、x、y、z,但像素着色器 处理用于表示颜色的 a、r、g、b),顶点渲染需要比较高的计算精度;而像素渲染则可以 使用较低的精度,从而可以增加在单位面积上的计算单元数量。传统的分离架构中,两种着 色器的比例往往是固定的。在 GPU 核心设计完成时,各种着色器的数量便确定下来,比如著 名的“黄金比例”——顶点着色器与像素着色器的数量比例为 1:3。但不同的游戏对顶点 资源和像素资源的计算能力要求是不同的。 如果场景中有大量的小三角形, 则顶点着色器必 须满负荷工作,而像素着色器则会被闲置;如果场景中有少量的大三角形,又会发生相反的 情况。因此,固定比例的设计无法完全发挥 GPU 中所有计算单元的性能。 Shader Model 4.0 统一了两种着色器,顶点和像素着色器的规格要求完全相同,都支 持 32 位浮点数。这是 GPU 发展的一个分水岭。过去只能处理顶点和只能处理像素的专门处 理单元被统一之后, 更加适应通用计算的需求, 应用程序调用着色器运算能力的效率也更高。 DirectX 11 提出的 Shader Model 5.0 版本继续强化了通用计算的地位,微软提出的全 新 API—Direct Compute 将把 GPU 通用计算推向新的巅峰。同时 Shader Model 5.0 是完全 针对流处理器而设定的,所有类型的着色器,如:像素、顶点、几何、计算、Hull 和 Domaim (位于 Tessellator 前后)都将从新指令集中获益[4]。 着色器的可编程性也随着架构的发展不断提高,下表给出每代模型的大概特点[1]。 Shader Model GPU 代表 显卡时代 特点 1999 年第一 DirectX 7 GPU 可以处理顶点的矩阵变换和 代 NV 进行光照计算 (T&L) 操作固定, , 1999~2001 Geforce256 功能单一,不具备可编程性 SM 1.0 2001 年第二 DirectX 8 将图形硬件流水线作为流处理器 代 NV 来解释,顶点部分出现可编程性, 像素部分可编程性有限(访问纹 1 DirectX 并不是一个单纯的图形 API,它是由微软公司开发的用途广泛的 API,它包含有 Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects 等多个组件,它提 供了一整套的多媒体接口方案。只是其在 3D 图形方面的优秀表现,让它的其它几个组件几乎被人们忽略。
  • 5. Geforce3 理的方式和格式受限,不支持浮 点) SM 2.0 2003 年 DirectX 顶点和像素可编程性更通用化, 9.0b 像素部分支持 FP16/24/32 浮点, ATI R300 可包含上千条指令,处理纹理更 和第三代 NV 加灵活:可用索引进行查找,也 Geforce FX 不再限制[0,1]范围, 从而可用作 任意数组(这一点对通用计算很 重要) SM 3.0 2004 年 DirectX 顶点程序可以访问纹理 VTF,支 9.0c 持动态分支操作,像素程序开始 第四代 NV 支持分支操作(包括循环、 Geforce 6 if/else 等),支持函数调用, 和 ATI X1000 64 位浮点纹理滤波和融合,多个 绘制目标 SM 4.0 2007 年 DirectX 10 统一渲染架构,支持 IEEE754 浮 点标准,引入 Geometry Shader 第五代 NV 2007~2009 (可批量进行几何处理),指令 G80 和 ATI 数从 1K 提升至 64K, 寄存器从 32 R600 个增加到 4096 个,纹理规模从 16+4 个提升到 128 个,材质 Texture 格式变为硬件支持的 RGBE 格式,最高纹理分辨率从 2048*2048 提升至 8192*8192 SM 5.0 2009 年 DirectX 11 明确提出通用计算 API Direct Compute 概念和 Open CL 分庭抗 ATI RV870 2009~ 衡,以更小的性能衰减支持 和 2010 年 NV IEEE754 的 64 位双精度浮点标 GF100 准,硬件 Tessellation 单元,更 好地利用多线程资源加速多个 GPU 表1 Shader Model 版本 2.2 AMD 与 NVIDIA 最新 GPU 架构比较 在图形计算领域,NVIDIA 和 ATI/AMD 把持着民用市场的绝大部分份额和大部分专用 市场。为了抢占更大的市场,两家公司不断曾经改进自家 GPU 的架构以实现更逼真的 3D 效果, 现在他们同样代表了 GPU 通用计算的方向, 这儿对两家公司最新的 GPU 架构进行简 单的分析和比较。
  • 6. AMD 的最新 GPU 架构是 RV870,又被命名为 Cypress,采用了第二代“TeraScale 2”核 心架构。RV870 包括流处理器在内的所有核心规格都比上一代架构 RV770 翻了一倍,也就 是“双核心”设计,几乎是并排放置两颗 RV770 核心,另外在装配引擎内部设计有两个 Rasterizer 光栅器) Hierarchial-Z ( 和 (多级 Z 缓冲模块) 以满足双倍核心规格的胃口。 , RV870 的晶体管数量的达到了 21 亿个,流处理器也从 RV770 时代的 800 个扩充到了 1600 个,每 个流处理器单元的“1 大 4 小”结构包括一个全功能 SP 单元和 4 个能执行乘加运算的 SP[5]。 NVIDIA 的最新 GPU 架构是 GF100,又被命名为 Fermi,这是 NVIDIA 为了抢占 GPU 通用计算性能制高点和完整支持 DirectX 11 而设计的架构。GF100 拥有三层分级架构:4 个 GPC (Graphics Processing Clusters,图形处理图团簇) 16 个 SM 、 (Streaming Multiprocessors, 流阵列多处理器) 512 个 CUDA 核心。 、 每个 GPC 包括 4 个 SM,每个 SM 包括 32 个 CUDA 核心。一个完整的的 GF100 还有 6 个内存控制器(Memory Controller) 。GF100 核心,除具 备前一代架构 GT200 的 L1 纹理缓存之外,还拥有真正意义的可读写 L1 缓存和 L2 缓存。 GF100 的晶体管数量达到了 30 亿个,可以认为 GF100 是一颗 4 核心(GPC)处理器,因为 GPC 几乎是一颗全能的处理器[6]。 两种架构最明显的区别就是流处理器结构。RV870 选择延续上一代非统一执行架构 GPU 产品的 SIMD 结构,用庞大的规模效应压制对手,偏向于 ILP(Instruction-Level Parallelism,指令并行度) 方向, GF100 则使用了 G80 以来创新的 MIMD 而 (Multiple Instruction Multiple Data)架构,更偏重于 TLP(Thread-Level Parallelism,线程并行度)方向。在单指 令多数据流(SIMD)的结构中,单一控制部件向每条流水线分派指令,同样的指令被所有 处理部件同时执行。另一种控制结构多指令多数据流(MIMD)中,每条流水线都能够独立 于其他流水线执行不同的程序。MIMD 能比较有效率地执行分支程序,而 SIMD 体系结构 运行条件语句时会造成很低的资源利用率。TLP 要求强大的仲裁机制,丰富的共享 cache 和 寄存器资源以及充足的发射端,这些都是极占晶体管的部件,幸好 Fermi 架构在增大缓存和 分支论断上迈出了坚实的一步。 图 3 NVIDIA 和 AMD 使用了两种不同的流处理器架构 两种架构的另一个不同在于它们的缓存配置,虽然在在 RV870 与 GF100 上,我们都看
  • 7. 到了一级缓存与二级缓存的设计。AMD RV870 提供了 32KB 的 LDS(Local Data Store) ,作 用类似于 NVIDIA 传统的 shared memory, 但是目前的资料来看这个 LDS 并不具备配置为硬 件 cache 的能力。GF100 同时提供了 shared memory 和 cache,并允许程序员选择对它们的 划分。 GF100 的每个 SM 都有 64KB 可配置为 48KB shared memory + 16KB L1 cache 或者 16KB shared memory + 48KB L1 cache 的高速片上 RAM。AMD 的 RV870 提供了 64KB Global Data Shared,本质上是一个可读写的 cache, 可用于各个 SIMD Core 之间的数据交换。 GF100 提供了 768KB 的一体化 L2 cache,这个 L2 cache 为所有的 Load/Store 以及纹理请求 提供高速缓存,对所有的 SM 来说 L2 cache 上的数据都是连贯一致的,从 L2 cache 读取到 的数据就是最新的数据。RV870 的 L2 cache 则不能提供 GF100 中 L2 Cache 共享内核间数 据的特性。 还有一个不同是两家厂商选择了不同的最小线程执行粒度。 粒度越细, 能够调用并行度 来进行指令延迟掩盖的机会越大,性能衰减越小。细化粒度偏向 TLP 方向,对 GPU 的线程 仲裁机制要求很大,最终会导致硬件开销过大。GPU 通用计算中最小的执行单位是线程 (Thread) ,多个线程会被打包成一个线程束,NVIDIA 称线程束为 Warp,AMD 称之为 Frontwave。Frontwave 包含 64 个线程,NVIDIA 的线程管理粒度更小,每个 Warp 包含 32 个线程。RV870 每凑够 64 个线程,仲裁器就会动作一次,把一个 Frontwave 发送给空闲的 一个 SIMD Core。NVIDIA 的 GF100 比较特殊,还存在 Half-Warp,也就是说每 16 个线程就 可以发送给 SM 一次。Half-Warp 由线程中的前 16 个线程或者后 16 个线程组成。 还要提到的是 GF100 架构首次在 GPU 中引入全局 ECC(Error Checking and Correcting 内存错误检查和修复) 。在使用 GPU 做大数据量的处理和高性能计算的时候,ECC 有大量 的需求,尤其在医疗图像处理和大型集群中,ECC 是非常有用的特性。 总体来说,两家厂商的差异在于:AMD 堆砌了更大规模的运算器单元,NVIDIA 则更 注重如何利用有限的运算器资源。AMD 将更多的晶体管消耗在大量的 SIMD Core 单元上, NVIDIA 则将更多的晶体管消耗在仲裁机制、 丰富的共享缓存资源和寄存器资源以及充足的 发射端方面。 AMD 的 GPU 偏向于 ILP 结构, NVIDIA 偏向于 TLP 结构。 (线程并行度) TLP 考验线程能力和并行能力,ILP(指令并行度)则考验指令处理。 2.3 GPU 通用计算编程模型 GPU 通用计算通常采用 CPU+GPU 异构模式,由 CPU 负责执行复杂逻辑处理和事务处 理等不适合数据并行的计算, GPU 负责计算密集型的大规模数据并行计算。 由 这种利用 GPU 强大处理能力和高带宽弥补 CPU 性能不足的计算方式在发掘计算机潜在性能,在成本和性 价 比 方面 有显 著 的优 势。 在 2007 年 NVIDIA 推 出 CUDA ( Compute Unified Device Architecture,统一计算设备架构)之前,GPU 通用计算受硬件可编程性和开发方式的制约, 开发难度较大。2007 年以后,CUDA 不断发展的同时,其他的 GPU 通用计算标准也被相继 提出,如由 Apple 提出 Khronos Group 最终发布的 OpenCL,AMD 推出的 Stream SDK, Microsoft 则在其最新的 Windows7 系统中集成了 DirectCopmute 以支持利用 GPU 进行通用 计算。 2.3.1 传统 GPU 通用计算开发 最早的 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 编译效率很低,并且只能使用像素着色
  • 8. 器(Pixel Shader)进行运算。受 GPU 架构限制,Brook 也缺乏有效的数据通信机制。AMD 在其 GPGPU 通用计算产品 Stream 中采用 Brook 的改进版本 Brook+作为高级开发语言。 Brook+的编译器工作方式与 Brook 不同,提高了效率[7]。 2.3.2 CUDA –C/C++及其 SDK 2007 年 6 月, NVIDIA 推出了 CUDA 技术。 CUDA 是一种将 GPU 作为数据并行计算设 备的软硬件体系, 硬件上 NVIDIA GeForce 8 系列以后的 GPU (包括 GeForce、ION、Quadro、 Tesla 系列) 已经采用支持 CUDA 的架构, 软件开发包上 CUDA 也已经发展到 CUDA Toolkit 3.2(截止到 2010 年 11 月) ,并且支持 Windows、Linux、MacOS 三种主流操作系统。CUDA 采用比较容易掌握的类 C 语言进行开发,而且正在开发适用于 CUDA 架构的用于科学计算 的 Fortran 版本。无论是 CUDA C-语言或是 OpenCL,指令最终都会被驱动程序转换成 PTX (Parallel Thread Execution,并行线程执行,CUDA 架构中的指令集,类似于汇编语言)代 码,交由显示核心计算[8]。 CUDA 编程模型将 CPU 作为主机(Host) ,GPU 作为协处理器(co-processor)或者设 备(Device) 。在一个系统中可以存在一个主机和若干个设备。CPU、GPU 各自拥有相互独 立的存储地址空间:主机端内存和设备端显存。CUDA 对内存的操作与一般的 C 程序基本 相同,但是增加了一种新的 pinned memory;操作显存则需要调用 CUDA API 存储器管理函 数。一旦确定了程序中的并行部分,就可以考虑把这部分计算工作交给 GPU。运行在 GPU 上的 CUDA 并行计算函数称为 kernel(内核函数) 。一个完整的 CUDA 程序是由一系列的设 备端 kernel 函数并行步骤和主机端的串行处理步骤共同组成的。 这些处理步骤会按照程序中 相应语句的顺序依次执行,满足顺序一致性。 图 4 异构编程模型 CUDA SDK 提供的 API 分为 CUDA runtime API(运行时 API)和 CUDA driver API(驱
  • 9. 动程序 API) 。CUDA runtime API 在 CUDA driver API 的基础上进行了封装,隐藏了一些实 现细节,编程更加方便。CUDA runtime API 函数前都有 CUDA 前缀。CUDA driver API 是一 种基于句柄的底层接口,可以加载二进制或汇编形式的 kernel 模块,指定参数并启动运算。 CUDA driver API 编程复杂,但有时能通过直接操作硬件的执行实现一些更加复杂的功能或 者获得更高的性能。 由于它使用的设备端代码是二进制或者汇编代码, 因此可以在各种语言 中调用。 CUDA driver API 所有函数的前缀为 cu。 另外 CUDA SDK 也提供了 CUFFT (CUDA Fast Fourier Transform,基于 CUDA 的快速傅立叶变换) 、CUBLAS(CUDA Basic Linear Algebra Subprograms, 基于 CUDA 的基本矩阵与向量运算库) CUDPP 和 (CUDA Data Parallel Primitives,基于 CUDA 的常用并行操作函数)等函数库,提供了简单高效的常用函数供开 发者直接使用。 从 CUDA Toolkit3.0 开始支持 NVIDIA 最新的 Fermi 架构,最大程度上利用 Fermi 架构 在通用计算方面的优势。CUDA 3.0 也开始支持 C++的继承和模板机制提高编程灵活性,同 时 CUDA C/C++内核现在以标准 ELF 格式进行编译,开始支持硬件调试,还增加了一个新 的 Direct3D、OpenGL 统一协作 API,支持 OpenGL 纹理和 Direct3D 11 标准,支持所有的 OpenCL 特征。 2.3.3 OpenCL OpenCL (Open Computing Language,开放计算语言) 是一个为异构平台编写程序的框 架, 此异构平台可由 CPU、 GPU 或其他类型的处理器组成。 OpenCL 由用于编写 kernels (在 OpenCL 设备上运行的函数)的语言(基于 C99)和一组用于定义并控制平台的 API 组成。 OpenCL 提供了基于任务分区和数据分区的并行计算机制。 OpenCL 最初由 Apple 公司开发,Apple 拥有其商标权,并在与 AMD,IBM,Intel 和 NVIDIA 技术团队的合作之下初步完善。 随后,Apple 将这一草案提交至 Khronos Group。 2008 年 6 月 16 日,Khronos 的通用计算工作小组成立。5 个月后的 2008 年 11 月 18 日,该工作 组完成了 OpenCL 1.0 规范的技术细节。 该技术规范在由 Khronos 成员进行审查之后, 2008 于 年 12 月 8 日公开发表。2010 年 6 月 14 日,OpenCL 1.1 发布[9]。 OpenCL 也是基于 C 的一个程式语言,分为 Platform Layer、Runtime、Compiler 三个部 分: Platform Layer 用来管理计算装置, 提供启始化装置的界面, 并用来建立 compute contexts 和 work-queues。Runtime 用来管理资源,并执行程序的 kernel。Compiler 则是 ISO C99 的 子集合, 并加上了 OpenCL 特殊的语法。 OpenCL 的执行模型中, 在 有所谓的 Compute Kernel 和 Compute Program。 Compute Kernel 基本上类似于 CUDA 定义的 kernel,是最基本的的 计算单元; Compute Program 则是 Compute Kernel 和内建函数的集合, 而 类似一个动态函数 库。很大程度上 OpenCL 与 CUDA Driver API 比较相像。 自从 2008 年 12 月 NVIDIA 在 SIGGRAPH Asia 大会上在笔记本电脑上展示全球首款 OpenCL GPU 演示以来,AMD、NVIDIA、Apple、RapidMind、Gallium3D、ZiiLABS、IBM、 Intel 先后发布他们自己的 OpenCL 规范实现 (当一台机器上存在不同厂家的支持 OpenCL 的 设备时,这样也给开发应用程序带来不统一的一些麻烦) 。除了 AMD 和 NVIDIA,其他厂 商如 S3、VIA 等也纷纷发布他们支持 OpenCL 的硬件产品[10]。 2.3.4 DirectCopmute Directcompute 是一种由 Microsoft 开发和推广的用于 GPU 通用计算的应用程序接口, 集成在 Microsoft DirectX 内, 允许 Windows Vista 或 Windows 7 平台上运行的程序利用 GPU 进行通用计算。 虽然 DirectCompute 最初在 DirectX 11 API 中得以实现, 但支持 DX10 的 GPU 可以利用此 API 的一个子集进行通用计算 (DirectX 10 内集成 Directcompute 4.0,DirectX 10.1
  • 10. 内集成 Directcompute 4.1) ,支持 DirectX11 的 GPU 则可以使用完整的 DirectCompute 功能 (DirectX 11 内集成 Directcompute 5.0)。Directcompute 和 OpenCL 都是开放标准,得到 NVIDIA CUDA 架构和 ATI Stream 技术的支持。 Windows 7 增加了视频即时拖放转换功能, 可以将电脑中的视频直接转换到移动媒体播 放器上,如果电脑中的 GPU 支持 Directcompute,那么这一转换过程就将由 GPU 完成。其 转换速度将达到 CPU 的 5-6 倍。Internet Explorer 9 加入了对 Directcompute 技术的支持,可 以调用 GPU 对网页中的大计算量元素做加速计算,另外 Excel2010、Powerpoint2010 均提供 Directcompute 技术支持[11]。 2.3.5 Stream SDK AMD 的流计算模型其实也包含了流处理器架构和相应的软件包。AMD 在 2007 年 12 月发布运行在 Windows XP 系统下的 Steam SDK v1.0, 此 SDK 采用了 Brook+作为开发语言, Brook+是 AMD 对斯坦福大学开发的 Brook 语言(基于 ANSI C)的改进版本。Stream SDK 为开发者提供对系统和平台开放的标准以方便合作者开发第三方工具。 软件包包含了如下组 件:支持 Brook+的编译器,支持流处理器的设备驱动 CAL(Compute Abstraction Layer) , 程序库 ACML(AMD Core Math Library)以及内核函数分析器。 图 5 AMD 流计算软件系统之间的关系 在 Stream 编程模型中,在流处理器上执行的程序称为 kernel(内核函数) ,每个运行在 SIMD 引擎的流处理器上的 kernel 实例称为 thread(线程) 线程映射到物理上的运行区域称 , 为执行域。 流处理器调度线程阵列到线程处理器上执行, 直到所有线程完成后才能运行下一 个内核函数。 Brook+是流计算的上层语言,抽象了硬件细节,开发者编写能够运行在流处理器上的 内核函数,只需指定输入输出和执行域,无需知道流处理器硬件的实现。Brook+语言中两 个关键特性是:Stream 和 Kernel。Stream 是能够并行执行的相同类型元素的集合;Kernel 是能够在执行域上并行执行的函数。Brook+软件包包含 brcc 和 brt。brcc 是一个源语言对源 语言的编译器,能够将 Brook+程序翻译成设备相关的 IL(Intermediate Language),这些代 码被后续链接、 执行。 是一个可以执行内核函数的运行时库, brt 这些库函数有些运行在 CPU 上, 有些运行在流处理器上。 运行在流处理器上的核函数库又称为 CAL (Compute Abstraction Layer)。CAL 是一个用 C 编写的设备驱动库,允许开发者在保证前端一致性的同时对流处
  • 11. 理器核心从底层进行优化。CAL 提供了设备管理、资源管理、内核加载和执行、多设备支 持、 3D 图形 API 交互等功能。 与 同时, Stream SDK 也提供了常用数学函数库 ACML (AMD Core Math Library)供开发者快速获得高性能的计算。ACML 包括基本完整的线性代数子例 程、FFT 运算例程、随机数产生例程和超越函数例程[12]。 面对 NVIDIA 在 GPU 通用计算上的不断创新, AMD 也不甘示弱, 不断改进自己的 Stream SDK。 截止到 2010 年 11 月,AMD 发布了 Stream SDK v2.2,能够在 WindowsXP SP3、Windows 7 和部分 Linux 发行版上运行,开始支持 OpenCL 1.1 规范和双精度浮点数操作。 3、GPU 通用计算的应用领域 从 SIGGRAPH 2003 大会首先提出 GPU 通用计算概念,到 NVIDIA 公司 2007 年推出 CUDA 平台,GPU 通用计算依靠其强大的计算能力和很高的存储带宽在很多领域取得了成 功。越来越多的信号告诉我们,GPU 通用计算是一片正在被打开的潜力巨大的市场[13]。 GPGPU 项目研究中的先行者是英国剑桥大学的 BionicFx 课题组。早在 2004 年 9 月, 剑桥大学的 BionicFx 课题组便宣布在 NVIDIA 的 GeForce FX 5900 产品中实现了专业的实时 音频处理功能,并且准备进行商业化的运作,对其产品进行销售,给音乐创作者带来实惠。 在随后的一段时间,GPGPU 进入了深入研究阶段,但是由于编程语言架构和编程环境都难 以通用,该领域的发展能力受到广泛质疑。就在人们认为 GPGPU 的研究即将偃旗息鼓的时 候,ATI 在 2006 年 8 月惊人地宣布即将联手斯坦福大学在其 Folding@Home 项目中提供对 ATI Radeon X1900 的支持。在显卡加入 Folding@Home 项目后,科研进展速度被成倍提升, 人们第一次感受到了 GPU 的运算威力。 毫无疑问,在 GPGPU 研究上,ATI 跨出了极具意义的一步。同时将 GPGPU 的应用领 域和普及程度推向高潮。随后 NVIDIA 凭借 GeForce 8800GTX 这款业界首个 DirectX 10 GPU,在 GPU 通用计算方面实现了大步跨越,特别是 CUDA 概念的提出(该工具集的核心 是一个 C 语言编译器) ,在新的通用计算领域后来居上。 下面对 GPU 通用计算在各个领域的成功应用做一个概述。 图 6 不同项目使用 CUDA 后获得的加速比 3.1 常见软件 最新版本的 MATLAB 2010b 中 Parallel Computing Toolbox 与 MATLAB Distributed Computing Server 的最新版本可利用 NVIDIA 的 CUDA 并行计算架构在 NVIDIA 计算能力
  • 12. 1.3 以上的 GPU 上处理数据, 执行 GPU 加速的 MATLAB 运算, 将用户自己的 CUDA Kernel 函数集成到 MATLAB 应用程序当中。 另外, 通过在台式机上使用 Parallel Computing Toolbox 以及在计算集群上使用 MATLAB Distributed Computing Server 来运行多个 MATLAB worker 程序,从而可在多颗 NVIDIA GPU 上进行计算[14]。AccelerEyes 公司开发的 Jacket 插件也 能够使 MATLAB 利用 GPU 进行加速计算。Jacket 不仅提供了 GPU API(应用程序接口) , 而且还集成了 GPU MEX 功能。在一定程度说,Jacket 是一个完全对用户透明的系统,能够 自动的进行内存分配和自动优化。 Jacket 使用了一个叫“on-the- fly”的编译系统, MATLAB 使 交互式格式的程序能够在 GPU 上运行。目前,Jacket 只是基于 NVIDIA 的 CUDA 技术,但 能够运行在各主流操作系统上[15]。 Photoshop 虽然已经支持多核心处理器,但在某些时候的速度仍然让人抓狂,比如打开 一个超大文件,或者应用一个效果复杂的滤镜。从 Photoshop CS4 开始,Adobe 将 GPU 通 用计算技术引入到自家的产品中来。GPU 可提供对图像旋转、缩放和放大平移这些常规浏 览功能的加速,还能够实现 2D/3D 合成,高质量抗锯齿,HDR 高动态范围贴图,色彩转换 等。而在 Photoshop CS5 中,更多的算法和滤镜也开始支持 GPU 加速。另外,Adobe 的其 他产品如 Adobe After Effects CS4、Adobe Premiere Pro CS4 也开始使用 GPU 进行加速。这 些软件借助的也是 NVIDIA 的 CUDA 技术[16]。 下一代主流操作系统 Windows 7 的核心组成部分包括了支持 GPU 通用计算的 Directcompute API,为视频处理、动态模拟等应用进行加速。Windows 7 借助 Directcompute 增加了对由 GPU 支持的高清播放的 in-the-box 支持, 可以流畅观看, 同时 CPU 占用率很低。 Internet Explorer 9 加入了对 Directcompute 技术的支持, 可以调用 GPU 对网页中的大计算量 元素做加速计算;Excel2010、Powerpoint2010 也开始提供对 Directcompute 技术的支持。 3.2 高性能计算 超级计算机一般指在性能上居于世界领先地位的计算机, 通常有成千上万个处理器以及 专门设计的内存和 I/O 系统。它们采用的架构与通常的个人计算机有很大区别,使用的技术 也随着时代和具体应用不断变动。 GPU 通用计算提出以后, 不断有超级计算机开始安装 GPU 以提高性能。2010 年 9 月,全球超级计算机领军企业 Cray 公司正式宣布,该公司将为 Cray XE6 系列产品开发基于 NVIDIA Tesla20 系列 GPU 的刀片服务器。2010 年 11 月揭晓的世界 上最快的超级计算机 top500 列表中, 最快的 5 个系统中有 3 个使用了 NVIDIA 的 Tesla 型号 GPU 产品,其中中国国防科技大学研发的“天河一号”荣膺榜首,最快运算速度达到 2.507 petaflops。2009 年 10 月 29 日完成的“天河一号”一期系统有 3072 颗 Intel Quad Core Xeon E5540 2.53GHz 和 3072 颗 Intel Quad Core Xeon E5450 3.0GHz 以及 2560 块 AMD Radeon HD 4870 X2,峰值性能为每秒 1206 万亿次(top500 中排名第 5) 。2010 年 10 月,升级优化后的 “天河一号”,配备了 14336 颗 Xeon X5670 处理器(32nm 工艺,六核 12 线程,2.93GHz 主 频) ,7168 块基于 NVIDIA Fermi 架构的 Tesla M2050 计算卡(主频 1.15GHz,双精度浮点性 能 515Gflops、 单精度浮点性能 1.03Tflops) 以及 2048 颗国防科技大学研制的飞腾处理器 (八 核 64 线程, 主频 1GHz) 峰值性能每秒 4700 万亿次、 , 持续性能每秒 2507 万亿次 (LINPACK 实测值) 。 计算机集群 (简称集群) 是一种通过松散集成的计算机软件和硬件连接起来高度紧密地 完成计算工作的系统, 采用将计算任务分配到集群的不同计算节点而提高计算能力, 主要应 用在科学计算领域。 比较流行的集群采用 Linux 操作系统和其它一些免费软件来完成并行运 算。 2006 年 10 月,全球最大的分布式计算项目——Folding@home 中提供对 ATI Radeon X1900 的支持后,任何一台个人电脑都可以下载客户端参与,科研进展速度被成倍提升。该
  • 13. 项目可精确地模拟蛋白质折叠和错误折叠的过程,以便能更好地了解多种疾病的起因和发 展。在目前的大约 10 万台参与该项目的计算机中,仅有的 11370 颗支持 CUDA 的 GPU 提 供总计算能力的一半,而运行 Windows 的 CPU 共计 208268 颗,却只能提供该项目总能力 的约 6%的计算[1]。 早在 2007 年, AMAX, Supermicro 等公司就已经开始探索和研究 GPU 用于服务器和集 群。时至今日,AMAX 已成为集 CPU+GPU 塔式服务器、机柜式服务器、CPU+GPU 集群 等几十种系列产品的生产和销售为一体的一站式 GPU 解决方案供应商,可以满足不同领域 科研群体的计算需求。 AMAX GPU 集群相对于传统 CPU 集群产品, 可以以十分之一的价格, 二十分之一的功耗, 获得 20-150 倍的计算性能提高和 60%的空间节余。 AMAX 采用 NVIDIA 支持大规模并行计算的 CUDA 架构 GPU,支持 IEEE 754 单精度和双精度浮点计算,支持 CUDA 编程环境、 多种编程语言和 API, 包括 C、 + +、 C OpenCL、DirectCompute 或 Fortran, 支持 ECC、NVIDIA Parallel DataCache 技术,以及 NVIDIA GigaThread 引擎技术,支持异 步传输和系统监控功能[17]。目前众多科研机构和公司(如哈佛大学、中国科学院、剑桥大 学、英国航空公司等等)都已经架设了基于 NVIDIA Tesla(支持 CUDA)系列 GPU 的通用 计算机集群。2010 年 7 月,AMD 也宣称其合作伙伴,荷兰公司 ClusterVision,已经开始利 用其新一代的 Opteron 处理器(12 核心 CPU)和 FireStream 图形计算加速卡组建服务器集 群。 云计算指服务的交付和使用模式,通过网络以按需、易扩展的方式获得所需的服务。 “云”是一些可以自我维护和管理的虚拟计算资源,通常为一些大型服务器集群,包括计算服 务器、存储服务器、宽带资源等等。此前的种种云计算,都是通过网络传输 CPU 的运算能 力,为客户端返回计算结果或者文件;而 GPU 云计算则偏重于图形渲染运算或大规模并行 计算。2009 年 10 月,NVIDIA 联合 Mental Images 公司推出基于 GPU 的云计算平台 RealityServer,利用 Tesla RS 硬件和 RealityServer 3.0 软件,为 PC、笔记本、上网本、智能 手机提供逼真的交互式 3D 图形渲染服务。2010 年 11 月,Amazon 与 NVIDIA 宣布推出基 于亚马逊集群 GPU 计算实例(Amazon Cluster GPU Instances)的 EC2 (弹性计算云) 服务[18], 亚马逊 GPU 集群实例提供了 22GB 的存储容量, 33.5 个 EC2 计算单元, 并且利用亚马逊 EC2 集群网络为高性能计算和数据集中处理提供了很高的吞吐量和低延迟。每一个 GPU 实例都 配有两个 NVIDIA Tesla(R) M2050 GPU, 提供了甚至超过每秒 100 万兆次的双精度浮点计算 的超高的性能。 通过 GPU 实例的数百个内核并行处理能力, 许多工作负载可以被大大加速。 3.3 信号与图像处理 很多信号与图像处理算法的计算密度非常高,随着 GPU 通用计算的快速发展,越来越 多的算法实现了在 GPU 上运行,获得令人满意的加速。在 NVIDIA 推出 CUDA 技术之前, 尽管开发不方便,不少研究者利用图形 API 和各种 Shader 语言(HLSL、GLSL、Cg 等)实 现了一些图像分割、CT 图像重建、快速傅立叶变换、图像以及音视频编解码等算法。AMD 的 Brook+尤其是 CUDA 技术的推出极大地方便了在 GPU 上开发信号与图像处理并行算法。 AMD 的 Stream SDK 和 NVIDIA 的 CUDA SDK 发布时就包含了各自经优化后的基本线 性代数例程(BLAS)和快速傅立叶变换库(FFT) 。2008 年 Georgia Tech 的 Andrew Kerr 等 开发了基于 CUDA 平台的 VSIPL(Vector Signal Image Processing Library)[19],支持向量和 矩阵运算,快速 FIR(Finite Impulse Response,有限冲击响应)滤波,矩阵的 QR 分解等; 2009 年 6 月,NVIDIA 又发布了专注于图像和视频处理的库 NPP(NVIDIA Performing Primitives) 对一些统计函数、 , JPEG 编解码、 滤波函数、 边缘检测算法进行了封装[20]; 2010 年 8 月, TunaCode 宣布对 NPP 库进行扩展, 推出了 CUVI Lib(CUDA for Vision and Imaging Lib),增加了 NPP 中不包含的一些高级计算机视觉和图像处理算法,如光流法、离散小波
  • 14. 变换、Hough 变换、颜色空间转换等[21]。另外,2010 年 9 月,Graz 大学的研究人员发布 了专用于图像边缘分割的 GPU4Vision 库,用 GPU 实现图像分割算法的加速[22]。NVIDIA 主导的 OpenVIDIA 项目在 2010 年 6 月发布了 CUDA VisionWorkbench v 1.3.1.0,里面使用 OpenGL,Cg,CUDA-C 等语言,而且支持 OpenCL 和 DirectCompute 的例子会于近期添加, 该项目实现了立体视觉、光流法、特征跟踪的一些算法[23]。 在特征提取领域,瑞典的 Marten Bjorkman 和美国北卡罗来纳大学的 Wu 等实现了基于 CUDA 的 SIFT(Lowe's Scale Invariant Feature Transform,尺度不变特征)的提取[24];北卡 罗来纳州立大学的 Christopher Zach 等则在 GPU 上实现 KLT 算法用于视频中的特征跟踪。 在机器学习领域, 斯坦福大学的 Rajat Raina 等在 GPU 上实现了大规模深度无监督算法 DBNs (Deep Belief Networks)和稀疏编码(Sparse Coding)算法;谷歌上的开源项目 multisvm 则基于 CUDA 实现了 SVM(Support Vector Machine,支持向量机)的多分类器,实验表明 加速效果明显[25]。 另外值得一提的是, 医学成像是最早利用 GPU 计算加快性能的应用之一, GPU 通用计 算在这一领域的应用日趋成熟,当前许多医学成像领域的算法已在 GPU 上实现。Digisens 和 Acceleware AxRecon 已经分别开发出能够利用 GPU 进行计算的用于 X 线 CT 和电子断层 摄影术的 3D 成像软件和在无损图像质量的情况下可实时重建图像的软件。Techniscan 的开 发人员在其新一代全乳房超声波成像系统中将其专有的逆向散射算法在 CUDA 平台上实 现,获得很高的加速比。东京大学 Takeyoshi Dohi 教授与他的同事则在其实时医疗成像的裸 眼立体成像系统中使用 GPU 加速体绘制过程和后期文件格式转换。另外,比利时安特卫普 大学,通用电气医疗集团,西门子医疗,东芝中风研究中心和纽约州立大学水牛城分校的都 针对 GPU 加速 CT 重建进行了各自的研究,不仅如此,西门子医疗用 GPU 实现了加速 MRI 中的 GRAPPA 自动校准,完成 MR 重建,快速 MRI 网格化,随机扩散张量磁共振图像 (DT-MRI)连通绘图等算法。其他的一些研究者则把医学成像中非常重要的二维与三维图 像中器官分割(如 Level Set 算法) ,不同来源图像的配准,重建体积图像的渲染等也移植到 GPU 上进行计算。 3.4 数据库与数据挖掘 面对当前海量增加的数据,搜索数据库并找到有用信息已经成为一个巨大的计算难题。 学术界以及微软、Oracle、SAP 等公司的研究人员正在研究利用 GPU 的强大计算能力来找 到一款可扩展的解决方案。 加利福尼亚大学的 Santa Cruz 等 (现任职于 Oracle) 比较早地提出把 GPU 强大的运算能 力应用于数据库技术。 2009 年 Oracle 的 Blas, Tim Kaldewey 在 IEEE Spectrum 上著文分析为 什么图形处理器将彻底改变数据库处理(Why graphics processors will transform database processing) 在另一篇文章中他们探索了利用 GPU 实现并行的搜索算法[27], , 如并行二分搜 索和 P-ary 搜索; 更多的研究者如深圳先进技术研究院和香港中文大学的 S. Chen, A. Heng, P. 加州伯克利大学的 Nadathur Satish[28],微软研究院的 Naga K. Govindaraju 等[29],瑞典的 Erik Sintorn 等[30]则研究了在 GPU 上实现高效率的并行排序算法。香港科技大学的 Bingsheng He 等研究了使用 GPU 进行查询协同处理[31]。 在数据挖掘领域,HP 实验室的 Wu,Zhang,Hsu 等研究了使用 GPU 对商业智能分析进 行加速[32]。福尼吉亚理工大学的 Sean P. Ponce 在其硕士论文中应用算法转换于临时数据挖 掘,使其数据并行化,更适合在 GPU 上实现加速[33]。北卡罗来纳州立大学的 Y. Zhang 和 美国橡树岭国家实验室的 X. Cui 联合研究了利用 CUDA 加速文本挖掘,开发了优化的文本 搜索算法[34]。马里兰大学的 Schatz,Trapnel 等开发的 Cmatch 和 MUMmerGPU[35][36], 在 GPU 上实现了高效的的后缀树算法,能够对一系列查询字符串及其子串进行并行搜索,
  • 15. 从而进行快速准确的字符串匹配。香港科技大学的 Fang 和微软亚洲研究院的 He 等开发了 一个小工具 GPUMiner,实现了 K-均值聚类算法和先验频率模式挖掘算法,用 CPU 对控制 数据 I/O 和 CPU 与 GPU 之间的数据传输,用 CPU 和 GPU 联合实现并行算法并提供可视化 界面[26]。 另有一些研究者正在研究将 Map-Reduce 架构扩展到 GPU 上实现。香港科技大学的 Bingsheng He 和 Wenbin Fang 在单 GPU 上开发的 Mars,目前已经包含字符串匹配,矩阵乘 法,倒序索引,字词统计,网页访问排名,网页访问计数,相似性评估和 K 均值等 8 项应 用,能够在 32 与 64 位的 linux 平台下运行[37]。德克萨斯大学的 Alok Mooley 等也在分布 式的 GPU 网络上实现了功能类似的系统 DisMaRC[38]。加州伯克利大学的 Bryan Catanzaro 等则在基于 CUDA 实现的 Map-Reduce 框架下实现了 SVM(Support Vector Machine,支持 向量机)的训练和分类。 4、总结和展望 GPU 拥有超高的计算密度和显存带宽, CPU+GPU 混合架构凭借其高性能、 低功耗等优 势在许多领域有优异的表现。巨大的运算能力让人们对 GPU 充满期待,似乎在一夜之间, GPU 用于通用计算(General Purpose GPU)及其相关方面的问题成为一个十分热门的话题。 视频编解码应用、矩阵运算及仿真、医疗行业应用、生命科学研究等需要大量重复的数据集 运算和密集的内存存取,纷纷利用 GPU 实现了比 CPU 强悍得多的计算能力[39]。 展望未来 GPU 发展,以下几个问题是必须解决的。首先是分支预测能力,GPU 需要拥 有更好的分支能力,才能运行更多复杂程序,更好的利用 cache 来掩盖分支的延迟;然后是 更大的缓存和 Shared memory(AMD 称之为 LDS ,Local Data Share),这种共享寄存器负 责共享数据和临时挂起线程,容量越大,线程跳转和分支能力就越强;线程粒度同样重要, 粒度越细能够调用并行度来进行指令延迟掩盖的机会越大,性能衰减越小,而细化粒度对 GPU 的线程仲裁机制要求很大。 GPU 发展到今天,已经突破了无数技术屏障,最初因图形处理而诞生的硬件发展成为 今天大规模并行计算领域的明星。我们完全可以相信 GPU 的架构还会不断优化,并被越来 越多的大型计算所采用。 参考文献: [1] 张舒,褚艳丽等著, GPU 高性能计算之 CUDA, 中国水利水电出版社, 2009 [2] John D. Owens, Mike Houston,et al,GPU Computing, Proceedings of the IEEE, Vol. 96, No. 5, May 2008 [3] GPGPU website, http://gpgpu.org/ [4] 10 年 GPU 通用计算回顾, http://vga.zol.com.cn/172/1721480.html [5] Programming Guide:ATI Stream Computing, http://developer.amd.com/gpu/ATIStreamSDK/assets/ATI_Stream_SDK_CAL_Programming_ Guide_v2.0%5B1%5D.pdf [6] Fermi Compute Architecture White Paper http://www.nvidia.com/content/PDF/fermi_white_papers/NVIDIA_Fermi_Compute_Architect ure_Whitepaper.pdf [7] John D. Owens1, David Luebke, et al, A Survey of General-Purpose Computation on Graphics Hardware, COMPUTER GRAPHICS forum, Volume 26 (2007), number 1 pp. 80–113
  • 16. [8] NVIDIA CUDA Programming Guide http://developer.download.nvidia.com/compute/cuda/2_0/docs/NVIDIA_CUDA_Programmin g_Guide_2.0.pdf [9] OpenCL Website, http://www.khronos.org/opencl/ [10] 维基百科 OpenCL Website, http://en.wikipedia.org/wiki/OpenCL [11] 百度百科 DirectCompute Website, http://baike.baidu.com/view/3245449.html?fromTaglist [12] Technical Overview:ATI Stream Computing, http://developer.amd.com/gpu_assets/Stream_Computing_Overview.pdf [13] 维基百科 GPGPU Website, http://en.wikipedia.org/wiki/GPGPU [14] Matlab Parallel Computing, http://www.mathworks.com/products/parallel-computing/ [15] Jacket Website, http://www.accelereyes.com/ [16] http://www.nvidia.com/object/builtforadobepros.html [17] AMAX GPU 集群开创高性能计算新纪元, http://server.zol.com.cn/189/1891144.html [18] Announcing Cluster GPU Instances for Amazon EC2, http://aws.amazon.com/ec2/ [19] GPU VSIPL: High-Performance VSIPL Implementation for GPUs http://gpu-vsipl.gtri.gatech.edu/ [20] NVIDIA Performance Primitives (NPP) Library http://developer.nvidia.com/object/npp_home.html [21] CUDA Vision and Imaging Library, http://www.cuvilib.com/ [22] GPU4Vision, http://gpu4vision.icg.tugraz.at/ [23] OpenVIDIA: Parallel GPU Computer Vision http://openvidia.sourceforge.net/index.php/OpenVIDIA [24] SiftGPU: A GPU Implementation of Scale Invariant Feature Transform (SIFT) http://www.cs.unc.edu/~ccwu/siftgpu/ [25] Multisvm Website, http://code.google.com/p/multisvm/ [26] GPUMiner Website, http://code.google.com/p/gpuminer/ [27] Parallel Search On Video Cards http://www.usenix.org/event/hotpar09/tech/full_papers/kaldeway/kaldeway.pdf [28] Nadathur Satis, et al, Designing Efficient Sorting Algorithms for Manycore GPUs, 23rd IEEE International Parallel and Distributed Processing Symposium, May 2009 http://mgarland.org/files/papers/gpusort-ipdps09.pdf [29] Naga K. Govindaraju, et al, GPUTeraSort:High Performance Graphics Coprocessor Sorting for Large Database Management, Microsoft Technical Report 2005 http://research.microsoft.com/pubs/64572/tr-2005-183.pdf [30] Erik Sintorn, et al, Fast Parallel GPU-Sorting Using a Hybrid Algorithm, http://www.cse.chalmers.se/~uffe/hybridsort.pdf [31] GPUQP: Query Co-Processing Using Graphics Processors, http://www.cse.ust.hk/gpuqp/ [32] Ren Wu, et al, GPU-Accelerated Large Scale Analytics, HP Laboratories http://www.hpl.hp.com/techreports/2009/HPL-2009-38.pdf [33] Sean P. Ponce, Towards Algorithm Transformation for Temporal Data Mining on GPU, Master Thesis of Sean P. Ponce, Virginia Polytechnic Institute and State University http://scholar.lib.vt.edu/theses/available/etd-08062009-133358/unrestricted/ponce-thesis.pdf [34] Yongpeng Zhang, Frank Mueller, et al, GPU-Accelerated Text Mining, EPHAM’09 http://moss.csc.ncsu.edu/~mueller/ftp/pub/mueller/papers/epham09.pdf
  • 17. [35] Cmatch: Fast Exact String Matching on the GPU,http://www.cbcb.umd.edu/software/cmatch/ [36] MUMmerGPU: High-throughput sequence alignment using Graphics Processing Units http://sourceforge.net/apps/mediawiki/mummergpu/index.php?title=MUMmerGPU [37] Mars: A MapReduce Framework on Graphics Processors http://www.cse.ust.hk/gpuqp/Mars.html [38] DisMaRC: A Distributed Map Reduce framework on CUDA http://www.cs.utexas.edu/~karthikm/dismarc.pdf [39] NVIDIA 行业软件解决方案,http://www.nvidia.cn/object/vertical_solutions_cn.html