永发信息网

如何在MFC中调用CUDA

答案:2  悬赏:20  手机版
解决时间 2021-02-07 09:25
如何在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)函数
按照和增加头文件相似的方法,添加函数。“添加”--> “新建项”-->“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倍的时间。
全部回答
3.1 cuda的安装文件 直接双击exe文件,弹出后,首先会监测一下你的运行环境,如果找不到nividia对应的显卡设备,他会提示你是否要继续安装。这里面nvidia的显卡,最起码也是8800以上的,要不是无法编写cuda的。千万不要电脑上面是intel或者amd的显卡,却要编写cuda,除非你有钱买一个cuda-x86这个编译器。 3.2 弹出的对话框直接ok就行,这个是cuda的一些安装文件,无所谓的: 3.3 他会监测你的电脑是否支持cuda的搭建,等待就行 3.4 系统检查 3.5 选择同意并继续 3.6 推荐先选择自定义安装 3.7 最主要的是cuda document\cuda toolkit \cuda samples(sdk),nsight\图形驱动程序,3d如果需要的话安装,不安装也无所谓。这里主要就是能看见都有什么,免得漏掉了,博主当初就因为选了精简安装,没安装上sdk。 3.7 安装的位置,推荐自己建三个好找的文件夹,不用他默认的路径,免得稍后配置环境变量麻烦。 博主的安装路径为: 3.8 下一步安装就行了。 至此,cuda的安装就搞定了。 4 接下来配置cuda的环境变量,默认安装好后,他会自动帮你设置好2个环境变量,但是最好还自己添加下其他的几个,方便日后配置vs使用 上面的两个环境变量是cuda默认配置的,接下来添加 cuda_bin_path %cuda_path%\bin cuda_lib_path %cuda_path%\lib\win32 cuda_sdk_bin %cuda_sdk_path%\bin\win32 cuda_sdk_lib %cuda_sdk_path%\common\lib\win32 cuda_sdk_path c:\cuda\cudasdk\common 添加完就行了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么洗布娃娃(狗狗)
经测定,某激素分子是C21HxOyN4S2。已知该多
七龙珠里面谁是宇宙第一强者
大易视觉(张家港店)地址在什么地方,我要处理
淮北市新家园物业有限公司这个地址在什么地方
NE17907101231邮寄挂号信谁帮我查下?
中国人寿保险股份有限公司龙兴营销服务部地址
巴黎皇妃国际婚纱摄影(张家港店)地址有知道的
情侣间aa制好吗?辩论赛,我是反方,请各位给点
维多利亚婚纱摄影(张家港店)地址好找么,我有
立伟武城第一骨这个地址在什么地方,我要处理
()药材为毒性药A.藜芦B.生地黄C.牵牛子D.密
用开水烫过的小青菜怎么吃啊!
桂林米粉(百大美食城店)地址在哪,我要去那里
zuo|左岸高端婚纱摄影地址在什么地方,想过去
推荐资讯
叫屯地址有知道的么?有点事想过去
什么朝是我国青铜文化的灿烂时期,著名的青铜
东营市河口区义和镇大牟村幼儿园地址在什么地
停车场(红领巾路)(烟青路与红领巾路交叉口西1
什么是多媒体技术
求迅雷会员帐号密码
寒食节是春秋时晋文公为纪念介子推而设的节日
一首女声英文歌,开头翻译不是“如梦,似幻”
惠普23 q258cn win10怎么改win7
网易云音乐的地铁广告怎么就火了
龙文教育(沪太路)地址有知道的么?有点事想过
闻老大香掉牙酥饼怎么去啊,有知道地址的么
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?