CUDA在Windows下的软件开发环境搭建
http://www.cnblogs.com/yaoyuanzhi/archive/2010/11/13/1876215.html
CUDA在Windows下的軟件開發環境搭建?
本文我們以Visual Studio 2005 為例演示CUDA的安裝以及軟件開發環境搭建,以及CUDA與MFC聯調的實現。
1.cuda安裝包
CUDA是免費使用的,各種操作系統下的CUDA安裝包均可以在http://www.nvidia.cn/object/cuda_get_cn.html上免費下載。CUDA提供3個安裝包,分別是: Driver, Toolkit和SDK。SDK包括許多例子程序和函數庫。Toolkit包括CUDA的基本工具。安裝時按照順序,先安裝Driver,再Toolkit,最后SDK。
CUDA toolkit
安裝后在NVIDIA_CUDA_toolkit安裝目錄下出現6個文件夾,分別是:
Bin :???? 工具程序和動態鏈接庫
Doc :???? 相關文檔
Include : header頭文件包
Lib :???? 程序庫
Open64 :? 基于open64的CUDA compiler
Src :???? 部分原始代碼
安裝過程中toolkit自動設定了3個環境變量:CUDA_BIN_PATH、CUDA_INC_PATH和CUDA_LIB_PATH分別對應工具程序庫、頭文件庫和程序庫,預設路徑為當前安裝文件夾下的bin、include 和lib三個文件夾。
CUDA SDK
SDK可以根據需要選擇安裝(推薦安裝,因為SDK中的許多例子程序和函數庫非常有用。
CUDA Display
對于沒有安裝NV顯卡的計算機,不需要安裝Display安裝包,程序也可以在模擬模式下運行。
2.在Visual Studio2005中使用CUDA
??? CUDA的主要工具是nvcc,它會執行所需要的程序,將CUDA程序編譯并執行。本文將介紹在windows環境下,基于VS 2005IDE環境下的幾種配置cuda nvcc的方法。
2.1 NV自帶的修改模板方法
??? 在CUDA SDK安裝目錄下的project目錄下新建文件夾,命名為想要建立的工程名字,比如test1。并在project文件夾下找到SDK自帶的template文件夾,將template文件夾下所有的文件copy到test1下。
??? 將copy到test1文件夾下的所有文件文件名中的template改為test(也即是自己的工程文件名字)。test.sln與test.vcproj是vs 8系列的工程文件,test_vc7.sln與test_vc7.vcproj是vs 7系列的工程文件,可以根據自己Visual Studio的版本選擇要更改的工程文件,其它兩個可以刪除。在Visual Studio C++ 2005 Express中,刪除test_vc7.sln與test_vc7.vcproj即可。
將*.cu、*.sln和*.vcproj用記事本等文字編輯軟件打開,使用查找替換功能將以上文件中所有的template改為test。
使用*.sln文件打開整個工程,可以任意更改代碼,編譯運行。
修改輸出文件路徑(可選,如不改變,可執行文件輸出到上兩級目錄下的bin目錄中),如使用了CUDA SDK中的動態鏈接庫,將相應的動態鏈接庫拷貝到可執行文件的同一目錄下。
??
??? 總結:這種方法是NV公司為windows下使用vs編譯cuda提供的標準方法(參見\SDK\doc\CUDA_SDK_release_notes_windows.txt), 使用公司提供的模板更改為自己想要建立的工程,也可以參照以上方法,在SDK Project庫中的找到與自己想建立工程相近的其它工程做更改。
2.2 在Win32項目中建立.cu文件
??? 首先建立一個C++的win32的控制臺應用程序empty project,并添加一個新的源文件,此處以main.cu為例。
P1.建立一個win32 project
設定為empty project
P3.建立一個CUDA程序專用的main.cu文件
在solution explorer 中main.cu上右鍵單擊,選擇property。在打開的對話框中選擇General,確定Tool的選項是Custom Build Tool。
確認Tool選項為Custom build Tool。
選擇Custom Bulid Step,在Command Line中分別設定模式參數。這里要分幾種編譯方式來設定命令行參數。
?(1)、Release 模式:"$(CUDA_BIN_PATH)\nvcc.exe" -ccbin "$(VCInstallDir)bin" -c -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Wp64,/O2,/Zi,/MT -I"$(CUDA_INC_PATH)" -o $(ConfigurationName)\$(InputName).obj $(InputFileName)
?(2)、Debug 模式:"$(CUDA_BIN_PATH)\nvcc.exe" -ccbin "$(VCInstallDir)bin" -c -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/MTd -I"$(CUDA_INC_PATH)" -o $(ConfigurationName)\$(InputName).obj $(InputFileName)
??? 如果計算機中沒有安裝NV顯卡,使用模擬模式,需增加兩個額外的設定。新建兩個模式EmuRelease和EmuDebug。
P6.新建模式(1)
P6.新建模式(2)
??????? 對新建立的EmuRelease和EmuDebug的Command Line分別設定為:
(1)、EmuRelease 模式:"$(CUDA_BIN_PATH)\nvcc.exe" -ccbin "$(VCInstallDir)bin" -deviceemu -c -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Wp64,/O2,/Zi,/MT -I"$(CUDA_INC_PATH)" -o $(ConfigurationName)\$(InputName).obj $(InputFileName)
(2)、EmuDebug 模式:"$(CUDA_BIN_PATH)\nvcc.exe" -ccbin "$(VCInstallDir)bin" -deviceemu -c -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/MTd -I"$(CUDA_INC_PATH)" -o $(ConfigurationName)\$(InputName).obj $(InputFileName)
3.1.4、對所有的設定模式,均在 Custom Build Step 的 Outputs 中加入 $(ConfigurationName)\$(InputName).obj。
P7.設定Outputs
右鍵單擊project,選擇Property,再選擇Linker,對所有模式修改以下設定:
(1)、General/Enable Incremental Linking:No
(2)、General/Additional Library Directories:$(CUDA_LIB_PATH)
(3)、Input/Additional Dependencies:cudart.lib
P8.設定Linker參數(1)
P9.設定Linker參數(2)
設置頭文件路徑Tools -> Options,彈出以下對話框
將右邊的下拉框選擇Include Files,點擊添加按鈕,將C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\inc選入到頭文件搜索路徑中。
選擇鏈接庫文件路徑
同上庫頭文件路徑選擇,將右邊下拉框選擇Library File,選擇路徑C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\lib。
完成,可以編寫cuda程序,并直接編譯執行了(編譯方式于C++相同)
總結:這種方法既不需要借助模板,也不需要使用第三方的軟件。但是操作相當復雜,而且僅對配置的單個project有效。如果重新建立一個project又要重新配置一遍。
需要注意的是,當需要使用CUDA SDK中的動態鏈接庫(以dll為后綴)時,將動態鏈接庫和生成的可執行文件放在同一個路徑下。
如果是driver API,需要添加”cuda.lib cudart.lib”,頭文件#include ,#include。
2.3 使用CUDA_VS_Wizard插件
??? 下載CUDA_VS_Wizard插件并安裝。
??? 將CUDA安裝目錄下的bin和CUDA SDK安裝目錄下的bin\win32文件夾下的四個文件夾(Debug, EmuDebug, Release, EmuRelease)的路徑全部加入環境變量中的path變量中。
??? 使用vc直接建立工程。在工程選項里選擇CUDAWinApp。
???
如果是在模擬模式下運行,需要在解決方案中右鍵屬性,在Configuration Properities 中將Configuration 設置為Emu模式。
模擬模式設置(1)
模擬模式設置(2)。
總結:這種方法雖然使用了第三方的工具,但只需要配置一次即可,而且配置簡單,以后每次建立cuda程序都可以直接生成。如果是建立預定義頭文件的工程,則建立的cuda程序,會自帶一個sample.cu,可以選擇在sample.cu的基礎上更改或刪除sample.cu重新建立.cu文件。如果是建立空工程則沒有。建立方法.cu文件的方法是建立.cpp文件或.txt文件改名為.cu文件即可。推薦使用。
2.4 語法高亮設置。
找到CUDA SDK安裝目錄下doc\syntax_highlighting\自帶的文件usertypt.dat,將其copy到Microsoft Visual Studio 安裝目錄的\Common7\IDE下。
在Visual Studio中做以下設置: 在Tools-> Options ->Text Editor-> File Extension中添加cu。編輯方式Microsoft Visual C++。
???
P16.設置高亮
重新啟動Visual Studio,完成高亮設置。
??
3.配置生成規則。將SDK目錄下C/common目錄下的cuda,rules拷貝到VS安裝目錄下的VC\VCProjectDefaults子目錄下。建立一個 Win32工程,并在項目上右擊,選擇custombuildrules,在CUDA build rule前打勾。在工程中新建一個.cu文件,右擊屬性后查看自定義生成規則是否已經是CUDA build rule。
3. CUDA在MFC中的聯調方法實例
3.1 SDK中程序的編譯
???????? 例如我們的SDK安裝路徑“C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\projects\deviceQuery”中可以找到deviceQuery的工程文件。
???????? 當我們把這個文件夾拷貝到其他目錄下時,會出現找不到頭文件的錯誤,如“找不到cutil.h”。為什么會出現這種情況呢?我們注意到在deviceQuery中對其的引用#include <cutil.h>,是在系統目錄下的。這個系統目錄在C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\inc中可以找到cutil.h頭文件。
???????? 通過查看deviceQuery.cu的屬性,通過觀察“命令行”:
"$(CUDA_BIN_PATH)\nvcc.exe" -ccbin "$(VCInstallDir)bin" -c -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/MTd -I"$(CUDA_INC_PATH)" -I./ -Ihttp://www.cnblogs.com/common/inc -o $(ConfigurationName)\deviceQuery.obj deviceQuery.cu
注意紅色下劃線部分,帶便往上退兩個文件夾,然后進入commom文件夾中的inc文件夾。再比較之前的兩個路徑,這正好是deciceQuery.sin文件到cutil.h的一個訪問的過程。
?
???????? 當我們將工程文件拷貝到新的目錄下時,這樣的一個訪問方式必然會失效。于是我們需要做如下的一些設置。
1.? 首先我們需要將C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\bin\win32文件目錄下的四個文件夾分別添加到環境變量里。
?
具體的操作方法是:”我的電腦” ->屬性->高級->環境變量PATH,注意路徑都是全路徑,每個變量間用“;”分隔。
?
2.? 注意到這里面的系統變量NVSDKCUDA_ROOT為C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK。
?
我們在轉移了工程文件目錄后,只需要將命令行進行修改。即將之前的紅線部分作如下修改:
"$(CUDA_BIN_PATH)\nvcc.exe" -ccbin "$(VCInstallDir)bin" -c -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/MTd -I"$(CUDA_INC_PATH)" -I./ -I"$(NVSDKCUDA_ROOT)/common/inc" -o $(ConfigurationName)\deviceQuery.obj deviceQuery.cu
3.? 此外我們還需要將“項目屬性”的“鏈接器”做對應的修改。然后該程序即可正常編譯運行。
?
3.2 MFC中應用CUDA程序
本章建立一個MFC工程,然后在該工程中添加對cu文件中CUDA程序的調用。本章還可參考SDK中的程序示例cppIntegration。
3.2.1 配置VisualStudio環境配置準備工作
語法高亮:將d:\programming\cuda\sdk\doc\syntax_highlighting\visual_studio_8里面的usertype.dat文件copy到Microsoft Visual Studio 8\Common7\IDE目錄下面(如果已經存在,就追加到原來的后面)。
設置VS2005環境(因為本程序將不僅僅是在cu文件中使用CUDA函數了,其中還包括在cpp文件中使用,所以需要包括這些庫):
進入Tools|Options|Projects and Solutions|VC++Directories 添加:?
Include files:
d:\programming\cuda\toolkit\include
d:\programming\cuda\sdk\common\inc?
Library files:
d:\programming\cuda\toolkit\lib
d:\programming\cuda\sdk\common\lib
Source files:d:\programming\cuda\sdk\common\src?
文本編輯器設置:進入VC++ Project Settings:C/C++ File extensions:添加*.cu,在Text editor-File extension:添加cu 對應editor到Microsoft VC++ editor。?
Visual Assist X設置(如果需要安裝的話):關閉已經所有打開的Visual studio,安裝VA,之后進入注冊表編輯器:HKEY_CURRENT_USER\Software\Whole Tomato\VANet8 找到右邊的ExtSource項,將其值添加.cu;.cuh;之后關閉,再次打開VS2005即可。)?
3.2.2 創建全局函數和頭文件
???????? 首先我們在頭文件和資源文件中建立全局函數以供調用:
???????? 這里的testcuda函數采用extern關鍵字聲明C語言擴展。
?
我們在查看類視圖的時候就可以看到該全局函數:
?
3.2.3 創建CUDA代碼
為了標示清楚,我們首先創建了一個名為CUDA的篩選器,然后在該篩選器中分別創建名為first.cu和first_kernel.cu的兩個源代碼文件。然后其中添加代碼如下:
#include "stdio.h"
#include "cutil.h"
#include "first_kernel.cu"
extern "C" void runtest(float *source,int datalen,float *result)
{
??? int count;
??? cudaGetDeviceCount(&count);
??? if(count == 0) {
??????? fprintf(stderr, "There is no device.\n");
???????? *result=-1;
??? }
??? int i;
??? for(i = 0; i < count; i++) {
??????? cudaDeviceProp prop;
??????? if(cudaGetDeviceProperties(&prop, i) == cudaSuccess) {
??????????? if(prop.major >= 1) {
??????????????? break;
??????????? }
??????? }
??? }
??? if(i == count) {
??????? fprintf(stderr, "There is no device supporting CUDA 1.x.\n");
???????? *result=-1;
??? }
???? float * d_source,*d_result;
???? cudaMalloc((void**)&d_source,datalen*sizeof(float));
???? cudaMalloc((void**)&d_result,sizeof(float));
???? cudaMemcpy(d_source,source,datalen*sizeof(float),cudaMemcpyHostToDevice);
???? kernel<<<1,256,0>>>(d_source,datalen,d_result);
????
???? cudaMemcpy(result,d_result,sizeof(float),cudaMemcpyDeviceToHost);
???? cudaFree(d_source);
???? cudaFree(d_result);
}
以及在first_kernel.cu中添加的內核函數(即并行部分):
#ifndef _FIRST_KERNEL_H_
#define _FIRST_KERNEL_H_
__global__ void kernel(float *source,int len,float *result)
{
???? int i;
???? float sum;
???? sum=0;
???? for(i=0;i<len;i++)
???????? sum+=*(source+i);
????????
???? *result=sum;
}
#endif
3.2.3 修改鏈接器設置
首先是first.cu的屬性設置:
將“常規”中的工具一項設為“自定義生成工具”。
然后在命令行中參考3.1中的設置方式。這里需要注意的是“附加依賴項”為first_kernel.cu.
?
?
而在first_kernel.cu中的屬性設置,我們需要將這個存放內核函數的文件“從生成中排除”。
?
???????? 最后是設置項目的屬性,仍舊參照3.1在“項目屬性”的“鏈接器”的屬性中作一些改動。
?
???????? 在“項目屬性”的“鏈接器”的“輸入”中加入附加依賴項庫文件cudart.lib
?
???????? 最后便可以編譯運行程序了^_^!
總結
以上是生活随笔為你收集整理的CUDA在Windows下的软件开发环境搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows8.1 64bit环境下搭
- 下一篇: 高性能网络编程技术