Cuda學習筆記(四)——在vs2010中配置.cpp和.cu檔案
Cuda-c極大程度的方便了我們利用GPU並行處理來加快自己程式的執行速度,但是大多情況下我們的程式是一個極為龐大的工程專案,在這個專案中我們只需要利用cuda來加快其中某一塊演算法的執行效率,所以很多情況下利用cpp檔案來呼叫cu中的kernel函式,從而完成程式的並行運算。雖然cuda5.0之後可以直接從vs中生成現有的cuda專案,但是利用cpp來呼叫cu檔案的專案還是需要我們自己來進行配置的。
一. 檔案配置
1. 首先假定我們已經寫好了呼叫gpu運算的.cu檔案,如下圖所示。在這個檔案中,我們首先定義呼叫global裝置函式的主函式:
testghmain();
並在其前面加上extern “C” ,這個檔案定義了a、b兩個陣列, 並利用gpu來實現c=a+b的運算。
2. 在我們的工程中,需要呼叫上面這個.cu檔案中的函式進行並行加速的cpp檔案中,對testghmain();函式進行呼叫,所以在檔案前面需要對其進行事先宣告。
extern “C” int testghmain();
3. 之後,在上面這個.cpp檔案中,需要的地方直接呼叫testghmain()。
在這裡我們聲明瞭一個MFC的控制元件響應函式OnBnClickedbutton來呼叫testghmain(),當用戶點選這個button時,程式首先呼叫.cu檔案中的testghmain函式,而testghmain函式會呼叫global裝置函式,通過gpu實現c=a+b的運算,並把計算結果最終返回給使用者。
二. 工程屬性配置
此外,在配置完檔案之後,還需要對整個工程進行一些配置:
1. 右鍵工程->屬性->附加依賴項,新增cudart.lib;
2. 右鍵工程->生成自定義->選擇cuda6.5;
3. 右鍵新增的cu檔案,屬性->常規->項型別,選擇cuda c/c++。
至此就全部配置完成,可以執行程式看看結果。測試程式是對陣列a= { 1, 2, 3, 4, 5 };b= { 10, 20, 30, 40, 50 };相加得到c陣列並計算c陣列所有資料之和,正確結果應該返回165。
下面是在mfc中cpp檔案來呼叫cu檔案的專案結構組成,在其他型別的vs工程中呼叫.cu也是如此,封裝cu檔案,對主函式新增extern “C”,更改整個專案的屬性配置。
三. Tips:
1. kernel函式是需要進行封裝才能新增extern “C”來進行宣告並呼叫的,cpp檔案中是不能直接呼叫 __global__函式的,因為編譯器是無法解析符號<<<……>>>以及blockIdx、threadIdx等,因此 __global__ 函式只能放在.cu檔案函式裡面定義和被呼叫。
2. 用extern “C” 修飾的原因,就是.cu是擴充套件C,但由於cuda-c只是部分屬於c++,所以需要更改工程的配置屬性,將.cu檔案定義為類C語言編譯(NVCC.exe編譯)。
3. Cpp中是不能include“.cu”檔案的,就好比cpp中不能include“.cpp”一樣。