如何让CMake自动检测CUDA_COMARTURATIONS的值? [英] How can I get CMake to automatically detect the value for CUDA_ARCHITECTURES?
本文介绍了如何让CMake自动检测CUDA_COMARTURATIONS的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
CUDA_ARCHITECTURES
属性,当设置该属性时,将为您生成适当的-gencode arch=whatever,code=whatever
编译选项。如果您不设置此值,您甚至会收到警告:
CMake Error in CMakeLists.txt:
CUDA_ARCHITECTURES is empty for target "my_cuda_app".
默认情况下,此目标属性初始化为CMAKE_CUDA_ARCHITECTURES
。但CMAKE_CUDA_ARCHITECTURES
本身未初始化为任何内容(!)
如何让CMake自动检测CUDA_ARCHITECTURES
或全局CMAKD_CUDA_ARCHITECTURES
的相应值?也就是说,使用系统上安装的GPU的架构?
推荐答案
CMake实际上提供了这样的自动检测能力,但是:
- 它没有文档记录(并且可能在将来的某个时候被重构)。
- 它是已弃用的FindCUDA机制的一部分,适用于直接操作
CUDA_CMAKE_FLAGS
(这不是我们想要的)。 - 它没有扮演好角色,并且对我们隐藏了它的有用形式的内部变量。
尽管如此,只要稍微加点油,我们就能让它工作起来。
首先,它的位置:它在一个模块FindCUDA/select_compute_arch
中(在Linux系统上,它将位于/path/to/cmake/root/share/cmake-X.YY/Modules/FindCUDA/select_compute_arch.cmake
)。
下面是您如何使用它:
include(FindCUDA/select_compute_arch)
CUDA_DETECT_INSTALLED_GPUS(INSTALLED_GPU_CCS_1)
string(STRIP "${INSTALLED_GPU_CCS_1}" INSTALLED_GPU_CCS_2)
string(REPLACE " " ";" INSTALLED_GPU_CCS_3 "${INSTALLED_GPU_CCS_2}")
string(REPLACE "." "" CUDA_ARCH_LIST "${INSTALLED_GPU_CCS_3}")
SET(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCH_LIST})
如果您只想将其用于单个目标,则应将最后一行替换为:
set_property(TARGET my_target PROPERTY "${CUDA_ARCH_LIST}")
备注:
如果您的系统上没有GPU,您可能会得到如下结果:
3.5;5.0;5.3;6.0;6.1;7.0;7.5;7.5+PTX
。这是一个issue with CMake which will not be resolved,因为我们在这里使用的子模块不是官方支持的。因此,如果您需要在没有GPU的系统上进行编译,请避免此调用或解析结果中的";+ptx";条目。
select_compute_arch
子模块存在的时间要长得多,但在过去,您会以不同的方式使用它,并将其包含在include(FindCUDA)
中。我想知道
LIST(APPEND CMAKE_CUDA_ARCHITECTURES
是否不比SET(CMAKE_CUDA_ARCHITECTURES
更合适。
这篇关于如何让CMake自动检测CUDA_COMARTURATIONS的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文