较新版本的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".
字符串
默认情况下,此target属性初始化为CMAKE_CUDA_ARCHITECTURES
。但是CMAKE_CUDA_ARCHITECTURES
本身没有初始化为任何东西(!)
如何让CMake自动检测CUDA_ARCHITECTURES
或全局CMAKD_CUDA_ARCHITECTURES
的适当值?也就是说,使用安装在系统上的GPU架构?
3条答案
按热度按时间prdp8dxp1#
在即将到来的CMake 3.24中,您将能够编写:
字符串
这将在配置时为系统上可用的GPU的(具体)CUDA架构构建目标
tgt
。对于更新版本的CUDA(11.5和更高版本),将把
native
传递给nvcc和其他可执行文件;对于旧版本,它将自动检测哪些体系结构是“原生”体系结构。**注意:**这实际上并没有给予架构列表(例如在CMake代码中迭代。)
0ejtzxu12#
CMake实际上提供了这样的自动检测功能,但是:
1.它没有文档记录(并且可能在将来的某个时候被重构)。
1.它是已弃用的FindCUDA机制的一部分,面向直接操作
CUDA_CMAKE_FLAGS
(这不是我们想要的)。1.它不会“玩得很好”,并且对我们隐藏了它有用的内部变量。
不过,只要费点力气,我们就能成功。
首先,它的位置:它位于一个模块
FindCUDA/select_compute_arch
中(在Linux系统上,它位于/path/to/cmake/root/share/cmake-X.YY/Modules/FindCUDA/select_compute_arch.cmake
中)。下面是你如何使用它:
字符串
如果您只希望对单个目标执行此操作,则可以将最后一行替换为:
型
备注:
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
更合适。ktca8awb3#
我在使用CMake 3. 13的系统时遇到了其他解决方案的问题,不确定它是什么,但我不得不使用这个。
也许有更好的方法来做到这一点。
字符串