我正在尝试使用
.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.27)
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 和 clang 16。
如果你使用3.24之前的CMake版本,你不能说
native
,你必须使用一个具体的值,或者使用一些自动检测CMake voodoo,如这里所解释的。即使旧版本的 CMake 也可能会出现其他问题。 3.8是最早支持CUDA作为“一等公民”语言的,所以绝对不是在那之前。我猜 3.18 或更高版本应该是安全的
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 - 我们鼓励读者尝试并发表评论。