标签: fast-math

为什么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",它采用5分mulsd的说明:

movapd  %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
Run Code Online (Sandbox Code Playgroud)

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

movapd  %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm13, %xmm13
Run Code Online (Sandbox Code Playgroud)

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

为什么编译器不能识别这种优化技巧?

floating-point assembly gcc compiler-optimization fast-math

2083
推荐指数
12
解决办法
20万
查看次数

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

我理解gcc的--ffast-math标志可以大大提高浮动操作的速度,并超出IEEE标准,但我似乎无法找到有关它正在发生的事情的信息.任何人都可以解释一些细节,并可能给出一个明确的例子,说明如果标志开启或关闭会有什么变化?

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

math floating-point performance gcc fast-math

138
推荐指数
2
解决办法
5万
查看次数

负NaN不是NaN?

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

我尝试使用std::isnan但断言错误:

Assertion `std::isnan(x)' failed.
Run Code Online (Sandbox Code Playgroud)

打印出值后x,结果显示它是负NaN(-nan),在我的情况下是完全可以接受的.

在尝试使用NaN != NaN和使用的事实之后assert(x == x),编译器给我一个'恩惠'并优化断言.

制作我自己的isNaN功能也正在优化.

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

c++ nan fast-math

29
推荐指数
2
解决办法
9713
查看次数

如何用"ffast-math"编译?

我正在尝试对一些Rust代码进行基准测试,但我无法弄清楚如何设置"ffast-math"选项.

% rustc -C opt-level=3 -C llvm-args='-enable-unsafe-fp-math' unrolled.rs
rustc: Unknown command line argument '-enable-unsafe-fp-math'.  Try: 'rustc -help'
rustc: Did you mean '-enable-load-pre'?
Run Code Online (Sandbox Code Playgroud)

llvm-args='-ffast-math'并且llvm-args='-fast'也没有工作.我应该使用什么旗帜?

llvm rust fast-math llvm-codegen

15
推荐指数
2
解决办法
1058
查看次数

为什么GCC或Clang在使用快速数学时不能优化1指令的倒数

有谁知道为什么GCC/Clang不会在下面的代码示例中优化函数test1,只是在使用fast-math选项时只使用RCPPS指令?是否有另一个编译器标志会生成此代码?

typedef float float4 __attribute__((vector_size(16)));

float4 test1(float4 v)
{
    return 1.0f / v;
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看已编译的输出:https://goo.gl/jXsqat

c++ sse simd compiler-optimization fast-math

15
推荐指数
2
解决办法
1209
查看次数

严格别名,-ffast-math和SSE

考虑以下程序:

#include <iostream>
#include <cmath>
#include <cstring>
#include <xmmintrin.h>

using namespace std;

int main()
{
    // 4 float32s.
    __m128 nans;
    // Set them all to 0xffffffff which should be NaN.
    memset(&nans, 0xff, 4*4);

    // cmpord should return a mask of 0xffffffff for any non-NaNs, and 0x00000000 for NaNs.
    __m128 mask = _mm_cmpord_ps(nans, nans);
    // AND the mask with nans to zero any of the nans. The result should be 0x00000000 for every component.
    __m128 z = _mm_and_ps(mask, nans);

    cout << …
Run Code Online (Sandbox Code Playgroud)

c++ sse clang strict-aliasing fast-math

12
推荐指数
1
解决办法
924
查看次数

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实际上只有在我还指定一些优化标志时才使用simd指令,如Onftree-vectorize.在这种情况下,内部函数是由gcc自动选择的,并且一些数学函数(我仍在谈论math.h上的标准数学函数)将成为内在函数或通过内联代码进行优化,其他函数仍将来自msvcrt. DLL.如果我没有指定优化标志,这会改变吗?

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

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

现在的问题是:

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

感谢任何想要帮助的人:D

gcc simd intrinsics fast-math

11
推荐指数
1
解决办法
4472
查看次数

如果喜欢使用-ffast-math,那么double的好哨兵值

由于gcc选项-ffast-math有效地禁止NaN-/+inf,我在寻找可能的表示下一个最好的选择,NaN在我的性能关键数学代码.理想情况下,如果对(add,mul,div,sub等)进行操作,哨兵值会产生哨兵值,NaN但我怀疑这是可能的,因为我认为这NaN是实现这一目标的唯一价值. -0.0可能不太适合,因为它也被禁用,-ffast-math并可能阻止某些优化,如(x+0.0)等.

也许我的问题应该是,是否有任何方法可以使用NaN或其他"特殊双重",同时能够启用大量的数学优化而不会崩溃?

系统是Linux/x64, gcc 4.8.1.

c double optimization nan fast-math

10
推荐指数
1
解决办法
972
查看次数

是否有一个与Visual Studio C++编译器等效的-ffast-math标志

我正在使用带有标志/Ox(完全优化)的Visual Studio 2013附带的默认C++编译器(我猜它称为"Visual Studio C++编译器" ).由于浮点副作用,我必须-ffast-math在使用gcc编译器时禁用该标志.在Visual Studio C++编译器的配置中是否存在此标志的等效选项?

gcc compiler-optimization visual-studio-2013 fast-math

7
推荐指数
1
解决办法
3583
查看次数

动态 - 数学 - 数学

是否可以在运行时选择性地打开/关闭-ffast-math?例如,使用公共基类Math创建类FastMath和AccurateMath,以便一个人能够在运行时使用这两个实现?将次正常闪烁归零等同样如此.

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

c optimization performance gcc fast-math

6
推荐指数
2
解决办法
979
查看次数