如何使用Clang的CUDA编译器?Ubuntu17.10编译报错求助
解决Clang++-5.0编译CUDA 9.1代码的报错问题
我之前在搭配Clang和CUDA的时候也踩过类似的坑,结合你用的Ubuntu 17.10、CUDA 9.1和Clang 5.0的情况,给你拆解问题并提供具体的解决步骤:
核心问题分析
你遇到的报错主要有两个原因:
- CUDA 9.1不再支持sm_20架构:Clang 5.0默认会尝试针对sm_20(早期NVIDIA GPU架构)编译,但CUDA 9.x开始已经移除了对sm_20的支持,所以找不到对应的
libdevice文件。 - Clang对CUDA路径的识别问题:虽然你指定了
--cuda-path,但可能需要额外参数辅助Clang定位CUDA的头文件和库文件。
具体解决步骤
1. 指定正确的GPU目标架构
首先要明确你的GPU对应的计算能力(Compute Capability),CUDA 9.1支持的最低架构是sm_30,你可以根据自己的GPU型号查对应的sm值(比如GTX 10系列是sm_61,RTX 20系列是sm_75)。编译时通过--cuda-gpu-arch参数指定:
clang++-5.0 --cuda-path=/usr/local/cuda-9.1 --cuda-gpu-arch=sm_30 kernel.cu
如果你不确定自己的GPU架构,可以用NVIDIA的命令查看:
nvidia-smi -q | grep "Compute Capability"
2. 手动指定CUDA的头文件和库路径
有时候仅靠--cuda-path不足以让Clang完全定位CUDA资源,你可以手动添加include和lib路径,并链接CUDA runtime库:
clang++-5.0 -I/usr/local/cuda-9.1/include -L/usr/local/cuda-9.1/lib64 \ --cuda-path=/usr/local/cuda-9.1 --cuda-gpu-arch=sm_30 kernel.cu -lcudart
这里-lcudart是链接CUDA runtime库,避免后续出现未定义的CUDA API引用错误。
3. 设置CUDA环境变量(可选但推荐)
提前设置环境变量可以让Clang自动识别CUDA安装路径,减少命令行参数:
# 临时设置(当前终端有效) export CUDA_PATH=/usr/local/cuda-9.1 export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64:$LD_LIBRARY_PATH
设置后编译命令可以简化为:
clang++-5.0 --cuda-gpu-arch=sm_30 kernel.cu -lcudart
4. 谨慎使用-nocudalib和-nocudainc
报错里提到的这两个参数是让Clang跳过CUDA标准库和头文件的链接/引用,除非你完全不需要CUDA的核心API(比如cudaMalloc、cuBLAS等),否则不要使用,这会导致CUDA功能完全失效。
内容的提问来源于stack exchange,提问作者Janus Troelsen
相关产品推荐
相关产品推荐

