如何使用CMake将C++编译为CUDA

5

我正在编写一些可以编译为C++或CUDA的代码。在后一种情况下,它使用CUDA内核,在前一种情况下,它只运行常规代码。

创建名为test.cpp的文件后,我可以手动进行编译:

g++ test.cpp          # build as C++ with GCC
nvcc -x cu test.cpp   # build as CUDA with NVCC

-x cu 表示告诉 nvcc,尽管它是 .cpp 扩展名,我想让它将其视为 CUDA。至此一切顺利。

然而,当我迁移到使用 CMake 时,我不知道如何做同样的事情。也就是说:如何要求 CMake 使用 NVCC 编译 .cpp 文件,而不是 GCC。

cmake_minimum_required(VERSION 3.9)
project(cuda_test LANGUAGES CUDA CXX)
add_executable(cuda_test test.cpp)     # builds with GCC

如果我创建了一个指向原始文件的符号链接:
ln -s test.cpp test.cu

然后修改CMakeLists.txt:

add_executable(cuda_test test.cu)     # builds with NVCC

但我希望能够在CMake中指定NVCC的-x开关的等效项,而不是玩弄扩展名。类似于:

set_target_properties(cuda_test PROPERTIES FORCE_LANGUAGE CUDA)

甚至可以
set_target_properties(test.cpp PROPERTIES FORCE_LANGUAGE CUDA)

这样的咒语存在吗?

可能是重复问题:https://dev59.com/vlcP5IYBdhLWcg3whKN3 - sweenish
4
要告诉 CMake 使用 CUDA 编译器编译一个源文件,你可以为该文件设置 LANGUAGE 属性:set_source_file_properties(test.cpp PROPERTIES LANGUAGE CUDA) - Tsyvarev
谢谢@sweenish,但我认为那不是同一个问题。我可以正常传递特定于编译器的参数,但不能在首次指定编译器。也就是说,如果我执行target_compile_options(cuda_test PRIVATE "-x cu"),该标志将传递给GCC而不是NVCC。 - Edd Inglis
@Tsyvarev,这是“……文件……”,但除此之外这正是我所需要的。非常感谢。请把它作为答案而不是评论,我会接受它。 - Edd Inglis
1个回答

10

默认情况下,CMake根据源文件的扩展名选择编译器。但是你可以通过为文件设置LANGUAGE属性来强制CMake使用你想要的编译器:

set_source_files_properties(test.cpp PROPERTIES LANGUAGE CUDA)

(这只是调用CUDA编译器来编译普通编译器选项的文件。您仍然需要传递其他选项给该编译器,以便它可以使用不寻常的文件扩展名)。


我意识到现在我只是在抱怨,但是......由于属性是文件特定的而不是目标特定的,所以我现在只能将此文件编译为CUDA。我会寻找答案,但想知道你是否也有一个神奇的解决方案?! - Edd Inglis
@EddInglis 注意,你可以在同一个调用中列出所有源文件:set_source_files_properties(test.cpp test2.cpp test3.cpp PROPERTIES ...) 或者你可以提供一个包含所有源文件列表的变量。 - Kevin
谢谢,@squareskittles,这很方便。不过我的意思是,一旦我在test.cpp上设置了属性,现在CMake将始终使用NVCC编译它。理想情况下,我可以使用GCC或NVCC构建它。为了避免让这个问题变得更加复杂,我会提一个新的问题。干杯。 - Edd Inglis
1
在CMake中,单个目标可以包含不同语言的源文件。因此,编译语言不是目标的属性。(有目标属性LINKER_LANGUAGE用于指定链接器的语言,但链接和编译是分开的步骤。) - Tsyvarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接