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

Jim*_*son 5 cuda compilation cmake

我无法让现代 cmake(每个目标)设置多个CUDA gencode 标志。

CMake 示例:

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>
                        )
Run Code Online (Sandbox Code Playgroud)

这将输出:

... -gencode arch=compute_50,code=sm_50 arch=compute_52,code=sm_52 arch=compute_53,code=sm_53
Run Code Online (Sandbox Code Playgroud)

但需要的是:

... -gencode arch=compute_50,code=sm_50  -gencode arch=compute_52,code=sm_52  -gencode arch=compute_53,code=sm_53 ...
Run Code Online (Sandbox Code Playgroud)

仅仅设置 ${CUDA_NVCC_FLAGS} 并不是一个可靠的解决方案(这不是现代 CMAKE 应该做的事情)。

Tsy*_*rev 5

这是因为CMake的“去重”编译选项的

target_compile_options您创建正确的选项列表

-gencode arch=compute_50,code=sm_50  -gencode arch=compute_52,code=sm_52 ...
Run Code Online (Sandbox Code Playgroud)

但 CMake 删除了-gencode除第一个之外的所有内容:

-gencode arch=compute_50,code=sm_50 arch=compute_52,code=sm_52 ...
Run Code Online (Sandbox Code Playgroud)

bug 报告称在某些情况下需要禁用 CMake“去重”,该问题已在3.12 版本中通过添加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"
)
Run Code Online (Sandbox Code Playgroud)

如何SHELL:运作

首先,将组合选项放入双引号中可以防止 CMake “去重复”常见选项:CMake 看到不同的字符串

-gencode arch=compute_50,code=sm_50
-gencode arch=compute_52,code=sm_52
Run Code Online (Sandbox Code Playgroud)

并且不认为它们是重复的。

然后,构造SHELL解释了 CMake,需要将给定双引号内的字符串拆分为单独的命令行选项。但这种分割是在“去重”阶段之后-gencode执行的,因此不同SHELL:字符串的重复不会被删除。