作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在评估性能关键/“热”代码中浮点异常的使用(清除和查询)。查看生成的二进制文件,我注意到 GCC 和 Clang 都没有将调用扩展为我期望的内联指令序列;相反,它们似乎生成了对运行时库的调用。这对于我的应用程序来说是非常昂贵的。
考虑以下最小示例:
#include <fenv.h>
#pragma STDC FENV_ACCESS on
inline int fetestexcept_inline(int e)
{
unsigned int mxcsr;
asm volatile ("vstmxcsr" " %0" : "=m" (*&mxcsr));
return mxcsr & e & FE_ALL_EXCEPT;
}
double f1(double a)
{
double r = a * a;
if(r == 0 || fetestexcept_inline(FE_OVERFLOW)) return -1;
else return r;
}
double f2(double a)
{
double r = a * a;
if(r == 0 || fetestexcept(FE_OVERFLOW)) return -1;
else return r;
}
以及 GCC 产生的输出:
https://godbolt.org/z/jxjzYY
最佳答案
需要支持long double
算术。 fetestexcept
需要合并 SSE 和 FPU 状态,因为 long double
操作仅更新 FPU 状态,而不更新 MXSCR 寄存器。因此,内联的好处有所减少。
关于c++ - 为什么 C++ 中的 fetestexcept 被编译为函数调用而不是内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65891873/
我正在评估性能关键/“热”代码中浮点异常的使用(清除和查询)。查看生成的二进制文件,我注意到 GCC 和 Clang 都没有将调用扩展为我期望的内联指令序列;相反,它们似乎生成了对运行时库的调用。这对
我正在使用 fetestexcept()在 C99 中,它有时会提示乘以 float 会得到不准确的结果(FE_INEXACT)。它似乎发生在将 float 变量与 float 文字相乘时。我怎样才能
我是一名优秀的程序员,十分优秀!