1. 构建一个C++插件来实现与CUDA的交互;
2. 将CUDA程序编译为动态链接库(DLL)文件;
3. 在UE5项目中添加动态链接库;
4. 在C++插件中使用动态链接库调用CUDA程序。
具体来说,您可以按照以下步骤 *** 作:
1. 在UE5中创建一个新的插件项目。
2. 在插件项目中添加包含CUDA代码的源文件,并将其编译为动态链接库。
3. 在插件项目中添加包含CUDA头文件以及相关库文件的路径。
4. 在插件代码中使用动态链接库调用CUDA程序。
需要注意的是,在开发过程中还需要注意以下几点:
1. 编译CUDA程序时需要使用正确的编译器和CUDA工具包版本;
2. 需要确保CUDA代码能够在动态链接库中正常运行;
3. 如果需要在多个平台上使用该插件,则需要对不同平台进行编译并添加平台特定的代码。
总的来说,与CUDA的交互需要比较深入的技术知识,我们建议您在开始之前做好充分的准备和了解相关知识。
你好,你的kernel应该用__global__啊,用__device__只是定义了一个让device来调用的函数而已。而且你的 d_result是按值传递底,必须按地址传递才行,应该改成*d_result。
望采纳,谢谢。
有时候,我们需要在比较大的项目中调用CUDA,这就涉及到MFC+CUDA的环境配置问题,以矩阵相乘为例,在MFC中调用CUDA程序。我们参考罗振东iylzd@163.com(国防科学技术大学计算机学院)的方法。
环境: Windows 7 SP1
Microsoft Visual Studio 2010
CUDA 5.0
步骤:
1.首先建立一个空的名叫Matrix Multiplication_KahanMFC的“FCM应用程序”项目:
点击“确定”,这时d出如下窗口
我们需要对默认项目进行一些修改,点击“下一步”,我们设置一个空的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. 右击项目-->“生成自定义”:
在d出的窗口中勾选CUDA 5.0(.target,.props)。如果使用其他版本的CUDA,就勾选对应的版本:
点击“确定”。
6. 修改 kernel.cu的编译链接设置
在解决方案资源管理器中右击kernel.cu文件-->“属性”,在d出窗口中-->“常规”-->“项类型”的下拉列表中选择
点击“应用”后,“常规”下方会出现一个“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倍的时间。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)