如何在MFC中调用CUDA
如何在MFC中調用CUDA
?????? 有時候,我們需要在比較大的項目中調用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)函數
?????? 按照和增加頭文件相似的方法,添加函數?!疤砑印?/span>--> “新建項”-->“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倍的時間。
?????????????????????????????????????????????? ???????????????????????????????????????????????????????????????? by:蔣佩釗 2013.06.04 蘭州交通大學
轉載于:https://www.cnblogs.com/mr-totoro/archive/2013/06/04/5785669.html
總結
以上是生活随笔為你收集整理的如何在MFC中调用CUDA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openjdk需要自己添加cacerts
- 下一篇: unix cut命令