Matlab通过mex调用CUDA的方法

最近有使用Matlab通过mex调用CUDA加速视频处理的需求,于是折腾了一下,网上的说法可谓千奇百怪众说纷纭,却没有能用的。经过六个多小时的反复搜索和尝试,本人终于成功编译运动了了matlab的mexCUDA例程:mexGPUExample.cu。

1.软件环境

这个过程涉及三个环境:Visual Studio、Cuda Toolkit和Matlab。其中Cuda依赖Visual Studio、Matlab依赖Cuda和Visual Studio。官方正式支持的版本关系如下表:

Matlab版本 CUDA版本 Visual Studio版本
2014a 5.5 2008,2010
2014b 6.5 2008,2010,2012

本人用的Win10系统(64位),Matlab2014b、Cuda 7.5和VS2013。如果使用官方支持的版本,需要降级Cuda驱动和VS版本,要命的是,低版本的Cuda驱动在Win10上会崩溃(本人遇到过一次)。通过修改mex配置文件,可以使以上软件版本也用Cuda。

2.步骤

Matlab通过mex使用CUDA可以分为三步:
1 首先准备好cuda kernel文件(Matlab 自带,我的在下面的位置):
"D:\Program Files\MATLAB\R2014b\toolbox\distcomp\gpu\extern\src\mex\mexGPUExample.cu"
2 编写一个testMexCuda.m文件,内容如下:
#设置环境变量
setenv('CUDA_PATH', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5');
setenv('CUDA_BIN_PATH','C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin');
setenv('CUDA_LIB_PATH', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib');
#编译(-v为显示详细信息,利于查错)
mex -v mexGPUExample.cu
#运行测试程序
x = ones(4,4,'gpuArray');
y = mexGPUExample(x)
注意如果你使用的CUDA版本不是7.5,请将7.5改为你的版本号(如6.5,6.0等)。
3 将mex_CUDA_win64.xml文件复制到testMexCuda.m文件所在的目录,并修改为内容如下
("D:\Program Files\MATLAB\R2014b\toolbox\distcomp\gpu\extern\src\mex\win64\mex_CUDA_win64.xml")



    
具体修改方式:
(1)VS环境变量: VS100COMNTOOLS=>VS120COMNTOOLS (120是VS2013,110是VS2012,100是VS2010)
(2)两个注册表值: "SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0A" => "...\Windows\v7.1A"
(3)两个变量值:最后的LIB和LIBPATH直接更改为上面文件中的值。

以上的第三点修改很重要,如果不修改,编译时会出现如下错误:

错误使用 mex
nvcc fatal   : Could not set up the environment for Microsoft Visual Studio using 'D:/Program Files (x86)/Microsoft Visual Studio
12.0/VC/Bin/amd64/../../../VC/bin/amd64/vcvars64.bat'

如果你编译的时候还有错,注意具体问题具体分析了,一般是版本号的问题。

运行成功后的结果如下:

>> testMexCuda
>> y

y =

     2     2     2     2
     2     2     2     2
     2     2     2     2
     2     2     2     2

3.总结

  1. 用mex调用CUDA是Matlab利用CUDA最简单的方式。在探索过程中,本人也看到了网上所说的用VS生成lib或dll的方法,经试验没有一个是成功的。自己做lib依赖项很难控制,mex的时候还是会产生一大堆LNK2001错误。
  2. mex调用CUDA的关键在于配置文件mex_CUDA_win64.xml。每次用mex编译时将修改好的xml文件放在当前目录下,那么编译.cu文件与编译.cpp文件操作完全相同。还有一种方法,将修改好的mex_CUDA_win64.xml复制到D:\Program Files\MATLAB\R2014b\bin\win64\mexopts,这样一劳永逸,每次mex编译时不必再将xml文件带着了。
  3. 解决了编译问题,剩下的就是如何利用好CUDA加速你的程序了。