如何让CMake自动检测CUDA_COMARTURATIONS的值? [英] How can I get CMake to automatically detect the value for CUDA_ARCHITECTURES?

查看:66
本文介绍了如何让CMake自动检测CUDA_COMARTURATIONS的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

CMake的较新版本(3.18及更高版本)了解CUDA代码编译所针对的CUDA体系结构的选择。目标具有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实际上提供了这样的自动检测能力,但是:

  1. 它没有文档记录(并且可能在将来的某个时候被重构)。
  2. 它是已弃用的FindCUDA机制的一部分,适用于直接操作CUDA_CMAKE_FLAGS(这不是我们想要的)。
  3. 它没有扮演好角色,并且对我们隐藏了它的有用形式的内部变量。

尽管如此,只要稍微加点油,我们就能让它工作起来。

首先,它的位置:它在一个模块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问题2237519199,了解CMake未来可能的发展方向。警告:我已将这些漏洞归档...

这篇关于如何让CMake自动检测CUDA_COMARTURATIONS的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆