在Matlab中通过mex使用cuda的方法

仅供参考,具体问题需要具体分析!

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来加速你的程序了!! 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值