双和ffast数学的自动矢量化

Rug*_*rra 6 double gcc g++ vectorization fast-math

为什么必须使用-ffast-mathg ++来实现使用doubles 的循环向量化?我不喜欢-ffast-math因为我不想失去精确度.

sam*_*var 9

你不一定会失去精确度-ffast-math.它仅影响的处理NaN,Inf等等,并在其中执行操作的顺序.

如果您有一段特定的代码,您不希望GCC重新排序或简化计算,则可以使用asm语句将变量标记为正在使用.

例如,以下代码执行舍入操作f.但是,这两个f += gf -= g操作可能会被gcc优化掉:

static double moo(double f, double g)                                      
{                                                                          
    g *= 4503599627370496.0; // 2 ** 52                                    
    f += g;                                                                
    f -= g;                                                                
    return f;                                                            
}                                                                     
Run Code Online (Sandbox Code Playgroud)

在x86_64上,您可以使用此asm语句指示GCC不执行该优化:

static double moo(double f, double g)                                      
{                                                                          
    g *= 4503599627370496.0; // 2 ** 52                                    
    f += g;                                                                
    __asm__("" : "+x" (f));
    f -= g;
    return f;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,您需要为每个架构调整此选项.在PowerPC上,使用+f而不是+x.