我正在尝试使用
.cu
而不是 clang++
编译一个简单的 nvcc
文件,尽管 LLVM 文档 提供了基本说明,但我一直在努力应对各种 CMake 规范,即我是否需要指定CMAKE_CUDA_COMPILER
、CUDA_IMPLICIT_LINK_DIRECTORIES
等。目前我无法构建或编译 .cu
文件。
我尝试过各种 CMake 规范,但这似乎是在黑暗中进行的尝试,而且确实是一个猜谜游戏。
这实际上非常简单 - 使用最新版本的 CMake 和 clang。考虑单个
.cu
文件可执行文件(例如 NVIDIA 的 vectorAdd 示例,假设您已将所有相关包含文件放置在与 vectorAdd.cu
相同的目录中)。这个 CMakeLists 文件有效:
cmake_minimum_required(VERSION 3.24)
project(vector_addition_with_clang CUDA)
add_executable(vectorAdd vectorAdd.cu)
set_target_properties(vectorAdd PROPERTIES CUDA_ARCHITECTURES native)
现在,使用以下命令进行配置:
cmake \
-B /path/to/build/dir \
-DCMAKE_CUDA_HOST_COMPILER=/path/to/clang++ \
-DCMAKE_CUDA_COMPILER=/path/to/clang++
我已经验证这适用于 CMake 版本 3.27 和 3.28,以及 clang 16。
注意: 请记住在每次配置尝试之前完全删除构建目录,或者至少删除
CMakeCache.txt
和 CMakeFiles/
目录。早期的失败可能会扰乱未来的尝试,否则这些尝试将会有效。
如果你使用3.24之前的CMake版本,你不能说
native
,你必须使用一个具体的值,或者使用一些自动检测CMake voodoo,如这里所解释的。即使旧版本的 CMake 也可能会出现其他问题。 3.20 可以工作,但 3.18 无法将 CMAKE_ARCHITECTURES 正确传递给 clang。
clang 14 会因某种原因失败 - 不确定为什么 - 即使使用较新的 CMake。我得到:
CMake Error at /path/to/share/cmake-3.27/Modules/CMakeDetermineCUDACompiler.cmake:603 (message):
Failed to detect a default CUDA architecture.
Compiler output:
Call Stack (most recent call first):
CMakeLists.txt:2 (project)
不知道为什么。还没有尝试过 clang 15 - 我们鼓励读者尝试并发表评论。