如今,要实现大规模的并行计算,GPU是不二的选择,而使用cuda c进行GPU编程是目前进行GPU并行计算的主流方式。

However,matlab是科研人员最熟悉的编程语言。于是,一个折衷的方法就是将一些需要并行的代码用cuda c写好,然后用matlab调用它。

那么,如何配置呢?

准备材料:

win10 x64、matlab2016、visual studio 2015、CUDA 8.0

步骤:

0、以下使用matlab都请用管理员权限打开。

1、在matlab的命令行中输入:mex -setup,显示如下结果,这说明你的C\C++编译器配置好了。

>>mex-setupMEX配置为使用'Microsoft Visual C++ 2015 Professional (C)'以进行C语言编译。警告:MATLAB C和FortranAPI已更改,现可支持包含2^32-1个以上元素的MATLAB变量。不久以后,您需要更新代码以利用新的API。您可以在以下网址找到相关详细信息:http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。要选择不同的语言,请从以下选项中选择一种命令:mex-setup C++mex-setup FORTRAN

2、按照matlab官网的教程进行用例的编译和测试,地址如下:

如果你能顺利的完成官网的教程,则跳到第9步,否则进入第3步。

3、在你的matlab安装目录下看是否有

mexGPUExample.cu文件,应该在

matlabroot/toolbox/distcomp/gpu/extern/src/mex/

目录下,比如我的matlab安装在C:\Program Files\MATLAB\R2016a\ 中,这个文件就在 C:\Program Files\MATLAB\R2016a\toolbox\distcomp\gpu\extern\src\mex。

将matlab的工作目录改为

mexGPUExample.cu

文件所在的目录,如我的在:

C:\Program Files\MATLAB\R2016a\toolbox\distcomp\gpu\extern\src\mex

4、在matlab的命令行中输入:mexcuda mexGPUExample.cu,如果显示如下结果,则进入第5步

>>mexcuda mexGPUExample.cu警告:Theselected C++compilerisnotsupportedforCUDA compilation.Searchingfora supported compiler.>Inmexcuda(line89)错误使用mex未找到支持的编译器或SDK。有关选项,请访问http://www.mathworks.com/support/compilers/R2016a/win64.html。出错mexcuda(line157)[varargout{1:nargout}]=mex(mexArguments{:});

5、出现上面的错误是由于matlab2016、vs2015和cuda8.0不适配造成的,使用matlab论坛上的回答是:

MATLAB R2016b requires CUDA 7.5, which doesn't support Visual Studio 2015. So the first thing it's doing is checking for a version of Visual Studio you can use, which you don't have.

但是,有意思的是,这哥们又说:

接着看这个网页,一个哥们提到了一种曲线救国的方案:

This is how to compile (*mexcuda*) with Visual Studio 2015 and Cuda 8.0 :

Go to: "\toolbox\distcomp\gpu\extern\src\mex\win64"

Copy files and rename 2013 to 2015: { "nvcc_msvcpp2013.xml" , "nvcc_msvcpp2013_dynamic.xml"}

Replace inside those files "7.5" to "8.0" and "12" to "14".

按照这个哥们的搞一搞。

mexGPUExample.cu

文件所在的目录中,你可以看到叫win64的文件夹,打开,可以看到有nvcc_msvcpp2012.xml、nvcc_msvcpp2012_dynamic.xml、

nvcc_msvcpp2013.xml、

nvcc_msvcpp2013_dynamic.xml,就是没有跟2015有关的文件,所以我们是不是应该做些什么。按照这个哥们的意思,将

nvcc_msvcpp2013.xml、

nvcc_msvcpp2013_dynamic.xml复制粘贴到这个文件夹,这是会出现这2个文件的副本,把这两个副本的文件名改为

nvcc_msvcpp2015.xml、

nvcc_msvcpp2015_dynamic.xml,当然,只换皮不换肉是不行的,打开这2个文件,按Ctrl+H,将文件中的7.5全部替换成8.0,将12替换成14.然后保存。

6、重启matlab,还是进入刚刚的路径,

在matlab的命令行中输入:

mexcuda mexGPUExample.cu,如果显示如下结果,则进入第7步

>>mexcuda mexGPUExample.cu使用'NVIDIA CUDA Compiler'编译。错误使用mexnvcc warning:The'compute_20','sm_20',and'sm_21'architectures are deprecated,andmay be removedina futurerelease(Use-Wno-deprecated-gpu-targets to suppress warning).mexGPUExample.cuD:/Program Files (x86)/MicrosoftVisualStudio14.0/VC/Bin/amd64/../../../VC/INCLUDE\crtdefs.h(10):fatal error C1083:无法打开包括文件:“corecrt.h”:Nosuch fileordirectory出错mexcuda(line157)[varargout{1:nargout}]=mex(mexArguments{:});

7、这个错误可能是由于使用的是win10系统造成的,需要预设一些环境变量,可以参考如下网页

需要在系统的环境变量中添加两个变量(INCLUDE和LIB):

INCLUDE =
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt
LIB =
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10150.0\ucrt\x64

8、

重启matlab,还是进入刚刚的路径,

在matlab的命令行中输入:

mexcuda mexGPUExample.cu,如果显示如下结果,则进入第9步

>>mexcuda mexGPUExample.cu使用'NVIDIA CUDA Compiler'编译。c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h:warning C4819:该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为Unicode格式以防止数据丢失c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h(849):warning C4819:该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为Unicode格式以防止数据丢失...c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h(7956):warning C4819:该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为Unicode格式以防止数据丢失MEX已成功完成。

9、编译完成后,会发现在同一目录下多出了个mexGPUExample.mexw64文件。恭喜你,终于编译完成了。

编译完成了你就不想跑一下,测试一下能不能用吗?

A1、按照官网的教程,请在matlab中输入:

x=ones(4,4,'gpuArray');y=mexGPUExample(x)

A2、如果你出现和官网一样的结果,则恭喜你,你已经搞定事情了。但是,如果你出现如下结果,请进入第A3步

>>x=ones(4,4,'gpuArray');>>y=mexGPUExample(x)未定义函数或变量'mexGPUExample'。

A3、这是由于刚生成mexw64文件,matlab还没有识别出来,没关系,重启一下,然后进入刚刚的目录,再来一遍,就会出现一下结果了。

>>x=ones(4,4,'gpuArray');>>y=mexGPUExample(x)y=2222222222222222