【问题标题】:Specify CUDA compiler in CMake在 CMake 中指定 CUDA 编译器
【发布时间】:2017-01-19 12:43:22
【问题描述】:

我正在尝试基于以下 documentation 使用 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 编译器。首先,我建议添加文档建议的所有标志。其次,看看使用 project 命令设置语言是否有帮助。
  • @robertprevost:至少你现在理解了被问到的问题。不过,我会重复我的评论。这是由于 .cu 文件扩展名和默认构建命令中的 C++ 编译操作之间没有关联而导致的 cmake 错误消息。
  • 好吧,我最后的建议是明确设置目标的链接器语言:set_target_properties(Benchmarks_CUDA PROPERTIES LINKER_LANGUAGE CXX)。
  • @JohnsPaul:我不相信有一种简单的方法可以做到这一点。 CMake 不像标准 make 那样支持自定义构建规则,因此您将不得不尝试制作自定义命令,这不是很简单。
  • @JohnsPaul 虽然 clang 编译了.cu 文件,但它不支持与 nvcc 相同的选项。它不会取代现有的构建系统。您不能依赖CUDA_ADD_LIBRARY 自动按您的预期工作。您必须创建一个像 CLANG_CUDA_ADD_LIBRARY 这样的新函数,它使用适当的 clang 选项编译 .cu 文件。

标签: cmake clang llvm llvm-clang


【解决方案1】:

恐怕我没有一个能在四年前帮助你的答案。但是,通常情况下,使用新的 CMake 版本会显着改善情况。 CMake 3.18 was the first to officially support using Clang to compile 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-22
    • 2015-06-05
    • 2012-10-14
    • 2012-10-13
    相关资源
    最近更新 更多