在 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的版本匹配纯属巧合)
我正在尝试按照中的示例进行操作 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的版本匹配纯属巧合)