问题标签 [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.
gcc - double 和 ffast-math 上的自动矢量化
为什么一定要-ffast-math
配合g++使用s来实现循环的向量化double
?我不喜欢-ffast-math
,因为我不想失去精度。
c++ - 负NaN不是NaN吗?
在编写一些测试用例时,一些测试会检查 NaN 的结果。
我尝试使用std::isnan
但断言失败:
打印 的值后x
,结果发现它是负的 NaN ( -nan
),这在我的情况下是完全可以接受的。
在尝试使用NaN != NaN
和使用事实之后assert(x == x)
,编译器帮了我一个“忙”并优化了断言。
制作我自己的isNaN
功能也被优化掉了。
如何检查 NaN和-NaN 的相等性?
c++ - gcc 优化导致应用程序失败
在启用优化的情况下,我在使用 GCC for ARM 时遇到了一个非常奇怪的问题。在没有优化的情况下编译我的 C++ 应用程序会生成一个在运行时输出预期结果的可执行文件。一旦我打开优化 - 即 -O1 - 我的应用程序就无法产生预期的结果。我尝试了几天来发现问题,但我一无所知。我从我的代码中消除了任何未初始化的变量,我纠正了严格别名可能导致问题的地方,但我仍然没有得到正确的结果。
我正在为 ARM 使用 GCC 4.2.0(处理器是 ARM926ej-s)并在 Montavista Linux 发行版上运行该应用程序。
以下是我正在使用的标志:
只要我去掉 -O1 标志并重新编译/重新链接应用程序,我就会得到正确的输出结果。正如您从标志中看到的那样,我试图禁用任何优化,我认为它可能会导致问题,但仍然没有运气。
有没有人对我如何进一步解决这个问题有任何指示?
谢谢
gcc - gcc、simd 内在函数和快速数学概念
大家好:)
我正在尝试了解一些关于浮点、SIMD/数学内在函数和 gcc 的快速数学标志的概念。更具体地说,我在 x86 cpu 上使用 MinGW 和 gcc v4.5.0。
我已经搜索了一段时间,这就是我(认为我)目前所理解的:
当我在没有标志的情况下编译时,任何 fp 代码都将是标准的 x87,没有 simd 内在函数,并且 math.h 函数将从 msvcrt.dll 链接。
当我使用mfpmath、mssen和/或march以便启用 mmx/sse/avx 代码时,gcc只有在我还指定一些优化标志(如On或ftree-vectorize )时才实际使用 simd 指令。在这种情况下,内在函数由 gcc 自动选择,并且一些数学函数(我仍在谈论 math.h 上的标准数学函数)将成为内在函数或由内联代码优化,其他一些仍然来自 msvcrt。 dll。如果我不指定优化标志,这会改变吗?
当我使用特定的 simd 数据类型(可用作 gcc 扩展的那些,如v4si或v8qi)时,我可以选择直接调用内部函数,或者再次将自动决策留给 gcc。如果我没有通过正确的标志启用 simd 指令,Gcc 仍然可以选择标准 x87 代码。同样,如果我不指定优化标志,这会发生任何变化吗?
如果我的任何陈述有误,请纠正我:p
现在的问题:
- 我是否必须包含 x86intrin.h 才能使用内在函数?
- 我是否必须链接 libm?
- 快速数学与任何事情有什么关系?我知道它放宽了 IEEE 标准,但是,具体来说,如何?使用其他标准功能?链接了其他一些库?或者只是在某处设置了几个标志,标准库的行为不同?
感谢任何愿意提供帮助的人:D
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
具有类似的行为。
为什么编译器无法识别这种优化技巧?
g++ - Mingw32 std::isnan 和 -ffast-math
我正在使用-ffast-math
选项编译以下代码:
我得到 0 作为输出。我的代码在编译时如何判断浮点数是否为 NaN -ffast-math
?
注意:在 linux 上,std::isnan 甚至可以使用 -ffast-math。
performance - gcc 的 ffast-math 实际上是做什么的?
我知道 gcc 的--ffast-math
标志可以大大提高浮动操作的速度,并且超出了 IEEE 标准,但我似乎无法找到有关它开启时实际发生的情况的信息。任何人都可以解释一些细节,并给出一个明确的例子来说明如果标志打开或关闭,事情会如何变化?
我确实尝试通过 SO 挖掘类似的问题,但找不到任何解释 ffast-math 工作原理的东西。
cuda - -use-fast-math 选项是否将 SP 乘法转换为内在函数?
我快速浏览了 CUDA 编程指南 wrt -use-fast-math optimizations,虽然附录 C 提到了要转换为内在函数的除法,但没有提到乘法。我问这个问题的原因是,我的内核有很多乘法。我知道 NVCC 会尝试融合乘法和加法(当使用常规的“*”和“+”运算符时,并且内在函数永远不会合并到 FMAD 操作中)。但是,如果我的代码是乘法繁重的,那么如果使用舍入 SP 内在函数会有好处__fmul_rn
吗?
所以有两个问题:
-use-fast-math 选项是否将使用“*”运算符的乘法转换为像 __fmul_rn 这样的 SP 内在函数?
手动编码乘法以显式使用 __fmul_rn 是否会带来性能优势?一个例子或一些数字可以帮助我理解。
c - 如果更喜欢使用 -ffast-math,则为双倍的良好哨兵价值
由于该gcc
选项-ffast-math
有效地禁用了NaN
and -/+inf
,因此我正在寻找下一个最佳选项来表示NaN
我的性能关键数学代码。理想情况下,如果对(add、mul、div、sub 等)进行操作,哨兵值会产生哨兵值,NaN
但我怀疑这是可能的,因为我认为这NaN
是完成此任务的唯一值。 -0.0
可能不太合适,因为它也被禁用-ffast-math
并且可能会阻止某些优化,例如(x+0.0)
,等等。
也许我的问题应该是,有什么方法可以使用NaN
或其他一些“特殊的双倍”,同时能够在不崩溃的情况下启用很多数学优化?
系统是Linux/x64, gcc 4.8.1
。
c - 动态-ffast-math
是否可以在运行时选择性地打开/关闭 -ffast-math?例如,使用通用基类 Math 创建 FastMath 和 AccurateMath 类,以便能够在运行时同时使用这两种实现?同上用于将次常态闪烁为零等。
特别是,我不知道使用 -ffast-math 进行编译是否会发出一条指令,该指令一旦执行就会影响线程中的所有数值计算(例如,设置一个标志以将次正规数刷新为零)。