手把手教你cuda5.5與VS2010的編譯環境搭建

目前版本的cuda是很方便的,它的一個安裝裏面包括了Toolkit`SDK`document`Nsight等等,而不用你本身去挨個安裝,這樣也避免了版本的不一樣步問題。c++

1 cuda5.5的下載地址,官方網站便可:編輯器

     https://developer.nvidia.com/cuda-downloads   在裏面選擇你所對應的電腦版本便可。ide

2 VS2010這個沒什麼說的了,網上各類的免費資源,下載一個不須要錢的就行。函數

3 Cuda的安裝:(win7版32bit)工具


 安裝cuda

  3.1 cuda的安裝文件測試

  

  直接雙擊exe文件,彈出後,首先會監測一下你的運行環境,若是找不到Nividia對應的顯卡設備,他會提示你是否要繼續安裝。這裏面nvidia的顯卡,最起碼也是8800以上的,要不是沒法編寫CUDA的。千萬不要電腦上面是intel或者AMD的顯卡,卻要編寫cuda,除非你有錢買一個cuda-x86這個編譯器。網站

  3.2 彈出的對話框直接OK就行,這個是CUDA的一些安裝文件,無所謂的:this

 

  3.3 他會監測你的電腦是否支持cuda的搭建,等待就行spa

  3.4 系統檢查3d

  3.5 選擇贊成並繼續

  3.6 推薦先選擇自定義安裝

  3.7 最主要的是cuda document\cuda Toolkit \cuda samples(SDK),Nsight\圖形驅動程序,3D若是須要的話安裝,不安裝也無所謂。這裏主要就是能看見都有什麼,省得漏掉了,博主當初就由於選了精簡安裝,沒安裝上SDK。

  

  3.7 安裝的位置,推薦本身建三個好找的文件夾,不用他默認的路徑,省得稍後配置環境變量麻煩。

博主的安裝路徑爲:

  3.8 下一步安裝就好了。

至此,cuda的安裝就搞定了。


 

4 接下來配置cuda的環境變量,默認安裝好後,他會自動幫你設置好2個環境變量,可是最好還本身添加下其餘的幾個,方便往後配置vs使用

 

上面的兩個環境變量是cuda默認配置的,接下來添加

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的安裝成功與否的監測了,這個步驟咱們用到兩個東西,這兩個東西,都是cuda爲咱們準備好的。

deviceQuery.exe 和 bandwithTest.exe

  首先啓動cmd DOS命令窗口(博主的cuda安裝到c:\cuda文件夾下)

  默認進來的是c:\users\Admistrator\>路徑,輸入 cd .. 兩次,來到c:目錄下

  輸入dir 找到安裝的cuda文件夾

進入Release文件夾後,直接執行bandwithTest.exe

再執行deviceQuery.exe

獲得以上信息,由於個人顯卡比較古老9300屬於第一代的cuda顯卡了。Rsult=PASS及說明,都經過了。若是Rsult=Fail 那很差意思,從新安裝吧(或者是您的顯卡真心不給力)。


 關於VS項目測試(推薦)

打開VS,新建項目

利用安裝好的cuda嚮導,直接創建工程,裏面會自動有一段kernel累加的代碼

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>

cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);

__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;
    c[i] = a[i] + b[i];
}

int main()
{
    const int arraySize = 5;
    const int a[arraySize] = { 1, 2, 3, 4, 5 };
    const int b[arraySize] = { 10, 20, 30, 40, 50 };
    int c[arraySize] = { 0 };

    // Add vectors in parallel.
    cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "addWithCuda failed!");
        return 1;
    }

    printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n",
        c[0], c[1], c[2], c[3], c[4]);

    // cudaDeviceReset must be called before exiting in order for profiling and
    // tracing tools such as Nsight and Visual Profiler to show complete traces.
    cudaStatus = cudaDeviceReset();
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaDeviceReset failed!");
        return 1;
    }
    getchar();
    return 0;
}

// Helper function for using CUDA to add vectors in parallel.
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size)
{
    int *dev_a = 0;
    int *dev_b = 0;
    int *dev_c = 0;
    cudaError_t cudaStatus;

    // Choose which GPU to run on, change this on a multi-GPU system.
    cudaStatus = cudaSetDevice(0);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");
        goto Error;
    }

    // Allocate GPU buffers for three vectors (two input, one output)    .
    cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMalloc failed!");
        goto Error;
    }

    cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMalloc failed!");
        goto Error;
    }

    cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMalloc failed!");
        goto Error;
    }

    // Copy input vectors from host memory to GPU buffers.
    cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMemcpy failed!");
        goto Error;
    }

    cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMemcpy failed!");
        goto Error;
    }

    // Launch a kernel on the GPU with one thread for each element.
    addKernel<<<1, size>>>(dev_c, dev_a, dev_b);

    // Check for any errors launching the kernel
    cudaStatus = cudaGetLastError();
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus));
        goto Error;
    }
    
    // cudaDeviceSynchronize waits for the kernel to finish, and returns
    // any errors encountered during the launch.
    cudaStatus = cudaDeviceSynchronize();
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);
        goto Error;
    }

    // Copy output vector from GPU buffer to host memory.
    cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMemcpy failed!");
        goto Error;
    }

Error:
    cudaFree(dev_c);
    cudaFree(dev_a);
    cudaFree(dev_b);
    
    return cudaStatus;
}
View Code

在main函數return以前加入getchar(),中止自動退出,以便觀測效果

進入後,點擊運行按鈕,可能發生LINK錯誤(若是沒有錯誤,跳過此段

這時進入-》項目-》屬性-》通用配置-》輸入和輸出-》嵌入清單 ---- 修改爲,原來可能爲「

再次編譯,成功運行後,會顯示下面的結果

 

恭喜,cuda已經在您的機器上安裝成功了。

 

若是是新手,推薦這樣新建工程後,在裏面修改代碼成爲本身的工程,配置屬性不會出錯。

若是想要本身手動配置也能夠參考下面的例子。

 

 


 

手動配置VS項目(不推薦)

最後就是VS的配置了(這個是本身手動配置的,有時候容易出現問題,不是很推薦,建議用上面的方法創建項目進行測試

  5.1 啓動VS2010

  5.2 新建一個win32的控制檯工程,空的。

  5.3 右鍵源文件文件夾->新建項->選擇cuda c/c++->新建一個以.cu結尾的文件

  5.4 右鍵工程-》生成自定義-》選擇cuda生成

  5.5 右鍵test.cu-》屬性-》選擇cuda c/c++編譯器

  5.6 右鍵工程-》屬性-》連接器-》常規-》附加庫目錄-》添加目錄 $(CUDA_PATH_V5_5)\lib\$(Platform);

  5.7 在連接器-》輸入中添加 cudart.lib

 

  5.8 在工具-》選項-》文本編輯器-》文件擴展名-》添加cu \cuh兩個文件擴展名

 

至此,編譯環境的相關搭建就完成了。

 


 

 

下面提供了一段test.cu的代碼,供測試使用:

 

 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 }
相關文章
相關標籤/搜索