使用clang作为CUDA编译器编译CUB库出现报错的解决方案咨询
问题根源
编译错误由Clang版本和CUDA版本不兼容导致:
- Clang 12 官方最高仅支持 CUDA 10.1,你的环境使用 CUDA 11.4,编译器无法识别 CUDA 11+ 新增的内置符号、纹理API,所以触发
__nv_tex_surf_handler未声明、host变量在device函数中引用的错误。 - CUDA 11.4 自带的CUB库适配NVIDIA官方nvcc编译器,部分纹理相关实现依赖CUDA 11+的特性,旧版Clang的CUDA支持能力无法覆盖。
可行的规避方案
- 升级Clang版本
升级到Clang 14及以上版本,该版本及后续版本已完整支持CUDA 11.4,适配CUDA 11+的特性和API,仅需要调整CMake配置中的编译器路径即可正常编译。 - 降级CUDA版本
如果必须使用Clang 12,将CUDA Toolkit降级到10.1版本,匹配Clang 12的最高支持CUDA版本,对应版本的CUB库也适配旧版纹理API,可正常编译。 - 禁用CUB的纹理迭代器功能
不需要调整编译器和CUDA版本,仅在编译选项中添加宏定义CUB_DISABLE_TEX_REF_INPUT_ITERATOR=1,强制CUB关闭纹理迭代器实现,跳过报错的代码分支,CMake配置参考如下:cmake .. -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_CUDA_ARCHITECTURES="75" \ -DCMAKE_CUDA_COMPILER=clang++-12 \ -DCMAKE_CXX_COMPILER=clang++-12 -DCMAKE_C_COMPILER=clang-12 \ -DCMAKE_CUDA_FLAGS="-DCUB_DISABLE_TEX_REF_INPUT_ITERATOR=1" - 改用nvcc作为CUDA编译器
将CMAKE_CUDA_COMPILER改为CUDA Toolkit自带的nvcc,不需要修改现有环境版本即可正常编译适配nvcc的CUB代码。
关于Bug提交的说明
不需要提交新Bug:
- 版本兼容性属于Clang明确的版本支持范围限制,后续版本已经修复该问题。
- CUB本身默认适配nvcc编译器,没有义务兼容旧版Clang的CUDA支持范围。
内容的提问来源于stack exchange,提问作者Serge Rogatch
相关产品推荐
相关产品推荐

