Windows 10系统下MATLAB2018b调用CUDA 10.1和NVCC

MATLAB2018b默认支持的CUDA版本为9.1,但是我已经安装好了CUDA10.1及Cudnn7.6.4,如果重装比较麻烦,下面给出MATLAB2018b调用CUDA 10.1的方法。

1、更改MATLAB配置GPU的配置文件

路径:D:\Softwares\MATLAB\toolbox\distcomp\gpu\extern\src\mex\win64

里面有如下文件:

Windows 10系统下MATLAB2018b调用CUDA 10.1和NVCC_第1张图片

打开配置文件将里面的9.1全部更改为10.1

Windows 10系统下MATLAB2018b调用CUDA 10.1和NVCC_第2张图片

注意,这里需要更改的配置文件与你使用编译的Visual Studio版本有关,我的VS版本是2017,所以更改nvcc_msvcpp2017.xml和nvcc_msvcpp2017_dynamic.xml即可。保险起见,可以全部都更改。

2、打开vl_compilenn.m

更改687行

for v = {'5.5', '6.0', '6.5', '7.0', '7.5', '8.0', '8.5', '9.0', '9.5', '10.0'}

为:

for v = {'5.5', '6.0', '6.5', '7.0', '7.5', '8.0', '8.5', '9.0', '9.5', '10.0', '10.1'}

3、运行vl_compilenn('enableGpu', true)

此时,MATLAB已经能够找到有效的NVCC编译器了,但还是会报如下错误:

警告: CL.EXE not found in PATH. Trying to guess out of mex setup. 
> In vl_compilenn>check_clpath (line 650)
  In vl_compilenn (line 426) 
'cl.exe' 不是内部或外部命令,也不是可运行的程序 
或批处理文件。 
错误使用 vl_compilenn>check_clpath (line 656)
Unable to find cl.exe

出错 vl_compilenn (line 426)
    cl_path = fileparts(check_clpath()); % check whether cl.exe in path

解决方法:https://blog.csdn.net/qq_17783559/article/details/105460307

4、再次运行vl_compilenn('enableGpu', true)

会出现如下错误:

nvcc fatal   : '-DNDEBUG': expected a number 
错误使用 vl_compilenn>nvcc_compile (line 615)
Command "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvcc" -c -o
"E:\matconvnet\matlab\mex\.build\bits\data.obj"
"E:\matconvnet\matlab\src\bits\data.cu" -DENABLE_GPU
-DENABLE_DOUBLE -O -DNDEBUG -D_FORCE_INLINES --std=c++11 -I"D:\Softwares\MATLAB\extern\include"
-I"D:\Softwares\MATLAB\toolbox\distcomp\gpu\extern\include" -gencode=arch=compute_75,code=\"sm_75,compute_75\"  --compiler-options=/MD
--compiler-bindir="D:\Softwares\VisualStudio\VC\Tools\MSVC\14.16.27023\bin\Hostx64"  failed.

出错 vl_compilenn (line 487)
      nvcc_compile(opts, srcs{i}, objfile, flags) ;

错误原因:

CUDA 10.1以前的版本使用非debug模式下GPU优化指令是-O,CUDA 10.1以上版本把-O指令给弃用了。

现在的指令为-O+数字,此处的数字为优化的等级。vl_compilenn默认编译是非debug模式的,所以matlab会提示我们需要一个数字。

解决方法:

1)使用debug运行vl_compilenn,这种方法会导致性能损失,不可取。

2)将优化指令-O改为-O+数字。

更改方法如下:

将vl_compilenn.m,将606行的nvcc_compile函数

function nvcc_compile(opts, src, tgt, flags)
% --------------------------------------------------------------------
if check_deps(opts, tgt, src), return ; end
nvcc_path = fullfile(opts.cudaRoot, 'bin', 'nvcc');
nvcc_cmd = sprintf('"%s" -c -o "%s" "%s" %s ', ...
                   nvcc_path, tgt, src, ...
                   strjoin(horzcat(flags.base,flags.nvcc)));
opts.verbose && fprintf('%s: NVCC CC: %s\n', mfilename, nvcc_cmd) ;
status = system(nvcc_cmd);
if status, error('Command %s failed.', nvcc_cmd); end;

改为:

function nvcc_compile(opts, src, tgt, flags)
% --------------------------------------------------------------------
mybase=flags.base;
mybase(3)={'-O3'};
if check_deps(opts, tgt, src), return ; end
nvcc_path = fullfile(opts.cudaRoot, 'bin', 'nvcc');
nvcc_cmd = sprintf('"%s" -c -o "%s" "%s" %s ', ...
                   nvcc_path, tgt, src, ...
                   strjoin(horzcat(mybase,flags.nvcc)));
opts.verbose && fprintf('%s: NVCC CC: %s\n', mfilename, nvcc_cmd) ;
status = system(nvcc_cmd);
if status, error('Command %s failed.', nvcc_cmd); end;

注意对比,我们使用指令为“-O3”,即默认优化等级为3,也可以改为自己想优化的等级。

5、再次运行vl_compilenn('enableGpu', true)

遇到如下错误:

错误使用 mex
'E:\matconvnet\matlab\mex\vl_nnconv.mexw64' 使用了 '-R2018a' 进
行编译并与 '-R2017b' 链接在一起。 有关详细信息,请参阅 MEX 文件使用了一个 API 进行编译并与另一个 API 链接在一起。

出错 vl_compilenn>mex_link (line 629)
mex(args{:}) ;

出错 vl_compilenn (line 500)
  mex_link(opts, objs, flags.mex_dir, flags) 

解决方法:将vl_compilenn.m中的largeArrayDims全部替换为lmwblas,一共三处。

Windows 10系统下MATLAB2018b调用CUDA 10.1和NVCC_第3张图片

解决参考博客:https://blog.csdn.net/qq_23944915/article/details/100137942

6、再次运行vl_compilenn('enableGpu', true)

编译成功。

Windows 10系统下MATLAB2018b调用CUDA 10.1和NVCC_第4张图片

 

 

2020.08.13日更新,

由于Matlab的版本不同,可能会找不到nvcc_msvcpp2017.xml配置文件。直接编译会出现如下错误。

c:\program files\nvidia gpu computing toolkit\cuda\v10.1\include\sm_20_intrinsics.h(925): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 
e:\codes\matlab\mycodes\matconvnet\matlab\src\bits\datamex.hpp(19): fatal error C1083: 无法打开包括文件: “gpu/mxGPUArray.h”: No such file or directory 
nvcc warning : The -std=c++11 flag is not supported with the configured host compiler. Flag will be ignored. 
datamex.cu 
错误使用 vl_compilenn>nvcc_compile (line 617)
Command "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvcc" -c -o
"E:\Codes\MATLAB\MyCodes\matconvnet\matlab\mex\.build\bits\datamex.obj"
"E:\Codes\MATLAB\MyCodes\matconvnet\matlab\src\bits\datamex.cu" -DENABLE_GPU -DENABLE_DOUBLE -O3 -DNDEBUG -D_FORCE_INLINES
--std=c++11 -I"D:\Softwares\MATLAB\extern\include" -I"D:\Softwares\MATLAB\toolbox\distcomp\gpu\extern\include"
-gencode=arch=compute_75,code=\"sm_75,compute_75\"  --compiler-options=/MD
--compiler-bindir="D:\Softwares\VisualStudio\VC\Tools\MSVC\14.16.27023\bin\Hostx64"  failed.

出错 vl_compilenn (line 487)
      nvcc_compile(opts, srcs{i}, objfile, flags) ;

错误提示,找不到mxGPUArray.h

Windows 10系统下MATLAB2018b调用CUDA 10.1和NVCC_第5张图片

错误原因:Matlab R2019b的配置文件所在路径为:D:\Softwares\MATLAB\toolbox\parallel\gpu\extern\src\mex\win64;

mxGPUArray.h所在路径为:D:\Softwares\MATLAB\toolbox\parallel\gpu\extern\include\gpu;

而编译vl_compilenn的默认路径为:D:\Softwares\MATLAB\toolbox\distcomp\gpu\extern\src\mex\win64;

 

解决方法:将vl_compilenn.m的第367行的distcomp改为parallel,改为如下:

Windows 10系统下MATLAB2018b调用CUDA 10.1和NVCC_第6张图片

你可能感兴趣的:(环境配置,matlab,cuda,深度学习)