2024年5月27日发(作者:象雨文)
CN43 1258/TP
ISSN 1007一l3OX
计算机工程与科学
COMPUTER ENGINEERING 8L SCIENCE
2011年第33卷第3期
Vo1.33,No.3。2011
文章编号:1007—130X(2011)03 0041—05
模板操作在GPU上的实现与优化
Implementation and Optimization of
Stencil Applications on GPUs
方旭东,唐玉华,王桂彬,唐滔
FANG Xu—dong,TANG Yu—hua,WANG Gui—bin。TANG Tao
(国防科学技术大学计算机学院,湖南长沙410073)
(School of Computer Science,National University of Defense Technology,Changsha 410073,China)
摘 要:随着GPU的快速发展,使用GPU来加速科学计算应用已成为必然趋势。本文抽取了
SPEC2000中富含模板操作的Mgrid的两个典型子程序Rprj3和Interp,使用Brook+语言把它们移植到
AMD GPU上运行。采用Brook+语言提供的线程调节机制,我们实现了不同线程粒度下的程序版本,并
分析了加速比不同的原因,总结了线程粒度调节对模板程序移植的指导意义。我们使用AMD Radeon
HD4870 GPU作为实验平台,对比Intel Xeon E5405 CPU上的运行结果发现,在最大规模下,Rprj3获得
的相对于CPU版本的加速比为5.37×,Interp获得的相对于CPU版本的加速比为12.8×。
Abstract:With the fast development of GPUs,using them to accelerate scientific computing applica—
tions is becoming an inevitable trend.In this paper,we port two typical subroutines Rprj 3 and Interp
from Mgrid which contains rich stencil operations in SPEC2000 to run on an AMD GPU using Brook+.
Using a thread granularity tuning mechanism provided by Brook+,we implement different ported pro—
gram versions and analyze their performances.We also conclude how tO utilize thread granularity tuning
to optimize stencil program transplantati0n. Our experimental results show that under the largest prob—
lem size,Rprj3 obtains a speedup of 5.37 over its CPU version while Interp gains a speedup of 12.8 over
its CPU version.
关键词:GPU;优化;模板
Key words:GPU;optimization;stencil
doi:10.3969/j.issn.1007—130X.2011.03.008
中图分类号:TP303 文献标识码:A
解图形编程的细节,便可以着手在GPU上编写通
引言
近年来,随着GPU技术的发展,GPU的浮点
处理能力变得越来越强大。新的GPU体系结构
具有更好的可编程性和通用性,使编程人员无需了
用程序。这方面的语言有AMD的Brook+l】 和
NVIDIA的CUDAl2j。GPU的强大计算能力现已
被用于生物医学、计算流体动力学模拟和分子动力
学模拟等科学计算领域 。
现在的GPU虽然具有很强的计算能力,但由
收稿日期:2009—07 26;修订日期:2009 10-21
基金项目:国家自然科学基金资助项目(60621003)
通讯地址:410073湖南省长沙市国防科学技术大学计算机学院
Address:School of Computer Science,National University of Defense Technology,Changsha,Hunan 410073,P.R.China
41
于GPU最初用于图形处理,偏重处理的实时性,
其编译器自动优化程序的能力较弱。这就给编程
人员手工优化GPU程序提供了空间。本文从
Spec2000测试程序中选取了用于解偏微分方程的
Mgrid应用,从中抽取了典型的函数Interp和
Rprj3,将它们移植到AMD GPU平台上运行。In—
terp和Rprj3中大量的模板(Stencil)计算为优化
GPU程序提供了很好的机会 。我们采用通过调
节线程问并行性、增加线程内局部性的方法优化初
始的GPU代码。我们将AMD Radeon HD4870
GPU和Intel Xeon E54O5 CPU上的测试结果进
行对比发现,在最大规模下,Rprj3获得的相对于
CPU版本的加速比为5.37×,Interp获得的相对
于CPU版本的加速比为l2.8×。
2 背景
本节介绍在AMD GPU上用Brook+进行编
程的背景。
2.1异构平台介绍
使用GPU和通用CPU构建异构并行系统已
成为高性能计算领域的研究热点一s]。GPU强大的
浮点计算能力和超高的性能功耗比使得它们成为
非常好的CPU计算加速部件。一个典型的CPU—
口叩口叩口叩口叩口口叩叩口叩口叩=【 一l一一
GPU异构系统如图1所示。CPU和GPU之间存
在数据通信开销和调用开销。数据通信开销是指
口叩口叩口叩口叩口口叩叩口叩口叩ll~一椰一
计算前数据从CPU加载到GPU的开销和计算后
口口口口口口口口=叩叩叩叩叩叩叩叩一椰一~一
结果从GPU加载到CPU的开销。调用开销是指
从CPU发出调用指令到指令到达GPU命令处理
器的延迟。
PrT E
1 CPU GPU异构系统
2.2微体系结构
本文中我们采用AMD Radeon HD4870 GPU
作为CPU的加速器。AMD HD4800系列是
AMD GPU的最新产品,具有双精度浮点处理能
力,其使用的核心是RV770。如图2所示,在
RV770的数据并行阵列中拥有1O个SIMD引擎,
它们同时处理一个Kernel程序;每个SIMD引擎
又由16个线程处理器组成,这l6个线程处理器共
用一个程序计数器,所以它们之间是完全同步执行
42
的;线程处理器是一个超长指令字(VI IW)处理单
元,这个VI 1w包括4个标量计算核和1个超越
计算单元,一个线程处理器通过阻塞多线程的方式
同时运行4个线程。经过上述分析我们发现,
R770拥有800(10*16*5)个计算核,可以提供巨
大的计算能力。表1概括了Radeon HD4870的详
细性能参数。
线程分配处理器
圆
线程处理单元l l指令流和控制流
图2 RV77O微体系结构
表1 AMDs HD4870性能参数
参数 值 参数 值
M。 。 y CI。ck 993 MH
z
rocessors
8OO
Speed
Xt 。 4o M
emory Interface 256 bits
Units
Core Clock 750 M 。 y B “d 1 l5 GB/
Speed MHz width s
Mere。 y GDDR5 Single(double) 1.2 T(240G)
l ype Peak flops
在AMD流编程模型中,流(Streams)指可以
被并行操作的相同类型的数据集合,核(Kerne1)是
指可以在每个输出流元素上进行操作的并行函数。
线程(Thread)是指线程处理器上核的一次执行实
例。线程被映射到流处理器上执行,并以波阵面
(Wavefront)为单位调度。波阵面是指在SIMD引
擎上被同时执行和调度的一组线程。GPU硬件调
度通用寄存器(GPRs)、存储带宽等资源,直至所有
线程处理完毕。多个波阵面交织运行以隐藏访问
延迟。不同的SIMD引擎可以执行不同的指令,另
外流水线技术也被GPU硬件采用以获得性能提
升 。
2.3 Brook+流编程环境
AMD提供了完整的GPU编程环境,使得编
程人员可以方便快速地着手进行GPU上的程序
开发。程序员可以在两级抽象层次上编程,高层使
用Brook+,底层使用CAI (Compute Abstraction
Layer,简称CAI )。Brook+基于BrookGPUL ,
(2)使用多输出流(Multiple Output
Streams)。Brook+语言最多支持8条输出流l】]。
和使用单条输出流相比,使用多输出流后线程可以
执行更多的计算,同样增大了线程粒度。例如,使
用两条输出流可以把线程粒度增大一倍。而如果
是对C语言的扩展,支持显式的计算和数据并行。
Brook+作为一种高层的编程语言,屏蔽了体系结
构细节,保留了和现代图形硬件相关的特征。
CAL作为一种设备驱动库,提供向前兼容的接口,
可以直接和流处理器交互,所以CAL提供了更多
的优化机会。我们只在Brook+一级进行了移植
和优化。
3 优化策略
GPU更适合于处理计算密集型应用而非访存
密集型应用¨7]。为了充分发挥GPU的计算优势,
应该有足够多的线程来占用GPU提供的大量的
线程处理器。线程之间以波阵面为粒度调度,可以
有效隐藏访存延迟。另一方面,线程局部性
(Thread Locality)对于发掘计算中的数据复用、提
高程序性能也有很重要的作用。Mgrid中包含大
量的模板操作。所谓模板操作,是指在计算每个点
时都需要访问这个点的相邻点。所以,模板操作提
供了丰富的时间局部性和空间局部性优化的机会。
在Mgrid的模板操作中,有许多中间结果可以被
复用,这些复用不但可以增加线程内局部性,同时
能减少访存次数。一般来说,线程粒度越大,线程
内的计算密集性也越大,可以发掘的数据局部性也
更多。在AMD GPU中,线程的数目和线程的粒
度呈反比关系,线程粒度的大小决定了线程数量的
多少,所以我们可以调节线程粒度来达到线程内局
部性和线程间并行性的最佳平衡。Brook+中的
线程粒度是指一个线程可以计算模板操作网格点
的数目,调节线程粒度有如下两种方法:
(1)使用向量数据类型(Vector Types)。
Brook+语言提供的内置短向量由基本数据类型
加上它们的长度后缀构成,如“float4”和
“double2”。使用向量数据类型可以将输出流的长
度缩小向量长度倍,从而以相同倍数增大线程粒
度。例如,使用double2可以把线程粒度增大两
倍。和使用double的线程相比,使用double2的
线程可以在一个线程内同时计算两个点,从而两点
间计算的中间结果可以被复用。此外,使用向量数
据类型可以最多把4条标量访存指令打包到一条
向量访存指令中。如果Kernel程序访问的地址是
连续的,向量访存指令可以显著减少访存次数。
把向量数据类型和多输出流结合使用,我们可以得
到更大的线程粒度。例如,把double2和4条输出
流结合,线程的粒度就增大到了8倍。
需要注意的是,使用向量数据类型需要修改
Kernel中的数据索引,而使用多输出流需要分输
入流。而且,两种方法都增加了线程所需的通用寄
存器数量,从而减少了可被创建的线程数量。这些
附加的开销是否可以被调节线程粒度所获得的加
速比抵消,取决于Kernel的大小和特性。我们需
要通过实验来判定什么样的线程粒度是最好的。
4 实验测评
为了验证我们提出的优化方法的有效性,我们
用Brook+语言在AMD Radeon HD4870 GPU平
台上实现了Mgrid应用中的Rprj3和]nterp子函
数,并对其做了优化。所有的实验结果都和单线程
的CPU版本相比较。使用的CPU为Intel Xeon
E54O5 CPU,主频2GHz,带有256KB的一级缓存
和12MB的二级缓存。我们使用Intel ifort编译
器,优化选项为~O3。Mgrid是SPEC2000和
NASCAR benchmark中的重要测试程序,常用来
求解偏微分方程。
图3是Mgrid程序的结构图,可以看出Mgrid
的主要计算过程呈V字型,计算在多层网格和多
次迭代上进行。Rprj3和Interp是Mgrid中的重
要子程序,被多次调用。其中Rprj3进行精细网格
(Fine Grid)到粗糙网格(Coarse Grid)的投影计
算;Interp的计算方向相反,它进行从粗糙网格到
精细网格的插值计算。
Fi tC d
【一一
图3 Mgrid程序结构图
我们使用4种线程粒度,分别是double,doub
43
le2,double2和2条输出流,double2和4条输出
流。假设使用double的线程可以计算N个点,那
么使用double2,double2和2条输出流,double2
和4条输出流的线程分别可以计算2N、4N和8N
个点。为叙述方便起见,我们用N、2N、4N和8N
来指代不同的线程粒度。
4.1对Rprj3的优化效果
我们采用第3节提出的优化方法,对Rprj3进
行移植和优化。从图4a可以看出,除了问题规模
为16。时,4种线程粒度下加速比都小于1.0,其它
规模下程序的加速比都大于1.O。这是因为把计
算移植到GPU上运行会引起数据通信开销和调
用开销,小规模的情况下,移植程序所得的收益不
足以抵消附带开销。所以,把程序移植到GPU上
运行需要考虑问题的计算规模。
在问题规模为32。时,加速比随着线程粒度的
增大而增大。说明此时线程粒度的增大更好地开
发了线程内数据局部性,同时又没有影响线程间的
并行性。在问题规模为64。时,线程粒度的增加都
使得加速比得到了提高。特别是线程粒度为2N
时,加速比达到了最大值6.01,说明此时线程内数
据局部性和线程问数据并行性达到了最佳平衡。
在最大问题规模128。时,加速比随着线程粒
度的增大反而减小。这是因为在较大的问题规模
下,线程数越多,越有利于开发并行性。而线程粒
度的增加虽然提高了线程内数据局部性,但是大大
减少了线程数量,最终使得加速比下降。在该规模
下,增加线程粒度并没有得到预期的优化效果,说
明本文提出的优化方法对不同的程序特征有不同
的适用性。
4・2对h‘erp的优化效果
Interp在64。、128。、256。三种规模下的加速
比都呈现相同的特征,如图4b所示。即加速比首
先随着线程粒度的增大而增大,在线程粒度为4N
时达到最大值,随后虽然线程粒度进一步增大,加
速比反而减小。这是由于在不影响线程数量的情
况下,线程粒度的增大可以提高线程内的局部性,
所以在4N之前加速比随线程粒度增大而增大。
但是,当线程粒度大到影响线程的创建数目时,线
程粒度的增加反而不利于性能的提高。在最大规
模时,采用4N线程粒度比采用N线程粒度加速比
提高了2.15×。这说明本文提出的通过调节线程
粒度、优化模板操作的策略是有效的。
我们最终的优化效果表现为在最大规模下,
44
《一
l6 32 64 128
Pmblem Size^P
a Rprj3
14
12
lO
8
6
4
2
0
32 64 128 256
Pmblem Size
b Interp
图4 Rprj3和Interp在不同规模不同线程粒度下的加速比
Rrprj3获得的相对于CPU版本的加速比为5.37
×。Interp获得的相对于CPU版本的加速比为
12.8×,相对于初始的GPU版本的加速比为2.15
×。Rprj3计算的是投影,所以最大规模是128。;
Interp计算的是插值,所以最大规模是256。。
4.3 线程粒度调节对程序移植的指导意义
本文采用手工的方法调节线程粒度,通过实验
分析发现了线程粒度对程序性能有至关重要的影
响。从上文的分析可以得出在移植模板操作中调
节线程粒度的一个基本原则,即在不影响线程间并
行的情况下,尽可能增大线程粒度,在取得最大并
行性的同时充分发掘线程内数据局部性。针对特
定程序的线程粒度取决于程序特征及GPU体系
结构参数。在优化过程中,如何建立一个完整的线
程粒度选择模型是需要进一步研究的课题。
5 相关工作
当前越来越多的研究人员开始用GPU来优
化科学计算应用,他们都是使用Brook+和CUDA
之类的通用编程语言。Ryoo等人提出了把计算有
效映射到图像硬件上的优化原则 ],他们着眼于平
衡线程资源的使用和同时活跃线程的数目。Jang
等人通过体系结构信息定义了优化Brook+程序
的优化空间_gj。Wang等人使用CUDA在GPU
上实现了完整的Mgrid程序,但他们实现的是单
精度浮点的版本口 。我们可以看出,GPU可以有
效加速传统的计算密集的CPU程序。本文选取
Mgrid作为优化对象是因为它含有大量的模板操
作,给程序员提供了很大的优化空间。在CPU上
2024年5月27日发(作者:象雨文)
CN43 1258/TP
ISSN 1007一l3OX
计算机工程与科学
COMPUTER ENGINEERING 8L SCIENCE
2011年第33卷第3期
Vo1.33,No.3。2011
文章编号:1007—130X(2011)03 0041—05
模板操作在GPU上的实现与优化
Implementation and Optimization of
Stencil Applications on GPUs
方旭东,唐玉华,王桂彬,唐滔
FANG Xu—dong,TANG Yu—hua,WANG Gui—bin。TANG Tao
(国防科学技术大学计算机学院,湖南长沙410073)
(School of Computer Science,National University of Defense Technology,Changsha 410073,China)
摘 要:随着GPU的快速发展,使用GPU来加速科学计算应用已成为必然趋势。本文抽取了
SPEC2000中富含模板操作的Mgrid的两个典型子程序Rprj3和Interp,使用Brook+语言把它们移植到
AMD GPU上运行。采用Brook+语言提供的线程调节机制,我们实现了不同线程粒度下的程序版本,并
分析了加速比不同的原因,总结了线程粒度调节对模板程序移植的指导意义。我们使用AMD Radeon
HD4870 GPU作为实验平台,对比Intel Xeon E5405 CPU上的运行结果发现,在最大规模下,Rprj3获得
的相对于CPU版本的加速比为5.37×,Interp获得的相对于CPU版本的加速比为12.8×。
Abstract:With the fast development of GPUs,using them to accelerate scientific computing applica—
tions is becoming an inevitable trend.In this paper,we port two typical subroutines Rprj 3 and Interp
from Mgrid which contains rich stencil operations in SPEC2000 to run on an AMD GPU using Brook+.
Using a thread granularity tuning mechanism provided by Brook+,we implement different ported pro—
gram versions and analyze their performances.We also conclude how tO utilize thread granularity tuning
to optimize stencil program transplantati0n. Our experimental results show that under the largest prob—
lem size,Rprj3 obtains a speedup of 5.37 over its CPU version while Interp gains a speedup of 12.8 over
its CPU version.
关键词:GPU;优化;模板
Key words:GPU;optimization;stencil
doi:10.3969/j.issn.1007—130X.2011.03.008
中图分类号:TP303 文献标识码:A
解图形编程的细节,便可以着手在GPU上编写通
引言
近年来,随着GPU技术的发展,GPU的浮点
处理能力变得越来越强大。新的GPU体系结构
具有更好的可编程性和通用性,使编程人员无需了
用程序。这方面的语言有AMD的Brook+l】 和
NVIDIA的CUDAl2j。GPU的强大计算能力现已
被用于生物医学、计算流体动力学模拟和分子动力
学模拟等科学计算领域 。
现在的GPU虽然具有很强的计算能力,但由
收稿日期:2009—07 26;修订日期:2009 10-21
基金项目:国家自然科学基金资助项目(60621003)
通讯地址:410073湖南省长沙市国防科学技术大学计算机学院
Address:School of Computer Science,National University of Defense Technology,Changsha,Hunan 410073,P.R.China
41
于GPU最初用于图形处理,偏重处理的实时性,
其编译器自动优化程序的能力较弱。这就给编程
人员手工优化GPU程序提供了空间。本文从
Spec2000测试程序中选取了用于解偏微分方程的
Mgrid应用,从中抽取了典型的函数Interp和
Rprj3,将它们移植到AMD GPU平台上运行。In—
terp和Rprj3中大量的模板(Stencil)计算为优化
GPU程序提供了很好的机会 。我们采用通过调
节线程问并行性、增加线程内局部性的方法优化初
始的GPU代码。我们将AMD Radeon HD4870
GPU和Intel Xeon E54O5 CPU上的测试结果进
行对比发现,在最大规模下,Rprj3获得的相对于
CPU版本的加速比为5.37×,Interp获得的相对
于CPU版本的加速比为l2.8×。
2 背景
本节介绍在AMD GPU上用Brook+进行编
程的背景。
2.1异构平台介绍
使用GPU和通用CPU构建异构并行系统已
成为高性能计算领域的研究热点一s]。GPU强大的
浮点计算能力和超高的性能功耗比使得它们成为
非常好的CPU计算加速部件。一个典型的CPU—
口叩口叩口叩口叩口口叩叩口叩口叩=【 一l一一
GPU异构系统如图1所示。CPU和GPU之间存
在数据通信开销和调用开销。数据通信开销是指
口叩口叩口叩口叩口口叩叩口叩口叩ll~一椰一
计算前数据从CPU加载到GPU的开销和计算后
口口口口口口口口=叩叩叩叩叩叩叩叩一椰一~一
结果从GPU加载到CPU的开销。调用开销是指
从CPU发出调用指令到指令到达GPU命令处理
器的延迟。
PrT E
1 CPU GPU异构系统
2.2微体系结构
本文中我们采用AMD Radeon HD4870 GPU
作为CPU的加速器。AMD HD4800系列是
AMD GPU的最新产品,具有双精度浮点处理能
力,其使用的核心是RV770。如图2所示,在
RV770的数据并行阵列中拥有1O个SIMD引擎,
它们同时处理一个Kernel程序;每个SIMD引擎
又由16个线程处理器组成,这l6个线程处理器共
用一个程序计数器,所以它们之间是完全同步执行
42
的;线程处理器是一个超长指令字(VI IW)处理单
元,这个VI 1w包括4个标量计算核和1个超越
计算单元,一个线程处理器通过阻塞多线程的方式
同时运行4个线程。经过上述分析我们发现,
R770拥有800(10*16*5)个计算核,可以提供巨
大的计算能力。表1概括了Radeon HD4870的详
细性能参数。
线程分配处理器
圆
线程处理单元l l指令流和控制流
图2 RV77O微体系结构
表1 AMDs HD4870性能参数
参数 值 参数 值
M。 。 y CI。ck 993 MH
z
rocessors
8OO
Speed
Xt 。 4o M
emory Interface 256 bits
Units
Core Clock 750 M 。 y B “d 1 l5 GB/
Speed MHz width s
Mere。 y GDDR5 Single(double) 1.2 T(240G)
l ype Peak flops
在AMD流编程模型中,流(Streams)指可以
被并行操作的相同类型的数据集合,核(Kerne1)是
指可以在每个输出流元素上进行操作的并行函数。
线程(Thread)是指线程处理器上核的一次执行实
例。线程被映射到流处理器上执行,并以波阵面
(Wavefront)为单位调度。波阵面是指在SIMD引
擎上被同时执行和调度的一组线程。GPU硬件调
度通用寄存器(GPRs)、存储带宽等资源,直至所有
线程处理完毕。多个波阵面交织运行以隐藏访问
延迟。不同的SIMD引擎可以执行不同的指令,另
外流水线技术也被GPU硬件采用以获得性能提
升 。
2.3 Brook+流编程环境
AMD提供了完整的GPU编程环境,使得编
程人员可以方便快速地着手进行GPU上的程序
开发。程序员可以在两级抽象层次上编程,高层使
用Brook+,底层使用CAI (Compute Abstraction
Layer,简称CAI )。Brook+基于BrookGPUL ,
(2)使用多输出流(Multiple Output
Streams)。Brook+语言最多支持8条输出流l】]。
和使用单条输出流相比,使用多输出流后线程可以
执行更多的计算,同样增大了线程粒度。例如,使
用两条输出流可以把线程粒度增大一倍。而如果
是对C语言的扩展,支持显式的计算和数据并行。
Brook+作为一种高层的编程语言,屏蔽了体系结
构细节,保留了和现代图形硬件相关的特征。
CAL作为一种设备驱动库,提供向前兼容的接口,
可以直接和流处理器交互,所以CAL提供了更多
的优化机会。我们只在Brook+一级进行了移植
和优化。
3 优化策略
GPU更适合于处理计算密集型应用而非访存
密集型应用¨7]。为了充分发挥GPU的计算优势,
应该有足够多的线程来占用GPU提供的大量的
线程处理器。线程之间以波阵面为粒度调度,可以
有效隐藏访存延迟。另一方面,线程局部性
(Thread Locality)对于发掘计算中的数据复用、提
高程序性能也有很重要的作用。Mgrid中包含大
量的模板操作。所谓模板操作,是指在计算每个点
时都需要访问这个点的相邻点。所以,模板操作提
供了丰富的时间局部性和空间局部性优化的机会。
在Mgrid的模板操作中,有许多中间结果可以被
复用,这些复用不但可以增加线程内局部性,同时
能减少访存次数。一般来说,线程粒度越大,线程
内的计算密集性也越大,可以发掘的数据局部性也
更多。在AMD GPU中,线程的数目和线程的粒
度呈反比关系,线程粒度的大小决定了线程数量的
多少,所以我们可以调节线程粒度来达到线程内局
部性和线程间并行性的最佳平衡。Brook+中的
线程粒度是指一个线程可以计算模板操作网格点
的数目,调节线程粒度有如下两种方法:
(1)使用向量数据类型(Vector Types)。
Brook+语言提供的内置短向量由基本数据类型
加上它们的长度后缀构成,如“float4”和
“double2”。使用向量数据类型可以将输出流的长
度缩小向量长度倍,从而以相同倍数增大线程粒
度。例如,使用double2可以把线程粒度增大两
倍。和使用double的线程相比,使用double2的
线程可以在一个线程内同时计算两个点,从而两点
间计算的中间结果可以被复用。此外,使用向量数
据类型可以最多把4条标量访存指令打包到一条
向量访存指令中。如果Kernel程序访问的地址是
连续的,向量访存指令可以显著减少访存次数。
把向量数据类型和多输出流结合使用,我们可以得
到更大的线程粒度。例如,把double2和4条输出
流结合,线程的粒度就增大到了8倍。
需要注意的是,使用向量数据类型需要修改
Kernel中的数据索引,而使用多输出流需要分输
入流。而且,两种方法都增加了线程所需的通用寄
存器数量,从而减少了可被创建的线程数量。这些
附加的开销是否可以被调节线程粒度所获得的加
速比抵消,取决于Kernel的大小和特性。我们需
要通过实验来判定什么样的线程粒度是最好的。
4 实验测评
为了验证我们提出的优化方法的有效性,我们
用Brook+语言在AMD Radeon HD4870 GPU平
台上实现了Mgrid应用中的Rprj3和]nterp子函
数,并对其做了优化。所有的实验结果都和单线程
的CPU版本相比较。使用的CPU为Intel Xeon
E54O5 CPU,主频2GHz,带有256KB的一级缓存
和12MB的二级缓存。我们使用Intel ifort编译
器,优化选项为~O3。Mgrid是SPEC2000和
NASCAR benchmark中的重要测试程序,常用来
求解偏微分方程。
图3是Mgrid程序的结构图,可以看出Mgrid
的主要计算过程呈V字型,计算在多层网格和多
次迭代上进行。Rprj3和Interp是Mgrid中的重
要子程序,被多次调用。其中Rprj3进行精细网格
(Fine Grid)到粗糙网格(Coarse Grid)的投影计
算;Interp的计算方向相反,它进行从粗糙网格到
精细网格的插值计算。
Fi tC d
【一一
图3 Mgrid程序结构图
我们使用4种线程粒度,分别是double,doub
43
le2,double2和2条输出流,double2和4条输出
流。假设使用double的线程可以计算N个点,那
么使用double2,double2和2条输出流,double2
和4条输出流的线程分别可以计算2N、4N和8N
个点。为叙述方便起见,我们用N、2N、4N和8N
来指代不同的线程粒度。
4.1对Rprj3的优化效果
我们采用第3节提出的优化方法,对Rprj3进
行移植和优化。从图4a可以看出,除了问题规模
为16。时,4种线程粒度下加速比都小于1.0,其它
规模下程序的加速比都大于1.O。这是因为把计
算移植到GPU上运行会引起数据通信开销和调
用开销,小规模的情况下,移植程序所得的收益不
足以抵消附带开销。所以,把程序移植到GPU上
运行需要考虑问题的计算规模。
在问题规模为32。时,加速比随着线程粒度的
增大而增大。说明此时线程粒度的增大更好地开
发了线程内数据局部性,同时又没有影响线程间的
并行性。在问题规模为64。时,线程粒度的增加都
使得加速比得到了提高。特别是线程粒度为2N
时,加速比达到了最大值6.01,说明此时线程内数
据局部性和线程问数据并行性达到了最佳平衡。
在最大问题规模128。时,加速比随着线程粒
度的增大反而减小。这是因为在较大的问题规模
下,线程数越多,越有利于开发并行性。而线程粒
度的增加虽然提高了线程内数据局部性,但是大大
减少了线程数量,最终使得加速比下降。在该规模
下,增加线程粒度并没有得到预期的优化效果,说
明本文提出的优化方法对不同的程序特征有不同
的适用性。
4・2对h‘erp的优化效果
Interp在64。、128。、256。三种规模下的加速
比都呈现相同的特征,如图4b所示。即加速比首
先随着线程粒度的增大而增大,在线程粒度为4N
时达到最大值,随后虽然线程粒度进一步增大,加
速比反而减小。这是由于在不影响线程数量的情
况下,线程粒度的增大可以提高线程内的局部性,
所以在4N之前加速比随线程粒度增大而增大。
但是,当线程粒度大到影响线程的创建数目时,线
程粒度的增加反而不利于性能的提高。在最大规
模时,采用4N线程粒度比采用N线程粒度加速比
提高了2.15×。这说明本文提出的通过调节线程
粒度、优化模板操作的策略是有效的。
我们最终的优化效果表现为在最大规模下,
44
《一
l6 32 64 128
Pmblem Size^P
a Rprj3
14
12
lO
8
6
4
2
0
32 64 128 256
Pmblem Size
b Interp
图4 Rprj3和Interp在不同规模不同线程粒度下的加速比
Rrprj3获得的相对于CPU版本的加速比为5.37
×。Interp获得的相对于CPU版本的加速比为
12.8×,相对于初始的GPU版本的加速比为2.15
×。Rprj3计算的是投影,所以最大规模是128。;
Interp计算的是插值,所以最大规模是256。。
4.3 线程粒度调节对程序移植的指导意义
本文采用手工的方法调节线程粒度,通过实验
分析发现了线程粒度对程序性能有至关重要的影
响。从上文的分析可以得出在移植模板操作中调
节线程粒度的一个基本原则,即在不影响线程间并
行的情况下,尽可能增大线程粒度,在取得最大并
行性的同时充分发掘线程内数据局部性。针对特
定程序的线程粒度取决于程序特征及GPU体系
结构参数。在优化过程中,如何建立一个完整的线
程粒度选择模型是需要进一步研究的课题。
5 相关工作
当前越来越多的研究人员开始用GPU来优
化科学计算应用,他们都是使用Brook+和CUDA
之类的通用编程语言。Ryoo等人提出了把计算有
效映射到图像硬件上的优化原则 ],他们着眼于平
衡线程资源的使用和同时活跃线程的数目。Jang
等人通过体系结构信息定义了优化Brook+程序
的优化空间_gj。Wang等人使用CUDA在GPU
上实现了完整的Mgrid程序,但他们实现的是单
精度浮点的版本口 。我们可以看出,GPU可以有
效加速传统的计算密集的CPU程序。本文选取
Mgrid作为优化对象是因为它含有大量的模板操
作,给程序员提供了很大的优化空间。在CPU上