前提是,你的cuda版本是9.0以上,如果你已经把Cuda改成了如下参数,即删掉了20,依旧报错,可以尝试我的解决方法。
CUDA_ARCH := -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_52,code=sm_52 \
-gencode arch=compute_60,code=sm_60 \
-gencode arch=compute_61,code=sm_61 \
-gencode arch=compute_61,code=compute_61
我的情况是GTX 1050,cuda 10.2 + cudnn7.6.5
(此处多嘴一句,之前我安装的时候用的cudnn8,但是nvidia在cudnn8里面改了一下存放版本号的位置,导致cmake caffe的时候软件包读取cudnn版本会出错,版本会变成ver???,选择cudnn7就可以了。也许改一下8的那个h文件也可以,我没尝试)
具体的解决方法是,粗暴一点,打开caffe/cmake/Cuda.cmake,找到第七行的
set(Caffe_known_gpu_archs "20 21(20) 30 35 50 60 61")
把它改成你显卡的架构,就别叫他自己识别了,只限制到你具体的显卡的架构。
架构可以在这里查询 https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/
比如我的显卡是GTX1050,是帕斯卡架构,就是
就把那行改成
set(Caffe_known_gpu_archs "60 61")
保存之后再去编译即可。改完记得make clean,然后make all -j8这样。会有warning,但是能make完。
如果在这里需要加新的架构,比如我主力机的2080ti,就需要在加了75之后,类似于这样的修改
elseif(${CUDA_ARCH_NAME} STREQUAL "Pascal")
set(__cuda_arch_bin "75")
(我没把帕斯卡改成图灵只是因为我不确定其他地方有没有引用,本着少改的原则,凑合吧)
后续,如果你用的opencv4,还有个法子可以让caffe适配opencv4.
https://github.com/BVLC/caffe/pull/6625
这个没被merge进最终包,是因为老哥用了很粗暴的法子把所有opencv3和4冲突的地方全改成4里面的调用法了,所以用老版本的同志们就又不行了。但是他的法子给单独用opencv4的就很好。
具体我就不写了,参考一下这个pull的filechange,看看他改的几个文件,很清楚了。主要就是把CV_LOAD_IMAGE_COLOR改成cv::IMREAD_COLOR,还有把CV_LOAD_IMAGE_GRAYSCALE改成cv::IMREAD_GRAYSCALE
更新的cuda11我试都没想试,肯定不兼容……毕竟caffe太老了,我这也是女朋友毕设参考的项目需要用,我也没空重新去把那个项目整个迁移到pytorch,所以才花时间去复原一套比较老的环境来跑那个项目。如果你们以后想搞这方面,还是趁早学习pytorch比较好。毕竟现在的pytorch是基于caffe2和pytorch合并提升而来的。