You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 23:14:51