邓 力,陈晓翔,林嘉宇
(国防科学技术大学电子科学与工程学院,长沙 410073)
从1999年NVIDIA公司最早提出图形处理单元GPU到现在,GPU的应用已经不再局限于3D图形处理了,并已经演变成为了一个具有强大浮点数编程和计算能力的处理器,以满足人们进行大规模科学计算的要求。事实也证明,GPU在浮点运算、并行计算等计算方面,可以提供数十倍乃至于上百倍于CPU的性能。因此,选择具有巨大市场潜力并为开发者提供开源应用开发环境的CUDA作为开发平台,并对其环境平台的搭建与应用进行介绍。
CUDA是由硬件和软件架构共同组成的,这个架构可以让 GPU 执行由 C、C++、Fortran、OpenCL、DirectCompute以及其他语言所编写的程序。在PC上其应用开发平台的搭建,总体上分为驱动程序、编译器和编程环境的安装三个部分。以操作系统Win7(64位)家庭普通版Service Pack 1的笔记本作为基本平台,介绍CUDA4.1+VS2008开发环境搭建的步骤及相关事项。
从NVIDIA官方网站下载以下程序:
1)devdriver_4.1_winvista - win7_64_286.16_notebook.exe
2)cudatoolkit_4.1.28_win_64.msi(CUDA 平台:版本为4.1.28,操作系统为 windows64位)
3)gpucomputingsdk_4.1.28_win_64.exe(CUDA的软件开发工具包:版本为4.1.28,操作系统为windows64位)
2.1.1 devdriver安装
由于使用的显卡是NVIDIA GeForce GT 540M,因此需要首先安装驱动程序包,即上面提到的devdriver_4.1_winvista - win7_64_286.16_notebook.exe(驱动程序:版本为4.1,操作系统为winvistawin7-64位,机型为笔记本),注意在从NVIDIA官方网站下载时要选择与开发应用的PC平台相对应的版本。
2.1.2 cudatoolkit安装
接着,安装 cudatoolkit_4.1.28_win_64.msi(CUDA 平台:版本为 4.1.28,操作系统为 windows64位),注意下载时选择对应的版本。
devdriver和cudatoolkit程序最好都执行默认安装。
2.1.3 gpucomputingsdk 安装
最后,安装 gpucomputingsdk_4.1.28_win_64.exe(CUDA 的软件开发工具包:版本为4.1.28,操作系统为windows64位),注意下载时选择对应的版本。
建议按照缺省路径安装,但若觉得查找路径麻烦,也可自己指定安装目录。
完成上述3步后,其cudatoolkit和 gpucomputingsdk默认路径分别为:
1)C:Program FilesNVIDIA GPU Computing Toolkit
2)C:ProgramDataNVIDIA CorporationNVIDIA GPU Computing SDK 4.1
下面用SDK_PATH代表C:ProgramDataNVIDIA CorporationNVIDIA GPU Computing SDK 4.1。
2.1.4 安装检查
在win7的环境变量中,检查相关参数是否添加到系统变量里,如表1所示,若没有则需自行添加。
表1 环境变量
以上步骤完成了对CUDA应用平台的安装。
目前,支持 CUDA的 IDE有 VS2005、VS2008、VS2010等,以 Microsoft Visual Studio Team System 2008 Architecture Edition为例,安装完成后按下面步骤进行配置和测试。
为运行gpucomputingsdk里的例程,首先得用VS2008生成两个工具库文件:
1)使用VS2008打开SDK_PATHCcommoncutil_vs2008.sln,选“生成→批生成→全选→生成”。目的:为生成各配置需要的 cutil32[D].lib和 cutil64[D].lib,lib存放的位置:SDK_PATHccommonlib(win32|X64)。
2)使用 VS2008打开 SDK_PATHsharedshr Utils_vs2008.sln,选“生成→批生成→全选→生成”。目的:为生成各配置需要的 shrUtils32D.lib和 shr Utils64D.lib,lib 存放的位置:SDK_PATH\sharedlib(win32|X64)。
注意:这个项目编译时有可能会提示有两个.cpp找不到,直接把他们从项目里移去即可。因为同名的.h文件里已经有完整代码了。
在VS2008中,选“工具→项目和解决方案→VC++目录”,在win32|X64的库文件中添加“C:Program FilesNVIDIA GPU Computing ToolkitCUDAv4.1lib”、“SDK_PATHCcommonlib”两个路径;在win32|X64的引用文件和包含文件中添加“C:Program FilesNVIDIA GPU Computing ToolkitCUDAv4.1include”、“SDK_PATHCcommoninc”、“SDK_PATHsharedinc”三个路径。目的:使VS2008能找到相关头文件和库文件。
然后,选“工具→项目和解决方案→VC++目录项目设置”,将*.cu;*.cuh添加到C/C++文件扩展名中。目的:使VS2008能执行上述类型文件。
最后,选“工具→选项→文本编辑器→文件扩展名”,将.cu和.cuh添加到 Microsoft Visual C++编辑器里。目的:使VS2008识别上述类型文件中C/C++语法。
使用VS2008打开SDK_PATHCsrcandwidthTestandwidthTest_vs2008.sln,按照“编译”→“生成bandwidthTes”→“调试”→“启动”,就会出现其结果。
用VS2008创建一个空白的win32控制程序,在该项目里添加.cu文件,并编写了两个程序,一个直接用CPU计算1-300000的整数平方和并循环100次,另一个调用GPU计算1-300000的整数平方和并循环100次,并通过 QueryPerformanceFrequency函数进行了时间统计,如表2所示。
表2 环境变量
从结果可以看出GPU运算花费的时间几乎可以不计(约为0.02ms);CPU运算花费的时间(约为63ms)是GPU运算花费时间的3150倍;在初始化设备、开辟空间和向GPU传入数据上花费的时间(约为(522+1882)=2404ms)是CPU运算花费时间的38倍。上述测试数据表明GPU的科学计算能力明显强于CPU,但是GPU与CPU进行数据通信是GPU运算的一个“瓶颈”。因此,只有对于可以进行大规模数据并行计算的程序,即当进行并行计算所节约的时间大大超过GPU与CPU相互调用时所浪费的时间时,GPU才能突显出其强大的科学计算优势。
多核CPU和多核GPU的出现意味着并行系统已成为主流处理器芯片。此外,根据摩尔定律,其并行性将不断扩展。这就需要开发出可透明地扩展并行性的应用软件,以便利用日益增加的处理器内核数量。这种情况就像3D图形应用程序可通过透明地扩展其并行性的方式,以支持配备各种数量内核的多核GPU。CUDA正是基于应对这种挑战,而提供的一种并行编程模型和软件环境。同时,保证了熟悉C语言等标准编程语言的程序员能够快速掌握并使用它。随着该开发环境构架的不断发展与成熟,开发者将能够更加自由地发挥其灵感与创意,使GPU给人们的工作、教育、休闲、娱乐带来丰富多彩的应用。
[1]Jason Sanders,edward Kandrot.CUDA BY EXAMPLE[M].Addison - Wesley Professional,2011.
[2]科克,胡文美.大规模并行处理器编程实战[M].北京:清华大学出版社,2010.
[3]NVIDIA CUDA C Programming Guide(Version3.1.1)[EB/OL].NVIDIA Corporation,2010.
[4]NVIDIA CUDA C Programming Best Practices Guide(Version3.1)[EB/OL].NVIDIA Corporation,2010.
[5]张舒,褚艳利,赵开勇,张玉勃.GPU高性能运算之CUDA[M].北京:中国水利水电出版社,2009.
[6]李波,赵华成,张敏芳.CUDA高性能计算并行编程[J].程序员,2009,25(9):55-64.