CUDA 13.1编译失败:rsqrt函数异常规范不兼容问题求助
CUDA 13.1与Devuan Freia更新后编译冲突问题(rsqrt异常规范不兼容)
问题背景
机器运行Devuan GNU/Linux Freia系统,手动安装CUDA 13.1。近期更新发行版软件包后,编译包含CUDA头文件的C++程序时失败,报错信息如下:
/usr/include/x86_64-linux-gnu/bits/mathcalls.h(206): error: exception specification is incompatible with that of previous function "rsqrt"(declared at line 629 of/usr/local/cuda-13.1/bin/../targets/x86_64-linux/include/crt/math_functions.h) extern double rsqrt (double __x) noexcept (true); extern double __rsqrt (double __x) noexcept (true);
系统头文件mathcalls.h中的该行:
__MATHCALL (rsqrt,, (_Mdouble_ __x));
会展开为:
extern double rsqrt(double __x) noexcept (true); extern double __rsqrt(double __x) noexcept (true);
而CUDA 13.1头文件/usr/local/cuda-13.1/bin/../targets/x86_64-linux/include/crt/math_functions.h中rsqrt的声明是:
extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ double rsqrt(double x);
尝试切换GCC 14、13版本(默认是15),问题未解决。
问题解答
1. 问题出现的具体原因
发行版软件包更新后,系统的mathcalls.h头文件通过宏展开,给rsqrt和__rsqrt函数的声明添加了noexcept(true)异常规范;但CUDA 13.1的头文件中,rsqrt函数的声明没有包含该异常规范。在C++标准中,同一函数的多次声明必须保持异常规范一致,因此编译器抛出了不兼容的错误。
这个问题和之前遇到的__sinpi()、__cospi()等三角函数的异常规范冲突属于同一类问题,NVIDIA在CUDA 13.2版本中已经修复了这类头文件声明不一致的问题。
2. 解决方法
以下是几种可行的解决方案,按推荐优先级排序:
- 升级到CUDA 13.2:这是最彻底的解决方式,官方已经修复了该类异常规范不兼容的问题,无需额外修改配置。
- 调整头文件包含顺序:在代码中确保CUDA的头文件(如
cuda_runtime.h)在系统标准头文件之前被包含,这样CUDA的rsqrt声明会先被编译器识别,后续系统头文件的声明会与之匹配(部分场景下有效)。 - 禁用系统头文件的noexcept宏:编译时添加编译选项
-D_GLIBCXX_USE_NOEXCEPT=0,阻止系统头文件给数学函数添加noexcept异常规范,避免和CUDA的声明冲突。 - 临时屏蔽系统的rsqrt声明(不推荐):在包含CUDA头文件之前,通过宏定义屏蔽系统的
rsqrt声明,例如:
这种方法可能引发其他未知问题,仅作为临时应急方案。#define rsqrt cuda_rsqrt #include <cuda_runtime.h> #undef rsqrt
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

