已装CUDA9.1+Caffe等环境,执行make all -j8报compute_20不支持错误求助
解决Caffe编译时nvcc报错Unsupported gpu architecture 'compute_20'的问题
首先得明确问题根源:CUDA 9.1已经彻底废弃了对compute_20(Fermi架构GPU)的支持,而Caffe默认配置里依然包含了这个架构的编译选项,所以才会触发这个报错。你之前用cmake -D CMAKE_BUILD_TYPE=RELEASE -D CUDA_GENERATION=Kepler ..没解决,大概率是因为cmake配置里还是残留了compute_20的相关设置,或者你其实是在用原生Makefile编译而非cmake方式。
下面分两种常见的编译场景给出解决方案:
场景1:用原生Makefile编译Caffe(你最初执行make all -j8的方式)
- 先进入Caffe根目录,找到
Makefile.config文件(如果没有,先复制示例文件:cp Makefile.config.example Makefile.config) - 打开
Makefile.config,找到CUDA_ARCH这一段配置,默认会包含compute_20相关的行:CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \ -gencode arch=compute_20,code=sm_21 \ -gencode arch=compute_30,code=sm_30 \ ... - 把开头两行包含
compute_20和sm_21的内容删掉,保留适配CUDA 9.1的架构选项。比如根据你的GPU型号调整,如果你是Kepler架构GPU,修改后应该是这样: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 - 保存文件后,先清理之前的编译缓存:
make clean - 重新执行编译:
make all -j8
场景2:用cmake编译Caffe
如果确实是用cmake方式,之前的CUDA_GENERATION=Kepler参数没生效,你可以直接指定具体的CUDA架构编号来绕过compute_20:
- 先清空cmake缓存(进入build目录,删除所有文件:
rm -rf *) - 重新执行cmake命令,明确指定支持的CUDA架构二进制和PTX版本,比如针对Kepler架构:
如果你是其他架构的GPU,对应替换编号即可:cmake -D CMAKE_BUILD_TYPE=RELEASE -D CUDA_ARCH_BIN="30 35" -D CUDA_ARCH_PTX="35" ..- Maxwell(GTX 900系列):
"50 52" - Pascal(GTX 10系列):
"60 61" - Volta(Tesla V100):
"70"
- Maxwell(GTX 900系列):
- 然后执行
make all -j8完成编译
额外提示
你可以通过nvidia-smi命令查看自己的GPU型号,再对应到正确的compute能力编号,避免指定错误的架构选项。
内容的提问来源于stack exchange,提问作者Lawrence_Liu
相关产品推荐
相关产品推荐

