導航:首頁 > 源碼編譯 > cuda源碼編譯

cuda源碼編譯

發布時間:2023-07-02 13:55:01

① 如何使用cudaMallocPitch和cudaMemcpy2D

有時候,我們需要在比較大的項目中調用CUDA,這就涉及到MFC+CUDA的環境配置問題,以矩陣相乘為例,在MFC中調用CUDA程序。我們參考羅振東[email protected](國防科學技術大學計算機學院)的方法。

環境: Windows 7 SP1
Microsoft Visual Studio 2010
CUDA 5.0

步驟:

1.首先建立一個空的名叫Matrix Multiplication_KahanMFC的「FCM應用程序」項目:

點擊「確定」,這時彈出如下窗口

我們需要對默認項目進行一些修改,點擊「下一步」,我們設置一個空的MFC項目,選擇「單個文檔」和「MFC標准」:

點擊「完成」。
2.創建CUDA的調用介面函數及其頭文件
(1)頭文件
「添加」--> 「新建項」-->「Visual C++」-->「頭文件(.h)」-->「名稱」-->「CUDA_Transfer.h」 -->「添加」,如下圖:

在CUDA_Transfer.h中添加如下代碼:
//CUDA_Transfer.h

#include
#include "math.h"

using namespace std;

int run_cuda(float* GPU, float* CPU);
如下圖所示:

(2)函數
按照和增加頭文件相似的方法,添加函數。「添加」--> 「新建項」-->「Visual C++」-->「C++文件(.cpp)」 -->「名稱」-->「CUDA_Transfer.cpp」 -->「添加」,如下圖:

在CUDA_Transfer.cpp中添加如下代碼:
//CUDA_Transfer.cpp
#include "CUDA_Transfer.h"
#include "stdafx.h"

extern "C" int runtest(float* GPU, float* CPU);

int run_cuda(float* GPU, float* CPU)
{
runtest(GPU,CPU);
return 0;
}
如下圖所示:

需要注意的是在MFC的文件中是不能包含(include).cu文件的,會報錯,所以我們使用extern "C"的方式來實現函數的調用。
3. 創建存放cuda 代碼的篩選器,名為CUDA
「添加」--> 「新建篩選器」,重命名為CUDA

4. 在篩選器CUDA中創建一個CUDA源代碼文件,kernel.cu。
我們直接把已經寫好的矩陣相乘的程序kernel.cu復制到項目目錄下,添加到CUDA篩選器中去。
添加」--> 「現有項」-->「kernel.cu」--> 「添加」:

把kernel.cu的int main()函數改為extern "C" int runtest(float* GPU, float* CPU),兩個參數用來獲得GPU和CPU計算所使用的時間,單位為毫秒。
5. 右擊項目-->「生成自定義」:

在彈出的窗口中勾選CUDA 5.0(.target,.props)。如果使用其他版本的CUDA,就勾選對應的版本:

點擊「確定」。
6. 修改 kernel.cu的編譯鏈接設置
在解決方案資源管理器中右擊kernel.cu文件-->「屬性」,在彈出窗口中-->「常規」-->「項類型」的下拉列表中選擇

點擊「應用」後,「常規」下方會出現一個「CUDA C/C++」的設置,沒有特殊需求,不需要修改,點擊「確定」。

7.修改工程設置。

工程設置需要修改「鏈接器」-->「輸入」-->「附加依賴項」和「生成事件」-->「預先生成事件」-->「命令行」。需要設置的參數比較多,我們採用比較簡單的方法。

我們新建一個空的CUDA項目,在這個空CUDA項目的項目屬性中找到「鏈接器」-->「輸入」-->「附加依賴項」,把「附加依賴項」中所包含的項復制到我們的MFC項目中:

按照同樣的方法,設置「生成事件」-->「預先生成事件」-->「命令行」:

設置完成後,點擊「確定」。
8.修改MFC文件,完成調用。
我們需要在MFC中調用CUDA程序,顯示出GPU和CPU計算兩個1024*1024矩陣相乘所消耗的時間。
在Matrix Multiplication_KahanMFCView.cpp中包含(include)"CUDA_Transfer.h"
文件;在CMatrixMultiplication_KahanMFCView::OnDraw(CDC* pDC)中添加如下代碼:

float GPU;
float CPU;
run_cuda(&GPU, &CPU);

CString strGPU,strCPU;
strGPU.Format(_T("GPU:%f \n"),GPU);
strCPU.Format(_T("CPU:%f \n"),CPU);
pDC->TextOut(0,0,strGPU);
pDC->TextOut(0,30,strCPU);

如圖所示:

然後重新生成解決方案,運行。
計算要花費一些時間,需要等待,測試的時候可以把矩陣大小改小一些。因為把程序加到了OnDraw中,所以每當刷新窗口時候(例如調整窗口大小時),都會調用。由於計算耗時比較長,窗口看起來會像無響應一樣,等計算完成就好了。
運行的結果如下:

在矩陣比較大的情況下,GPU的加速效果明顯,GPU耗時只需要620ms,而CPU需要23438ms,要花費將近40倍的時間。

② GPU高性能運算之CUDA,CUDA編程報錯,大牛幫忙解答啊

唉,是自己粗心大意,忘了給main函數入口了,在主機端代碼中加上函數聲明和主函數就行了:
//函數聲明
void runTest(int argc, char** argv);
//主函數
int main(int argc, char** argv)
{
runTest(argc,argv);
CUT_EXIT(argc,argv); //退出CUDA
}

③ 如何在Linux下編譯CUDA程序,生成動態鏈接庫

首先創建一個soTest的文件夾,裡面有兩個文件deviceQuery.cpp, t.cpp。

deviceQuery.cpp的代碼可以參考CUDASDKt.cpp的源代碼如下:

#includeintcudev(intargc,char**argv);
intmain(intargc,char**argv)
{
cudev(argc,argv);
return0;
}

然後在當前目錄下輸下命令

閱讀全文

與cuda源碼編譯相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:144
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163