问题标签 [fast-math]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
4000 浏览

gcc - double 和 ffast-math 上的自动矢量化

为什么一定要-ffast-math配合g++使用s来实现循环的向量化double?我不喜欢-ffast-math,因为我不想失去精度。

0 投票
6 回答
13394 浏览

c++ - 负NaN不是NaN吗?

在编写一些测试用例时,一些测试会检查 NaN 的结果。

我尝试使用std::isnan但断言失败:

打印 的值后x,结果发现它是负的 NaN ( -nan),这在我的情况下是完全可以接受的。

在尝试使用NaN != NaN和使用事实之后assert(x == x),编译器帮了我一个“忙”并优化了断言。

制作我自己的isNaN功能也被优化掉了。

如何检查 NaN-NaN 的相等性?

0 投票
4 回答
3698 浏览

c++ - gcc 优化导致应用程序失败

在启用优化的情况下,我在使用 GCC for ARM 时遇到了一个非常奇怪的问题。在没有优化的情况下编译我的 C++ 应用程序会生成一个在运行时输出预期结果的可执行文件。一旦我打开优化 - 即 -O1 - 我的应用程序就无法产生预期的结果。我尝试了几天来发现问题,但我一无所知。我从我的代码中消除了任何未初始化的变量,我纠正了严格别名可能导致问题的地方,但我仍然没有得到正确的结果。

我正在为 ARM 使用 GCC 4.2.0(处理器是 ARM926ej-s)并在 Montavista Linux 发行版上运行该应用程序。

以下是我正在使用的标志:

只要我去掉 -O1 标志并重新编译/重新链接应用程序,我就会得到正确的输出结果。正如您从标志中看到的那样,我试图禁用任何优化,我认为它可能会导致问题,但仍然没有运气。

有没有人对我如何进一步解决这个问题有任何指示?

谢谢

0 投票
1 回答
5208 浏览

gcc - gcc、simd 内在函数和快速数学概念

大家好:)
我正在尝试了解一些关于浮点、SIMD/数学内在函数和 gcc 的快速数学标志的概念。更具体地说,我在 x86 cpu 上使用 MinGW 和 gcc v4.5.0。

我已经搜索了一段时间,这就是我(认为我)目前所理解的:

当我在没有标志的情况下编译时,任何 fp 代码都将是标准的 x87,没有 simd 内在函数,并且 math.h 函数将从 msvcrt.dll 链接。

当我使用mfpmathmssen和/或march以便启用 mmx/sse/avx 代码时,gcc只有在我还指定一些优化标志(如Onftree-vectorize )时才实际使用 simd 指令。在这种情况下,内在函数由 gcc 自动选择,并且一些数学函数(我仍在谈论 math.h 上的标准数学函数)将成为内在函数或由内联代码优化,其他一些仍然来自 msvcrt。 dll。如果我不指定优化标志,这会改变吗?

当我使用特定的 simd 数据类型(可用作 gcc 扩展的那些,如v4siv8qi)时,我可以选择直接调用内部函数,或者再次将自动决策留给 gcc。如果我没有通过正确的标志启用 simd 指令,Gcc 仍然可以选择标准 x87 代码。同样,如果我不指定优化标志,这会发生任何变化吗?

如果我的任何陈述有误,请纠正我:p

现在的问题:

  1. 我是否必须包含 x86intrin.h 才能使用内在函数?
  2. 我是否必须链接 libm?
  3. 快速数学与任何事情有什么关系?我知道它放宽了 IEEE 标准,但是,具体来说,如何?使用其他标准功能?链接了其他一些库?或者只是在某处设置了几个标志,标准库的行为不同?

感谢任何愿意提供帮助的人:D

0 投票
12 回答
219750 浏览

gcc - 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

我正在对科学应用程序进行一些数值优化。我注意到的一件事是,GCC 会pow(a,2)通过将调用编译成来优化调用a*a,但调用pow(a,6)并没有优化,实际上会调用库函数pow,这大大降低了性能。(相比之下,英特尔 C++ 编译器可执行文件icc将消除对 的库调用pow(a,6)。)

我很好奇的是,当我替换pow(a,6)a*a*a*a*a*a使用 GCC 4.5.1 和选项“ -O3 -lm -funroll-loops -msse4”时,它使用了 5mulsd条指令:

而如果我写(a*a*a)*(a*a*a),它会产生

这将乘法指令的数量减少到 3。icc具有类似的行为。

为什么编译器无法识别这种优化技巧?

0 投票
2 回答
1746 浏览

g++ - Mingw32 std::isnan 和 -ffast-math

我正在使用-ffast-math选项编译以下代码:

我得到 0 作为输出。我的代码在编译时如何判断浮点数是否为 NaN -ffast-math

注意:在 linux 上,std::isnan 甚至可以使用 -ffast-math。

0 投票
2 回答
68753 浏览

performance - gcc 的 ffast-math 实际上是做什么的?

我知道 gcc 的--ffast-math标志可以大大提高浮动操作的速度,并且超出了 IEEE 标准,但我似乎无法找到有关它开启时实际发生的情况的信息。任何人都可以解释一些细节,并给出一个明确的例子来说明如果标志打开或关闭,事情会如何变化?

我确实尝试通过 SO 挖掘类似的问题,但找不到任何解释 ffast-math 工作原理的东西。

0 投票
1 回答
5203 浏览

cuda - -use-fast-math 选项是否将 SP 乘法转换为内在函数?

我快速浏览了 CUDA 编程指南 wrt -use-fast-math optimizations,虽然附录 C 提到了要转换为内在函数的除法,但没有提到乘法。我问这个问题的原因是,我的内核有很多乘法。我知道 NVCC 会尝试融合乘法和加法(当使用常规的“*”和“+”运算符时,并且内在函数永远不会合并到 FMAD 操作中)。但是,如果我的代码是乘法繁重的,那么如果使用舍入 SP 内在函数会有好处__fmul_rn吗?

所以有两个问题:

  1. -use-fast-math 选项是否将使用“*”运算符的乘法转换为像 __fmul_rn 这样的 SP 内在函数?

  2. 手动编码乘法以显式使用 __fmul_rn 是否会带来性能优势?一个例子或一些数字可以帮助我理解。

0 投票
1 回答
1272 浏览

c - 如果更喜欢使用 -ffast-math,则为双倍的良好哨兵价值

由于该gcc选项-ffast-math有效地禁用了NaNand -/+inf,因此我正在寻找下一个最佳选项来表示NaN我的性能关键数学代码。理想情况下,如果对(add、mul、div、sub 等)进行操作,哨兵值会产生哨兵值,NaN但我怀疑这是可能的,因为我认为这NaN是完成此任务的唯一值。 -0.0可能不太合适,因为它也被禁用-ffast-math并且可能会阻止某些优化,例如(x+0.0),等等。

也许我的问题应该是,有什么方法可以使用NaN或其他一些“特殊的双倍”,同时能够在不崩溃的情况下启用很多数学优化?

系统是Linux/x64, gcc 4.8.1

0 投票
2 回答
1791 浏览

c - 动态-ffast-math

是否可以在运行时选择性地打开/关闭 -ffast-math?例如,使用通用基类 Math 创建 FastMath 和 AccurateMath 类,以便能够在运行时同时使用这两种实现?同上用于将次常态闪烁为零等。

特别是,我不知道使用 -ffast-math 进行编译是否会发出一条指令,该指令一旦执行就会影响线程中的所有数值计算(例如,设置一个标志以将次正规数刷新为零)。