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檔案,不能與...