Matlab与CUDA C的混合编程配置出现的问题及解决方案

如今,要实现大规模的并行计算,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++编译器配置好了。
 
   
  1. >> mex -setup
  2. MEX 配置为使用 'Microsoft Visual C++ 2015 Professional (C)' 以进行 C 语言编译。
  3. 警告: MATLAB C Fortran API 已更改,现可支持
  4. 包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,
  5. 您需要更新代码以利用
  6. 新的 API。您可以在以下网址找到相关详细信息:
  7. http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。
  8. 要选择不同的语言,请从以下选项中选择一种命令:
  9. mex -setup C++
  10. 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步
 
   
  1. >> mexcuda mexGPUExample.cu
  2. 警告: The selected C++ compiler is not supported for CUDA compilation. Searching for a supported compiler.
  3. > In mexcuda (line 89)
  4. 错误使用 mex
  5. 未找到支持的编译器或 SDK。有关选项,请访问 http://www.mathworks.com/support/compilers/R2016a/win64.html。
  6. 出错 mexcuda (line 157)
  7. [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 Answer provides a workaround to force MATLAB to use CUDA 8.0 and Visual Studio 14:

https://www.mathworks.com/matlabcentral/answers/305391-compiling-cuda-files-with-mexcuda-why-wont-matlab-accept-my-compiler

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

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

  1. Go to: "\toolbox\distcomp\gpu\extern\src\mex\win64"
  2. Copy files and rename 2013 to 2015: { "nvcc_msvcpp2013.xml" , "nvcc_msvcpp2013_dynamic.xml"}
  3. Replace inside those files "7.5" to "8.0" and "12" to "14".
  4. Done.
按照这个哥们的搞一搞。
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步
 
   
  1. >> mexcuda mexGPUExample.cu
  2. 使用 'NVIDIA CUDA Compiler' 编译。
  3. 错误使用 mex
  4. nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future
  5. release (Use -Wno-deprecated-gpu-targets to suppress warning).
  6. mexGPUExample.cu
  7. D:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/Bin/amd64/../../../VC/INCLUDE\crtdefs.h(10): fatal error C1083:
  8. 无法打开包括文件: corecrt.h”: No such file or directory
  9. 出错 mexcuda (line 157)
  10. [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步
 
    
  1. >> mexcuda mexGPUExample.cu
  2. 使用 'NVIDIA CUDA Compiler' 编译。
  3. c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h: warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
  4. c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h(849): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
  5. ...
  6. c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h(7956): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
  7. MEX 已成功完成。

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

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

A1、按照官网的教程,请在matlab中输入:
 
   
  1. x = ones(4,4,'gpuArray');
  2. y = mexGPUExample(x)
A2、如果你出现和官网一样的结果,则恭喜你,你已经搞定事情了。但是,如果你出现如下结果,请进入第A3步
 
    
  1. >> x = ones(4,4,'gpuArray');
  2. >> y = mexGPUExample(x)
  3. 未定义函数或变量 'mexGPUExample'
A3、这是由于刚生成mexw64文件,matlab还没有识别出来,没关系,重启一下,然后进入刚刚的目录,再来一遍,就会出现一下结果了。
 
    
  1. >> x = ones(4,4,'gpuArray');
  2. >> y = mexGPUExample(x)
  3. y =
  4. 2 2 2 2
  5. 2 2 2 2
  6. 2 2 2 2
  7. 2 2 2 2







猜你喜欢

转载自blog.csdn.net/shawpan/article/details/71037385