當前位置:編程學習大全網 - 源碼下載 - 如何使用cudaMallocPitch和cudaMemcpy2D

如何使用cudaMallocPitch和cudaMemcpy2D

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

環境: 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倍的時間。

  • 上一篇:GridView分頁問題
  • 下一篇:屬虎人2023年天賜吉兆,接福又添喜!
  • copyright 2024編程學習大全網