Cmake编译Caffe,如果改过Cuda_arch,make时依旧nvcc fatal : Unsupported gpu architecture ‘compute_20‘的解决办法

前提是,你的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合并提升而来的。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释:if(CUDA_FOUND) message(STATUS "Found CUDA Toolkit v${CUDA_VERSION_STRING}") enable_language(CUDA) set(HAVE_CUDA TRUE) if (CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA") if(${CUDA_VERSION_STRING} VERSION_GREATER_EQUAL "11.1") execute_process(COMMAND ${CMAKE_CUDA_COMPILER} --list-gpu-code RESULT_VARIABLE EXIT_CODE OUTPUT_VARIABLE OUTPUT_VAL) if(EXIT_CODE EQUAL 0) #Remove sm_ string(REPLACE "sm_" "" OUTPUT_VAL ${OUTPUT_VAL}) #Convert to list string(REPLACE "\n" ";" __CUDA_ARCH_BIN ${OUTPUT_VAL}) #Remove last empty entry list(REMOVE_AT __CUDA_ARCH_BIN -1) else() message(FATAL_ERROR "Failed to run NVCC to get list of GPU codes: ${EXIT_CODE}") endif() elseif(${CUDA_VERSION_STRING} VERSION_GREATER_EQUAL "11.0") set(__CUDA_ARCH_BIN "35;37;50;52;53;60;61;62;70;72;75;80") elseif(${CUDA_VERSION_STRING} VERSION_GREATER_EQUAL "10.0") set(__CUDA_ARCH_BIN "30;32;35;37;50;52;53;60;61;62;70;72;75") elseif(${CUDA_VERSION_STRING} VERSION_GREATER_EQUAL "9.1") set(__CUDA_ARCH_BIN "30;32;35;37;50;52;53;60;61;62;70;72") else() set(__CUDA_ARCH_BIN "30;32;35;37;50;52;53;60;61;62;70") endif() else() message(FATAL_ERROR "Unsupported CUDA compiler ${CMAKE_CUDA_COMPILER_ID}.") endif() set(CUDA_ARCH_BIN ${__CUDA_ARCH_BIN} CACHE STRING "Specify 'real' GPU architectures to build binaries for") if(POLICY CMP0104) cmake_policy(SET CMP0104 NEW) set(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCH_BIN}) message(STATUS "CMAKE_CUDA_ARCHITECTURES: ${CMAKE_CUDA_ARCHITECTURES}") #Add empty project as its not required with newer CMake add_library(pcl_cuda INTERFACE) else() # Generate SASS set(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCH_BIN}) # Generate PTX for last architecture list(GET CUDA_ARCH_BIN -1 ver) set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -gencode arch=compute_${ver},code=compute_${ver}") message(STATUS "CMAKE_CUDA_FLAGS: ${CMAKE_CUDA_FLAGS}") add_library(pcl_cuda INTERFACE) target_include_directories(pcl_cuda INTERFACE ${CUDA_TOOLKIT_INCLUDE}) endif () endif()
05-30

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值