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
里面有如下文件:
打开配置文件将里面的9.1全部更改为10.1
注意,这里需要更改的配置文件与你使用编译的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,一共三处。
解决参考博客:https://blog.csdn.net/qq_23944915/article/details/100137942
6、再次运行vl_compilenn('enableGpu', true)
编译成功。
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
错误原因: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,改为如下: