MatConvNet是一个基于MATLAB的工具箱。针对计算机视觉相关的应用,它实现了卷积神经网络(CNN)的各种基本功能。相对于Caffe或Tensor Flow等基于C/C++底层实现的CNN函数库来说,它具有便于学习、易于修改以及适合跨平台编程等特点,适合CNN的初学者来学习。
然而,因为某种原因,它对NVIDIA系列早期型号的显卡支持并不好。以现在Amazon上白菜价都能买到的GeForce GT 610为例,在打开GPU支持进行编译后,可能会出现如下的编译错误:
nvcc fatal : Unsupported gpu architecture 'compute_21'经过网上查资料了解,这其实是因为MatConvNet的GPU编译代码中的一个Bug所导致。对于早期的显卡型号,它仅支持十的整数倍的GPU体系代码。在上面的例子中,如果将'compute_21'置换成‘compute_20’,便可以正常的编译了。为此,我们需要将vl_compilenn.m文件中的一个函数进行如下的修改:
% --------------------------------------------------------------------function cudaArch = get_cuda_arch(opts)% --------------------------------------------------------------------opts.verbose && fPRintf('%s:/tCUDA: determining GPU compute capability (use the ''CudaArch'' option to override)/n', mfilename);try gpu_device = gpuDevice(); arch_code = strrep(gpu_device.ComputeCapability, '.', ''); % To fix the bug arch_code_temp = str2double(arch_code); arch_code_temp = floor(arch_code_temp/10)*10; arch_code = num2str(arch_code_temp); % cudaArch = ... sprintf('-gencode=arch=compute_%s,code=///"sm_%s,compute_%s///" ', ... arch_code, arch_code, arch_code) ;catch opts.verbose && fprintf(['%s:/tCUDA: cannot determine the capabilities of the installed GPU; ' ... 'falling back to default/n'], mfilename); cudaArch = opts.defCudaArch;end如此一来,与GPU相关的代码就能正常编译了。不过需要注意的是,在编译时不要打开cuDNN的支持,否则在运行时,会因为编译和运行时GPU体系代码不一致,而导致程序异常结束。
所以,如果身边有闲置的机器但又苦于没有高端的GPU时,可以考虑购置一些低端的显卡。然后,用此方法编译、运行一些对GPU速度、内存需求不高的程序,以提高机器的利用率。
新闻热点
疑难解答