前言
同样的一个算法,在matlab中以.m文件运行的时间:
通过mexFunction调用,运行的时间:
在Matlab中有两种方法可以调用GPU进行运算,实现数量级的加速。
方法1:gpuArray
语法如下:
a = ones(512,512,512);
b = 2*ones(512,512,512);
aa = gpuArray(a); % 将数组转到GPU中计算
bb = gpuArray(b); % 数据必须都转到GPU中,GPU显存与CPU内存数据不通用
cc = aa .* (bb + 1).^2;
cc = gather(cc); % 使用gather从GPU取出数据到CPU
使用函数gpuArray()“包裹”住数组,matlab会自动将数组转到GPU的显存中进行计算。再使用gather()取回结果到内存里。
此方法编程难度很小,一般来说,可以加速2至20倍。
对于复杂的,难以并行的任务,可以采用这种简单的方式。直接在matlab代码中将所有大数组全部用gpuArray包裹起来,然后在计算完成查看结果时使用gather取出数据。几行代码就能加速好几倍。
方法2:通过mexFunction调用CUDA代码
此方法上手难度较高,需要配置环境,学习CUDA代码语法,但是很有收益。
具体是使用matlab函数接口,自己写CUDA程序调用GPU。写好了后能够像matlab函数一样调用,非常方便。
数据通过matlab的.m程序调用,进入c++的内存中,然后c++调用cuda程序接口,传输到gpu显存中,再使用核函数进行计算,此方法能够加速10-2000倍。我的配置为CPU:i7-12700; GPU:RTX 3090;
调用示例:
[UCT_img_real,UCT_img_imag] = FarFocus_3d5_v1(UCT_data_real_GPU,UCT_data_imag_GPU, ...
x_range,y_range,z_range,loc,single(pos_focus),arg_int,arg_float, ...
single(r1_1),single(r1_2),single(r_2_2));
对应的c++代码为:(较长所以就截图了)
接口函数:mexFunction
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
nlhs:输出参数数目
plhs:指向输出参数的指针
nrhs:输入参数数目
prhs:指向输入参数的指针
环境配置
要使用这种方法,你需要:
- 硬件:英伟达Nvidia的GPU。
- 软件:Matlab,Visual Studio。
第一步安装Visual Studio
版本选择:
首先根据Matlab版本选择Visual Studio,截止2025年4月,只有Matlab 2025b适配了Visual Studio 2022。
所以强烈建议Matlab 2020a至2024b均下载Visual Studio 2019版本,否则matlab不适配无法编译会报错。这都是血泪史:https://blog.csdn.net/m0_46317675/article/details/135876100?spm=1011.2124.3001.6209
然而官网只能下载Visual Studio 2022。不过我去淘宝几块钱买了2019版本下载安装包,安装包大小只有6MB。
https://pan.baidu.com/s/1WE0Z3IS8SLWdSIjPbN02qw?pwd=3tgj
链接:
https://pan.baidu.com/s/1WE0Z3IS8SLWdSIjPbN02qw
提取码: 3tgj 复制这段内容后打开百度网盘手机App,操作更方便哦
–来自百度网盘超级会员v3的分享
第二步安装CUDA
推荐教程:CUDA安装教程(超详细Windows版)
安装好后,你就可以调用GPU了,不仅是使用Matlab调用CUDA,python等深度学习也需要安装CUDA
在一步一步安装的时候,如果识别了Visual Studio,则成功,之后的matlab也能成功识别。
第三步配置Matlab环境
- 在matlab命令行中输入
mex -setup
2. 点击【mex -setup C++】,出现提示:
第四步配置系统环境变量
1.按下键盘的win标志键,在windows里搜索:环境变量
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ec90741b15be43a9bee4281bb46508aa.png
点击:【环境变量】
在系统变量里找到:【Path】
在系统变量的Path变量中添加所安装matlab文件夹中的extern\lib\win64\microsoft,matlab\lib\win64和matlab\bin\win64。
第五步配置Visual Studio项目环境配置
创建新项目
如果正确安装了CUDA,并且重启了电脑和Visual Studio后,Visual Studio可以识别CUDA Runtime,选择它,点击【下一步】
随便命个名字,点击【创建】
点击【本地Windows调试器】,直接开始编译运行。
如果编译没有报错,且有如下输出,则你已经可以利用Visual Studio开发GPU的CUDA代码了
第六步,配置Visual Studio环境以能通过Matlab调用
打开【视图】中的【解决方案资源管理器】
点击齿轮
首先对VC++ 目录栏中得包含目录及库目录进行配置。在包含目录中添加所安装matlab文件夹中的extern\include和extern\include\win64,在库目录中添加extern\lib\win64\microsoft。不知道Matlab安装在哪的可以下载一个软件:Everthing
Everything下载地址
然后搜索:【mat.h】即可知道文件夹路径
添加extern\include和extern\include\win64到外部包含目录
在库目录中添加extern\lib\win64\microsoft
在【链接器】的【常规】的【附加库目录】添加:extern\lib\win64\microsoft
最后配置链接器输入选项栏中的附加依赖项。在附加依赖项中添加:libmat.lib、libmx.lib、libmex.lib、libeng.lib、cufft.lib
前4个lib是Matlab调用的时候要用的,最后一个是给GPU傅里叶变换用的
编写CUDA代码
到这里你已经完成了环境上的配置,接下来用一个简单的计算代码来验证编译和验证路径,体验GPU的极致加速吧。
TODO;