環境:win7_64 VS2010 CUDA6.0 VAX Quadro410函數
安裝配置CUDA環境,這裏就不詳細介紹了。spa
1、手動創建CUDA工程code
打開VS2010,新建空白項目,起名爲 test2。 接口
在解決方案管理器中,右鍵點擊工程test2,生成自定義,選擇CUDA6.0文檔
添加頭文件 t.h,注意這裏t.cuh,也是能夠的,可是爲了外觀上等同於純C\C++類庫,寫成.h編譯器
添加源文件 t.cu ,右鍵點擊t.cu,屬性,常規,項類型,選擇CUDA C/C++。it
這樣一個手動創建的CUDA工程就配置好了。io
2、創建CUDA類庫,並生成dll編譯
在t.h中,寫上函數聲明,包含兩類函數,一是KERNEL函數,使用GPU的並行計算;二是調用KERNEL函數的普通C函數。這兩類函數必須放到cu文件中,由CUDA編譯器編譯,內容以下:class
#ifndef _TEST2_H #define _TEST2_H//防護重複編譯 #ifdef _DLLEXPORTING//dll處處符號宏定義 #define TEST2_DLLDECL __declspec(dllexport) #else #define TEST2_DLLDECL __declspec(dllimport) #endif #include "cuda_runtime.h" #include "device_launch_parameters.h" //這兩個頭文件是CUDA必備,可是你右鍵->打開文檔「」的時候VS卻不能找到。不須要你手動設置路徑,只須要在 右鍵工程->生成自定義 中,選擇CUDA,VS便可自動找到包含路徑 #include <stdio.h> __global__ void addKernel(int *c, const int *a, const int *b);//這個是KERNEL函數,不能做爲類庫外部接口 cudaError_t TEST2_DLLDECL addWithCuda(int *c, const int *a, const int *b, unsigned int size);//這個C函數,內部調用了KERNEL函數,只能放在cu文件中,使用CUDA編譯器編譯。使用__declspec(dllimport)調用聲明,做爲dll的接口供外部調用。
2.在t.cu中寫入兩個函數的實現,以下:
#include "t.h" __global__ void addKernel(int *c, const int *a, const int *b) { int i = threadIdx.x; c[i] = a[i] + b[i]; } cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size) { //其餘代碼省略 addKernel<<<1, size>>>(dev_c, dev_a, dev_b); //其餘代碼省略 return cudaStatus; }
3.工程屬性,CUDA C\C++中,選擇Host ,Proprocessor Definition 中,添加_DLLEXPORTING
4.在工程屬性中,設置生成目標爲DLL,這樣會生成,dll,lib,pdb,等幾種文件
3、普通C++工程調用CUDA類庫dll
在相同解決方案中新建工程,在工程屬性中,連接器,常規,附加庫目錄,添加上一步生成的lib所在的目錄;在連接器,輸入,附加依賴項,添加test2.lib;保證你生成的exe和dll在同一目錄下。
工程,右鍵,生成自定義,選擇CUDA
雖然CUDA編譯器參與了生成過程,可是這個工程就是普通的C、C++工程, 自身使用VC編譯器,你只須要添加#include「..\\test2\\test2.h」就好了