在windows上Matlab 编译MatConvNet
windows 10 64 bits
matlab 2015b/2016a
MatConvNet 1.0-beta20 或者从github 下载GIT repository
CUDA GPU Computing ToolKit 7.5
cudnn-rc4/cudnn-rc5
都按照官网http://www.vlfeat.org/matconvnet/
配置好了之后,
编译命令
vl_compilenn(‘enableGpu‘, true, ... ‘cudaRoot‘,‘C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5‘,... ‘cudaMethod‘, ‘nvcc‘, ... ‘enableCudnn‘, true, ... ‘cudnnRoot‘, ‘local\cudnn-rc4‘,... ‘verbose‘,‘2‘,... ‘debug‘,‘1‘);
主要遇到两个问题
1.找不到’cudnn.h’,这个是cudnnRoot路径配置问题,官网的意思是在MatConvNet目录下新建local文件夹,之后把cudnn放到local文件夹下,打开local\cudnn-rc4应该看到三个文件夹include,bin,lib,编译时要在MatConvNet目录下进行,先输入addpath matlab加入matlab文件路径。提示,直接nvidia官网下载的cudnn解压后应该是多出一级中间目录cuda,比如cudnn\cuda\,在编译时可以把cudnn路径写成"local\cudnn-rc4\cuda",或者手动把中间目录缩减
2.编译vl_compilenn出错
原代码
if opts.enableCudnn flags.cc{end+1} = ‘-DENABLE_CUDNN‘ ; flags.cc{end+1} = [‘-I‘ opts.cudnnIncludeDir ] ; end
文件路径出错,在报错信息里-I后跟cudnnIcludeDir路径没有加双引号
修改后,一开始很盲目,看了mathworks上的回答采取认真看出错信息,仔细点应该能发现问题
if opts.enableCudnn flags.cc{end+1} = ‘-DENABLE_CUDNN‘ ; flags.cc{end+1} = [‘-I"‘ opts.cudnnIncludeDir ‘"‘] ;%http://cn.mathworks.com/matlabcentral/answers/264961-having-problem-in-matconvnet-to-compiling-the-cudnn-support "opts.cudnnIncludeDir" end
github上最新版本已经修复这个问题
3.nvcc 编译MatConvNet\matlab\src\bits\impl\nnbilinearsampler_cudnn.cu报错 在250行左右 undefined "backward" identifier
因为在
template<typename type, bool backwardData, bool backwardGrid> static vl::Error forward_backward
函数中缺少backward的定义,仿照前面的
template<typename type> __global__ void grid_backward_kernel
函数中的方式在函数开始部分添加
bool backward = backwardData;//added here for cudnn compile with undefined ‘backward‘ identifier
发现backward或者backwardData只是一个bool 型的值作为一个选项
4.编译MatConvNet\matlab\src\bits\impl\nnbilinearsampler_cudnn.cu出错,第24行
#warning "bilinearsampler_cudnn.cu will be disabled as it requires CUDNN v5 or higher."
报,无效的预编译指令“warning”
原来,gcc,C# 中有#warning指令,MSVC C\C++中没有#warning 指令,可以用#pragma message "warning ..."代替