如何在MFC中调用CUDA
如何在MFC中調(diào)用CUDA
?????? 有時(shí)候,我們需要在比較大的項(xiàng)目中調(diào)用CUDA,這就涉及到MFC+CUDA的環(huán)境配置問(wèn)題,以矩陣相乘為例,在MFC中調(diào)用CUDA程序。我們參考羅振東iylzd@163.com(國(guó)防科學(xué)技術(shù)大學(xué)計(jì)算機(jī)學(xué)院)的方法。
?
環(huán)境: Windows 7 SP1
????????????? Microsoft Visual Studio 2010
????????????? CUDA 5.0
?
步驟:
?
1.首先建立一個(gè)空的名叫Matrix Multiplication_KahanMFC的“FCM應(yīng)用程序”項(xiàng)目:
?
點(diǎn)擊“確定”,這時(shí)彈出如下窗口
?????? 我們需要對(duì)默認(rèn)項(xiàng)目進(jìn)行一些修改,點(diǎn)擊“下一步”,我們?cè)O(shè)置一個(gè)空的MFC項(xiàng)目,選擇“單個(gè)文檔”和“MFC標(biāo)準(zhǔn)”:
點(diǎn)擊“完成”。
2.創(chuàng)建CUDA的調(diào)用接口函數(shù)及其頭文件
?????? (1)頭文件
?????? “添加”--> “新建項(xiàng)”-->“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)函數(shù)
?????? 按照和增加頭文件相似的方法,添加函數(shù)。“添加”--> “新建項(xiàng)”-->“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文件的,會(huì)報(bào)錯(cuò),所以我們使用extern "C"的方式來(lái)實(shí)現(xiàn)函數(shù)的調(diào)用。
3. 創(chuàng)建存放cuda 代碼的篩選器,名為CUDA
?????? “添加”--> “新建篩選器”,重命名為CUDA
4. 在篩選器CUDA中創(chuàng)建一個(gè)CUDA源代碼文件,kernel.cu。
?????? 我們直接把已經(jīng)寫好的矩陣相乘的程序kernel.cu復(fù)制到項(xiàng)目目錄下,添加到CUDA篩選器中去。
?????? 添加”--> “現(xiàn)有項(xiàng)”-->“kernel.cu”--> “添加”:
?????? 把kernel.cu的int main()函數(shù)改為extern "C" int runtest(float* GPU, float* CPU),兩個(gè)參數(shù)用來(lái)獲得GPU和CPU計(jì)算所使用的時(shí)間,單位為毫秒。
5. 右擊項(xiàng)目-->“生成自定義”:
在彈出的窗口中勾選CUDA 5.0(.target,.props)。如果使用其他版本的CUDA,就勾選對(duì)應(yīng)的版本:
點(diǎn)擊“確定”。
6. 修改?kernel.cu的編譯鏈接設(shè)置
?????? 在解決方案資源管理器中右擊kernel.cu文件-->“屬性”,在彈出窗口中-->“常規(guī)”-->“項(xiàng)類型”的下拉列表中選擇
?
? ? ? ?點(diǎn)擊“應(yīng)用”后,“常規(guī)”下方會(huì)出現(xiàn)一個(gè)“CUDA C/C++”的設(shè)置,沒有特殊需求,不需要修改,點(diǎn)擊“確定”。
?
7.修改工程設(shè)置。
?
?????? 工程設(shè)置需要修改“鏈接器”-->“輸入”-->“附加依賴項(xiàng)”和“生成事件”-->“預(yù)先生成事件”-->“命令行”。需要設(shè)置的參數(shù)比較多,我們采用比較簡(jiǎn)單的方法。
?
?????? 我們新建一個(gè)空的CUDA項(xiàng)目,在這個(gè)空CUDA項(xiàng)目的項(xiàng)目屬性中找到“鏈接器”-->“輸入”-->“附加依賴項(xiàng)”,把“附加依賴項(xiàng)”中所包含的項(xiàng)復(fù)制到我們的MFC項(xiàng)目中:
?????? 按照同樣的方法,設(shè)置“生成事件”-->“預(yù)先生成事件”-->“命令行”:
設(shè)置完成后,點(diǎn)擊“確定”。
8.修改MFC文件,完成調(diào)用。
?????? 我們需要在MFC中調(diào)用CUDA程序,顯示出GPU和CPU計(jì)算兩個(gè)1024*1024矩陣相乘所消耗的時(shí)間。
?????? 在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);
?
如圖所示:
?????? 然后重新生成解決方案,運(yùn)行。
???????? 計(jì)算要花費(fèi)一些時(shí)間,需要等待,測(cè)試的時(shí)候可以把矩陣大小改小一些。因?yàn)榘殉绦蚣拥搅?/span>OnDraw中,所以每當(dāng)刷新窗口時(shí)候(例如調(diào)整窗口大小時(shí)),都會(huì)調(diào)用。由于計(jì)算耗時(shí)比較長(zhǎng),窗口看起來(lái)會(huì)像無(wú)響應(yīng)一樣,等計(jì)算完成就好了。
?????? 運(yùn)行的結(jié)果如下:
?????? 在矩陣比較大的情況下,GPU的加速效果明顯,GPU耗時(shí)只需要620ms,而CPU需要23438ms,要花費(fèi)將近40倍的時(shí)間。
?????????????????????????????????????????????? ???????????????????????????????????????????????????????????????? by:蔣佩釗 2013.06.04 蘭州交通大學(xué)
轉(zhuǎn)載于:https://www.cnblogs.com/mr-totoro/archive/2013/06/04/5785669.html
總結(jié)
以上是生活随笔為你收集整理的如何在MFC中调用CUDA的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: openjdk需要自己添加cacerts
- 下一篇: unix cut命令