在 Ubuntu 18.04 下无法使用 clang++-9 link cuda 示例

fail to link cuda example with clang++-9 under Ubuntu 18.04

我正在尝试按照中的示例进行操作 https://llvm.org/docs/CompileCudaWithLLVM.html#invoking-clang 我使用 Ubuntu 18.04.3 LTS,clang 版本 9.0.0-2 我拥有的设备是(deviceQuery 输出的片段):

Detected 1 CUDA Capable device(s)

Device 0: "Quadro P520"
  CUDA Driver Version / Runtime Version          10.2 / 10.2
  CUDA Capability Major/Minor version number:    6.1

我运行命令:

clang++-9 --verbose --cuda-path=/usr/local/cuda-10.2 axpy.cu -o axpy --cuda-gpu-arch=sm_61 -L/usr/local/cuda-10.2 -lcudart_static -ldl -lrt -pthread

输出为:

clang version 9.0.0-2~ubuntu18.04.1 (tags/RELEASE_900/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/8
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.4.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/8
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.4.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.4.0
Candidate multilib: .;@m64
Selected multilib: .;@m64
Found CUDA installation: /usr/local/cuda-10.2, version unknown
clang: error: cannot find libdevice for sm_61. Provide path to different CUDA installation via --cuda-path, or pass -nocudalib to build without linking with libdevice.

据我所知,libdevice 就在它应该在的位置:

~>ls /usr/local/cuda-10.2/nvvm/libdevice/
libdevice.10.bc

我做错了什么?

2020 年 11 月添加: 在@ArtemB 发表评论后,我用 clang++-10 尝试 运行 它,它会引发警告,但编译和运行都很好。

简短回答:我的驱动程序支持的 cuda 版本 (10.2) 对于我的 clang (9.0.0) 来说太新了。

这是我机器上 nvidia-smi 输出的顶部:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01    Driver Version: 440.33.01    CUDA Version: 10.2     |

所以我的驱动确实支持cuda-10.2。但是,这个版本 似乎不受 clang 9.0.0 的支持。实际上,当 运行 带有额外标志 -nocudalib 的上述命令时,会得到以下响应(仅显示最后几行):

In file included from <built-in>:1:
/usr/lib/llvm-9/lib/clang/9.0.0/include/__clang_cuda_runtime_wrapper.h:52:2: error: "Unsupported CUDA version!"
#error "Unsupported CUDA version!"
 ^
axpy.cu:23:7: error: use of undeclared identifier cudaConfigureCall
  axpy<<<1, kDataLen>>>(a, device_x, device_y);
      ^
2 errors generated when compiling for sm_61.

检查有问题的文件(clang cuda 运行时包装器)时,可以在第 48-53 行看到以下内容:

#include "cuda.h"
#if !defined(CUDA_VERSION)
#error "cuda.h did not define CUDA_VERSION"
#elif CUDA_VERSION < 7000 || CUDA_VERSION > 10010
#error "Unsupported CUDA version!"
#endif

直到最近,clang 对 CUDA 版本还是相当讲究的。我最近放松了一点,所以 clang-10 更宽松,并将尝试使用更新的 CUDA 版本,其功能与最新支持的 CUDA 版本(当前为 10.1)相同。它还会发出警告。它确实与 CUDA-11.0 配合得很好,足以编译 Tensorflow。

CUDA-11.1(我相信 windows 上的 11.0 update1)已经从发行版中删除了 version.txt 文件,这将再次破坏当前发布的 clang 版本的 CUDA 编译。这个应该在clang-11.0.1发布的时候修复了(与CUDA的版本匹配纯属巧合)