如何在MFC中呼叫CUDA,如何在c 工程中呼叫cuda函式

2022-03-26 05:28:21 字數 3180 閱讀 4546

1樓:緣lai如茨

有時候,我們需要在比較大的專案中呼叫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)

如下圖所示:

需要注意的是在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倍的時間。

2樓:匿名使用者

你好, cuda預設的都是pageabled的memory,page-locked也就是pinned memory可以加快host和device之間的資料傳輸速度,但是使用太多的page-locked的memory會帶來整個程式的效率降低。如果程式中存在頻繁的cudamemcpy

如何在c++工程中呼叫cuda函式

3樓:成都

找到你需要的庫檔案和標頭檔案,在工程裡設定你的庫檔案位置和標頭檔案位置,就可以了啊。

4樓:匿名使用者

你好, cuda預設的都是pageabled的memory,page-locked也就是pinned memory可以加快host和device之間的資料傳輸速度,但是使用太多的page-locked的memory會帶來整個程式的效率降低。如果程式中存在頻繁的cudamemcpy

在C的MFC中如何在用DoModal()呼叫另外視窗後把原來的視窗消失

主視窗可採用非模式對話方塊方式,第二個視窗用模式或非模式都可以。主視窗顯示時,可以調物件的showwindow sw show 等第二個視窗彈出後,再調主視窗物件的showwindow sw hide 如果需要在第二個視窗中單擊退出程式時,直接調主視窗的onclose 由於onclose 函式是主視...

mfc如何呼叫自己的對話方塊,MFC如何呼叫自己的對話方塊

先在類檢視中右鍵,新建一個對話方塊類,然後向上面說的建立一個物件,呼叫domodal,也可以用指標呼叫,但這建立的時模態對話方塊,可以用creat函式,showwindow函式建立非模態對話方塊例如 if iswindow m student.m hwnd 建立並顯示非模態對話方塊 m studen...

如何在matlab中呼叫matlab中已有的函式

呼叫函式檔案 myfile.m clear clcfor t 1 10 y mylfg t end 自定義函式檔案 mylfg.m function y mylfg x 注意 函式名 mylfg 必須與檔名 mylfg.m 一致 y x 1 3 注 這種方法要求自定義函式必須單獨寫一個m檔案,不能與...