如何使用现代CMAKE(每个目标)添加多个CUDA源代码?

时间:2019-02-03 15:11:56

标签: cmake compilation cuda

我无法获得每个目标的现代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的工作方式)。

2 个答案:

答案 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>"
  )