在CMake中指定CUDA编译器

13

我正在尝试使用基于clang-3.9的文档构建一个cuda项目。但我想使用cmake来构建我的项目,已经将CMAKE_CC_COMPILER和CMAKE_CXX_COMPILER分别设置为clang和clang++。

但问题是,如果我使用

file(GLOB_RECURSE CUDA_SOURCES "./*.cu")
CUDA_ADD_LIBRARY(Benchmarks_CUDA ${CUDA_SOURCES})

如果我在我的CMakeList.txt中使用,则cmake将默认使用nvcc编译器。但是我希望使用clang来编译 .cu 文件。

相反,如果我使用

add_library (Benchmarks_CUDA ${CUDA_SOURCES})

那么我将会收到一个错误

CMake Error: Cannot determine link language for target "Benchmarks_CUDA".
CMake Error: CMake can not determine linker language for target: Benchmarks_CUDA

请问如何使用cmake和clang构建.cu文件。


我承认我不知道clang可以用作CUDA编译器。首先,我建议添加文档建议的所有标志。其次,尝试使用项目命令设置语言是否有帮助。 - Robert Prévost
@robertprevost:至少你现在明白了所提出的问题。不过,我想再重复一下我的评论。这是一个cmake错误消息,因为在默认的构建命令中,.cu文件扩展名与C++编译操作之间没有关联。 - talonmies
@RobertPrévost 我认为问题出在cmake无法理解clang可以作为.cu文件的编译器。这就是为什么我在使用CUDA_ADD_LIBRARY时没有错误。无论如何,我尝试使用project命令来设置语言,但没有起到帮助作用。此外,clang可以用于编译CUDA程序。但是他们的解析器或优化器不如NVCC高效,因此对于我的应用程序来说,至少会有3倍的性能下降。 - Johns Paul
1
好的,我最后一个建议是明确设置目标的链接器语言:set_target_properties(Benchmarks_CUDA PROPERTIES LINKER_LANGUAGE CXX)。 - Robert Prévost
1
@JohnsPaul:我不相信有简单的方法可以做到这一点。CMake不支持像标准make那样的自定义构建规则,因此你将不得不尝试编写自定义命令,这并不是很直观。 - talonmies
1
@JohnsPaul 虽然clang可以编译.cu文件,但它不支持与nvcc相同的选项。它不能作为现有构建系统的替代品。您不能依赖于CUDA_ADD_LIBRARY自动按预期工作。您需要创建一个新函数,例如CLANG_CUDA_ADD_LIBRARY,使用适当的clang选项编译.cu文件。 - Pavan Yalamanchili
1个回答

2
很抱歉,我没有一个能够帮助你四年前的答案。然而,通常情况下,使用新的CMake版本可以显著改善事情。 CMake 3.18是第一个正式支持使用Clang编译CUDA的版本。 我尝试了那个版本,但它不知道如何使用我的clang++-12安装。它可能是在CMake 3.18之后发布的。
不过没关系,在CMake 3.19+上,使用CMAKE_CUDA_COMPILER与Clang 12 "只需工作"。
首先,这是CMakeLists.txt文件的内容:
cmake_minimum_required(VERSION 3.20)
project(clang-cuda-test LANGUAGES CUDA)

add_executable(
  vectorAdd
  # Sources
  vectorAdd.cu
  # Headers
  helper_cuda.h
  helper_string.h
)
target_include_directories(vectorAdd PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")

我已经从CUDA 11示例中复制了各种源文件。因此,我将设置Clang 12作为我的编译器(请注意,我的CUDA 11安装版本太新,无法与之兼容,这就是为什么会出现警告的原因):
alex@alex-ubuntu:~/test$ cmake -G Ninja -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CUDA_COMPILER=clang++-12
-- The CUDA compiler identification is Clang 12.0.1
-- Detecting CUDA compiler ABI info
-- Detecting CUDA compiler ABI info - done
-- Check for working CUDA compiler: /usr/bin/clang++-12 - skipped
-- Detecting CUDA compile features
-- Detecting CUDA compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/alex/test/build
alex@alex-ubuntu:~/test$ cmake --build build/ -- -v
[1/2] /usr/bin/clang++-12   -I../ -O3 -DNDEBUG --cuda-gpu-arch=sm_52 --cuda-path=/usr/local/cuda -MD -MT CMakeFiles/vectorAdd.dir/vectorAdd.cu.o -MF CMakeFiles/vectorAdd.dir/vectorAdd.cu.o.d -x cuda -c ../vectorAdd.cu -o CMakeFiles/vectorAdd.dir/vectorAdd.cu.o
clang: warning: Unknown CUDA version. cuda.h: CUDA_VERSION=11030. Assuming the latest supported version 10.1 [-Wunknown-cuda-version]
[2/2] : && /usr/bin/clang++-12  CMakeFiles/vectorAdd.dir/vectorAdd.cu.o -o vectorAdd  -lcudadevrt  -lcudart_static  -lrt  -lpthread  -ldl -L"/usr/local/cuda/lib64" && :
alex@alex-ubuntu:~/test$ ./build/vectorAdd 
[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

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