如何在MFC中调用CUDA
答案:2 悬赏:20 手机版
解决时间 2021-02-07 09:25
- 提问者网友:流星是天使的眼泪
- 2021-02-06 08:48
如何在MFC中调用CUDA
最佳答案
- 五星知识达人网友:十年萤火照君眠
- 2021-02-06 09:07
有时候,我们需要在比较大的项目中调用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倍的时间。
环境: 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倍的时间。
全部回答
- 1楼网友:旧脸谱
- 2021-02-06 10:08
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
添加完就行了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯