1. 环境:
Visual Studio 2017
MATLAB2019a
cuda 10.0
cudnn-10.0-windows10-x64-v7.6.5.32
matconvnet-1.0-beta20
NVIDIA GeForce RTX 2080 Ti
2. 准备工作
2.1 Cuda版本:
这里查询到我们驱动的版本CUDA 12.1,下载CUDA时版本不能高于你的显卡驱动的版本号,比如我的就不能高于12.1,所以这里我选择了10.0版本。
2.2 CUDA与Matlab版本对应
通过此表与2.1内容最终确认matlab与cuda版本,在此我选用matlab2019a与cuda10.0。
2.3 matlab与VS版本对应
先安装matlab后安装Visual Studio,或者VS版本比matlab高等原因,很可能mex -setup命令无法找到安装好的Visual Studio编译器,强烈建议先安装VS再安装matlab,并且VS版本比matlab略低!!!会省掉超多麻烦(具体版本对应我也不太确定)
以下可以检测matlab支持的VS版本序列,输入路径D:\Matlab2019a\bin\win64\mexopts
文件夹内容如下:
文件夹里的vsxxx.xml文件表明支持相应版本的VS。如果下载后,版本不匹配出现问题,将在下边细说。
2.4 cuda与cudnn版本对应
cudnn下载地址:cuDNN Archive | NVIDIA Developer 点击进去即可看见与cuda的版本对应关系
3.matlab与vs混合编程
3.1 安装示例(公众号:软件管家):先VS,再matlab!可以省很多麻烦。
VS与matlab安装成功后,打开matlab,在命令行窗口中输入:
mex -setup -V
成功页面:
3.2 出现以下问题
可以看博客:(18条消息) 低版本Matlab(2020b)与高版本Visual Studio(VS2022)实现M、C/C++混合编程(调试)_读书人不偷东西的噢!的博客-CSDN博客 但是当时的我懒得动脑子,但也试了很多方法也没成功,最后重新安装不同版本的VS和matlab就好了
这个我用了很多方法都不行,最后把D:\Microsoft Visual Studio\Visual Studio2017\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64文件下的cl.exe复制粘贴在D:\Matlab2019a\toolbox\matconvnet\matlab,其他办法:快速解决MatConvNet中‘cl.exe‘ 不是内部或外部命令_matlab cl.exe_angleboy8的博客-CSDN博客
(18条消息) 解决VS2022版出现“‘cl‘ 不是内部或外部命令”的问题_vs不是内部或外部命令也不是可运行_王铁柱子哟-的博客-CSDN博客
4.cuda与cudnn安装教程
安装示例:(18条消息) Cuda和cuDNN安装教程(超级详细)_cuda安装_jhsignal的博客-CSDN博客免注册cudnn下载:(18条消息) Cuda和cuDNN安装教程(超级详细)_cuda安装_jhsignal的博客-CSDN博客
5.matconvnet安装
其实现在才是真正的开始。。。
5.1下载工具箱
首先官网Home - MatConvNet下载工具包,然后解压放在D:\Matlab2019a\toolbox(这是我放的路径,我把文件夹的名字直接改为matconvnet了)
5.2 CPU编译
复制粘贴以下代码到命令行窗口即可(这是看了好多教程后总结的比较简单的方法):
mex -setup C++ %MEX 配置为使用VS以进行 C++ 语言编译
cd D:\Matlab2019a\toolbox\matconvnet %打开matconvnet文件夹
addpath matlab %添加路径
vl_compilenn %编译工具箱
vl_setupnn %设置工具箱
出现一下页面即成功:
在MATLAB命令行输入如下命令可以测试:
vl_testnn
5.3 GPU编译
在matconvnet文件夹下建立一个新的文件夹local,并将cudnn文件整体放入。复制粘贴以下代码到命令行窗口即可:
vl_compilenn('enableGpu', true,'cudaRoot', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0', 'cudaMethod', 'nvcc','enableCudnn', true,'cudnnRoot', ' D:\R2019a\toolbox\matconvnet\local\cudnn');
第一位置为cuda的安装位置,第二个为cudnn的位置,就是刚才local的那个位置。
出现问题:
错误使用 vl_compilenn>nvcc_compile (line 521)
Command "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin\nvcc" -c "D:\R2019a\toolbox\matconvnet\matlab\src\bits\impl\pooling_gpu.cu" -DNDEBUG -DENABLE_GPU -DENABLE_CUDNN
-ID:\R2019a\toolbox\matconvnet\local\cudnn\include -DENABLE_DOUBLE -D__SSSE3__ -gencode=arch=compute_75,code=\"sm_75,compute_75\" -I"D:\R2019a\extern\include"
-I"D:\R2019a\toolbox\distcomp\gpu\extern\include" -gencode=arch=compute_75,code=\"sm_75,compute_75\" -Xcompiler /MD -o
"D:\R2019a\toolbox\matconvnet\matlab\mex\.build\bits\impl\pooling_gpu.obj" failed.
出错 vl_compilenn (line 466)
nvcc_compile(opts, srcs{i}, objfile, flags.nvcc) ;
1 error detected in the compilation of "C:/Users/Justin/AppData/Local/Temp/tmpxft_00001afc_00000000-8_pooling_gpu.cpp1.ii".
pooling_gpu.cu
Error using vl_compilenn>nvcc_compile (line 521)
Command "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin\nvcc" -c
"C:\Users\Justin\Documents\MATLAB\matconvnet-1.0-beta20\matlab\src\bits\impl\pooling_gpu.cu" -DNDEBUG -DENABLE_GPU -DENABLE_DOUBLE -D__SSSE3__
-gencode=arch=compute_61,code="sm_61,compute_61" -I"C:\Program Files\MATLAB\R2016a\extern\include" -I"C:\Program
Files\MATLAB\R2016a\toolbox\distcomp\gpu\extern\include" -gencode=arch=compute_61,code="sm_61,compute_61" -Xcompiler /MD -o
"C:\Users\Justin\Documents\MATLAB\matconvnet-1.0-beta20\matlab\mex.build\bits\impl\pooling_gpu.obj" failed.
Error in vl_compilenn (line 466)
nvcc_compile(opts, srcs{i}, objfile, flags.nvcc) ;
其实出现的很多问题都看不懂了,按照别人的教程给了很多次都没用,最后发现换了cudnn版本才解决。