我无法获得每个目标的现代cmake来设置多个 CUDA gencode标志。
CMake示例:
'routines.f90'
这将输出:
target_compile_options(myHeaderLib INTERFACE
$<$<COMPILE_LANGUAGE:CUDA>:-gencode arch=compute_50,code=sm_50>
$<$<COMPILE_LANGUAGE:CUDA>:-gencode arch=compute_52,code=sm_52>
$<$<COMPILE_LANGUAGE:CUDA>:-gencode arch=compute_53,code=sm_53>
$<$<COMPILE_LANGUAGE:CUDA>:-gencode arch=compute_60,code=sm_60>
$<$<COMPILE_LANGUAGE:CUDA>:-gencode arch=compute_62,code=sm_62>
)
但是需要的是:
... -gencode arch=compute_50,code=sm_50 arch=compute_52,code=sm_52 arch=compute_53,code=sm_53
而且,仅设置$ {CUDA_NVCC_FLAGS}并不是一个可靠的解决方案(这不是现代CMAKE的工作方式)。
答案 0 :(得分:3)
这是因为CMake的“ 重复数据删除”策略提供了编译选项。
使用target_compile_options
,您可以创建正确的选项列表
-gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 ...
但是CMake会删除除第一个以外的所有-gencode
:
-gencode arch=compute_50,code=sm_50 arch=compute_52,code=sm_52 ...
在某些情况下,bugreport需要禁用CMake“重复数据删除”,并且在3.12 version中通过添加SHELL:
构造已得到解决。
自CMake 3.12起,此方法应该起作用:
target_compile_options(myHeaderLib INTERFACE
"SHELL:-gencode arch=compute_50,code=sm_50"
"SHELL:-gencode arch=compute_52,code=sm_52"
)
SHELL:
的工作方式首先,将组合选项放在双引号中可防止CMake“重复删除”常用选项:CMake看到不同的字符串
-gencode arch=compute_50,code=sm_50
-gencode arch=compute_52,code=sm_52
并且不认为它们是重复的。
然后,构造SHELL
解释CMake,需要将给定双引号内的字符串拆分为单独的命令行选项。但是此拆分是在“重复数据删除”阶段之后执行的,因此不会删除来自不同-gencode
字符串的重复SHELL:
。
答案 1 :(得分:0)
我知道已经有一段时间了。但是最近我提出了一个问题,事实证明,生成器也可以完美运行。将“ SHELL:”与生成器结合使用的技巧是用双引号将生成器引起来。
这是link,cmake的维护者指出了我的错误。希望这对将来有帮助。
target_compile_options(foo PRIVATE
"$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-gencode arch=compute_60,code=sm_60>"
)
target_compile_options(foo PRIVATE
"$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-gencode arch=compute_52,code=sm_52 -gencode arch=compute_50,code=sm_50>"
)