目前版本的cuda是很方便的,它的一個(gè)安裝里面包括了Toolkit`SDK`document`Nsight等等,而不用你自己去挨個(gè)安裝,這樣也避免了版本的不同步問題。 1 cuda5.5的下載地址,官方網(wǎng)站即可: https://developer./cuda-downloads 在里面選擇你所對(duì)應(yīng)的電腦版本即可。 2 VS2010這個(gè)沒什么說的了,網(wǎng)上各種的免費(fèi)資源,下載一個(gè)不需要錢的就行。 3 Cuda的安裝:(win7版32bit) 安裝cuda3.1 cuda的安裝文件 直接雙擊exe文件,彈出后,首先會(huì)監(jiān)測(cè)一下你的運(yùn)行環(huán)境,如果找不到Nividia對(duì)應(yīng)的顯卡設(shè)備,他會(huì)提示你是否要繼續(xù)安裝。這里面nvidia的顯卡,最起碼也是8800以上的,要不是無法編寫CUDA的。千萬不要電腦上面是intel或者AMD的顯卡,卻要編寫cuda,除非你有錢買一個(gè)cuda-x86這個(gè)編譯器。 3.2 彈出的對(duì)話框直接OK就行,這個(gè)是CUDA的一些安裝文件,無所謂的:
3.3 他會(huì)監(jiān)測(cè)你的電腦是否支持cuda的搭建,等待就行 3.4 系統(tǒng)檢查 3.5 選擇同意并繼續(xù) 3.6 推薦先選擇自定義安裝 3.7 最主要的是cuda document\cuda Toolkit \cuda samples(SDK),Nsight\圖形驅(qū)動(dòng)程序,3D如果需要的話安裝,不安裝也無所謂。這里主要就是能看見都有什么,免得漏掉了,博主當(dāng)初就因?yàn)檫x了精簡(jiǎn)安裝,沒安裝上SDK。 3.7 安裝的位置,推薦自己建三個(gè)好找的文件夾,不用他默認(rèn)的路徑,免得稍后配置環(huán)境變量麻煩。 博主的安裝路徑為: 3.8 下一步安裝就行了。 至此,cuda的安裝就搞定了。
4 接下來配置cuda的環(huán)境變量,默認(rèn)安裝好后,他會(huì)自動(dòng)幫你設(shè)置好2個(gè)環(huán)境變量,但是最好還自己添加下其他的幾個(gè),方便日后配置vs使用
上面的兩個(gè)環(huán)境變量是cuda默認(rèn)配置的,接下來添加 CUDA_BIN_PATH %CUDA_PATH%\bin CUDA_LIB_PATH %CUDA_PATH%\lib\Win32 CUDA_SDK_BIN %CUDA_SDK_PATH%\bin\Win32 CUDA_SDK_LIB %CUDA_SDK_PATH%\common\lib\Win32 CUDA_SDK_PATH C:\cuda\cudasdk\common
添加完就行了
5 接下來是cuda的安裝成功與否的監(jiān)測(cè)了,這個(gè)步驟我們用到兩個(gè)東西,這兩個(gè)東西,都是cuda為我們準(zhǔn)備好的。 deviceQuery.exe 和 bandwithTest.exe 首先啟動(dòng)cmd DOS命令窗口(博主的cuda安裝到c:\cuda文件夾下) 默認(rèn)進(jìn)來的是c:\users\Admistrator\>路徑,輸入 cd .. 兩次,來到c:目錄下 輸入dir 找到安裝的cuda文件夾 進(jìn)入Release文件夾后,直接執(zhí)行bandwithTest.exe 再執(zhí)行deviceQuery.exe 得到以上信息,因?yàn)槲业娘@卡比較古老9300屬于第一代的cuda顯卡了。Rsult=PASS及說明,都通過了。如果Rsult=Fail 那不好意思,重新安裝吧(或者是您的顯卡真心不給力)。 關(guān)于VS項(xiàng)目測(cè)試(推薦)打開VS,新建項(xiàng)目 利用安裝好的cuda向?qū)?,直接建立工程,里面?huì)自動(dòng)有一段kernel累加的代碼 ![]() 在main函數(shù)return之前加入getchar(),停止自動(dòng)退出,以便觀測(cè)效果 進(jìn)入后,點(diǎn)擊運(yùn)行按鈕,可能發(fā)生LINK錯(cuò)誤(如果沒有錯(cuò)誤,跳過此段) 這時(shí)進(jìn)入-》項(xiàng)目-》屬性-》通用配置-》輸入和輸出-》嵌入清單 ---- 修改成否,原來可能為“是” 再次編譯,成功運(yùn)行后,會(huì)顯示下面的結(jié)果
恭喜,cuda已經(jīng)在您的機(jī)器上安裝成功了。
如果是新手,推薦這樣新建工程后,在里面修改代碼成為自己的工程,配置屬性不會(huì)出錯(cuò)。 如果想要自己手動(dòng)配置也可以參考下面的例子。
手動(dòng)配置VS項(xiàng)目(不推薦)最后就是VS的配置了(這個(gè)是自己手動(dòng)配置的,有時(shí)候容易出現(xiàn)問題,不是很推薦,建議用上面的方法建立項(xiàng)目進(jìn)行測(cè)試) 5.1 啟動(dòng)VS2010 5.2 新建一個(gè)win32的控制臺(tái)工程,空的。 5.3 右鍵源文件文件夾->新建項(xiàng)->選擇cuda c/c++->新建一個(gè)以.cu結(jié)尾的文件 5.4 右鍵工程-》生成自定義-》選擇cuda生成 5.5 右鍵test.cu-》屬性-》選擇cuda c/c++編譯器 5.6 右鍵工程-》屬性-》鏈接器-》常規(guī)-》附加庫目錄-》添加目錄 $(CUDA_PATH_V5_5)\lib\$(Platform); 5.7 在鏈接器-》輸入中添加 cudart.lib
5.8 在工具-》選項(xiàng)-》文本編輯器-》文件擴(kuò)展名-》添加cu \cuh兩個(gè)文件擴(kuò)展名
至此,編譯環(huán)境的相關(guān)搭建就完成了。
下面提供了一段test.cu的代碼,供測(cè)試使用:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <cuda_runtime.h> 4 5 #define DATA_SIZE 1024 6 #define checkCudaErrors(err) __checkCudaErrors (err, __FILE__, __LINE__) 7 #define getLastCudaError(msg) __getLastCudaError (msg, __FILE__, __LINE__) 8 9 int data[DATA_SIZE]; 10 11 //////////////////////////////////////////////////////////////////////////////// 12 // These are CUDA Helper functions 13 14 // This will output the proper CUDA error strings in the event that a CUDA host call returns an error 15 16 17 inline void __checkCudaErrors(cudaError err, const char *file, const int line ) 18 { 19 if(cudaSuccess != err) 20 { 21 fprintf(stderr, "%s(%i) : CUDA Runtime API error %d: %s.\n",file, line, (int)err, cudaGetErrorString( err ) ); 22 return ; 23 } 24 } 25 26 // This will output the proper error string when calling cudaGetLastError 27 28 29 inline void __getLastCudaError(const char *errorMessage, const char *file, const int line ) 30 { 31 cudaError_t err = cudaGetLastError(); 32 if (cudaSuccess != err) 33 { 34 fprintf(stderr, "%s(%i) : getLastCudaError() CUDA error : %s : (%d) %s.\n", 35 file, line, errorMessage, (int)err, cudaGetErrorString( err ) ); 36 return ; 37 } 38 } 39 40 // end of CUDA Helper Functions 41 42 __global__ static void sumOfSquares(int *num, int * result){ 43 int sum=0; 44 int i; 45 for(i=0;i<DATA_SIZE;i++) { 46 sum += num[i]*num[i]; 47 } 48 *result = sum; 49 } 50 void GenerateNumbers(int *number, int size){ 51 for(int i = 0; i < size; i++) { 52 number[i] = rand() % 10; 53 printf("number[%d] is %d\n",i,number[i]); 54 }} 55 56 int main(){ 57 58 cudaSetDevice(0); 59 cudaDeviceSynchronize(); 60 cudaThreadSynchronize(); 61 62 GenerateNumbers(data, DATA_SIZE); 63 64 int * gpudata, * result; 65 int sum; 66 67 checkCudaErrors( cudaMalloc((void**) &gpudata, sizeof(int)*DATA_SIZE)); 68 checkCudaErrors(cudaMalloc((void**) &result, sizeof(int))); 69 checkCudaErrors(cudaMemcpy(gpudata, data, sizeof(int)*DATA_SIZE,cudaMemcpyHostToDevice)); 70 71 sumOfSquares<<<1, 1, 0>>>(gpudata, result); 72 73 checkCudaErrors(cudaMemcpy(&sum, result, sizeof(int), cudaMemcpyDeviceToHost)); 74 75 cudaFree(gpudata); 76 cudaFree(result); 77 78 printf("-----------sum: %d\n",sum); 79 80 sum = 0; 81 for(int i = 0; i < DATA_SIZE; i++) { 82 sum += data[i] * data[i]; 83 } 84 printf("sum (CPU): %d\n", sum); 85 86 getchar(); 87 return 0; 88 }
|
|