仅供参考,具体问题需要具体分析!
1.cuda安装及配置,参考下面这篇
cpp文件调用cuda函数_苹果挨炮的博客-CSDN博客
2.Matlab配置mex编译环境
在matlab命令行中输入以下命令
mex -setup
然后会提示用户是安装c++版本的还是fortran版本的
这里我们选择c++版本的,输入以下命令
mex -setup C++
然后matlab会在你的电脑里检查可用编译器,提示用户选择不同的编译器安装(假如你的电脑里安装的是2022版的visula c++,但你的matlab版本低于2022版,可能会检测不出来)
这里我们不选择2022版本,选择2017版本的(原因后面讲),输入提示的命令
mex -setup:'D:\Program Files\MATLAB\R2022a\bin\win64\mexopts\msvcpp2022.xml' C++
3.编写.cpp文件并用mex编译
在介绍可被mexcuda编译的.cu文件之前,先说明一下可被mex编译的.cpp文件的编写方式,与普通的.cpp文件不同,这里的.cpp文件中没有main()函数,而是mexFuncion()函数,它大概长这个样子
# include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
//nlhs (number of left-hand side) 是输出参数的个数
//nrhs (number of right-hand side) 是输入参数的个数
//prhs[]是指针数组,指向输入的参数,这个参数是在matlab中调用编译好的mexw64时输入的参数
//如phrs[0]指向第一个参数,phrs[1]指向第二个参数
//plhs[]也是指针数组,指向输出的变量
}
以下是一段求两点之间斜段斜率的函数
# include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
//mxGetScalar用于获取第一个参数的值
double x1 = mxGetScalar(prhs[0]);
double y1 = mxGetScalar(prhs[1]);
double x2 = mxGetScalar(prhs[2]);
double y2 = mxGetScalar(prhs[3]);
//假如你第一个参数是个矩阵,需要用mxGetPr()来获取
//double *data = mxGetPr(prhs[0]);
double k = (y2 - y1) / (x2 - x1);
double b = (x2 * y1 - x1 * y2) / (x2 - x1);
//mxCreateDoubleMatrix(m, n, _)用来创建一个大小为m×n的矩阵用来储存,_指定有无虚部
plhs[0] = mxCreateDoubleMatrix(1, 2, mxREAL);
double* res = mxGetPr(plhs[0]);
//plhs[0]相当于老板,负责揽项目(开辟内存),再把揽好的项目交给工程队去做(将内存地址
//赋值给res,再用res去赋值)
res[0] = k;
res[1] = b;
}
写完后在matlab中用mex xx.cpp编译,然后就可以当做函数使用了
C 矩阵 API- MATLAB & Simulink- MathWorks 中国
matlab提供了一些接口函数,用于编写被mex编译的cpp程序
4.编写.cu文件并用mexcuda编译
.cu文件的编写方式是普通.cu文件和被mex编译的cpp文件两者编写方式的结合——将mexFunction()作为kernel函数,还需要加上 "gpu/mxGPUArray.h" 头文件
matlab提供了样例代码在这个文件夹下,可供参考
D:\Program Files\MATLAB\R2022a\toolbox\parallel\gpu\extern\src\mex\mexGPUExample.cu
在编译前可先使用gpudevice来查看自己的显卡参数,有时会出现不支持的情况,需要另行百度(像我就是2020版的matlab不支持3090的显卡,安装了2022版的就可以了)
然后使用mexcuda编译mexGPUExample.cu文件,与普通mexw64函数不一样的是,使用了cuda的mexw64函数在调用之前,需要用gpuArray()函数将参数从cpu拷贝到gpu,然后再调用编译好的函数,最后输出的结果也是在gpu中,需要再用gather函数拷贝到cpu
为什么之前安装mex的时候选择2017版本而不选择2022版本的呢?打开这个文件夹
D:\Program Files\MATLAB\R2022a\toolbox\parallel\gpu\extern\src\mex\win64
可以看到只有2017和2019两个版本的.xml文件,所以2022版本的matlab并不支持用visual 2022 c++编译.cu文件,运行时会出现如下警告
虽然依旧会编译成功,但实际并不是使用的visual 2022 c++编译的,所以安装时尽量选择这个文件夹下支持的版本
GPU CUDA and MEX Programming- MATLAB & Simulink- MathWorks 中国
matlab同样也提供了用于被mexcuda编译的.cu文件的接口函数,可以作为参考
如果一切顺利的话,你就可以愉快地在matlab中使用cuda来加速你的程序了!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)