鄧 力,陳曉翔,林嘉宇
(國防科學技術大學電子科學與工程學院,長沙 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.