double 和 ffast-math 的自动矢量化

2023-11-21

为什么强制使用-ffast-math与 g++ 实现循环的向量化double是?我不喜欢-ffast-math因为我不想失去精度。


你不一定会失去精度-ffast-math。只影响处理NaN, Inf等以及操作执行的顺序。

如果您有一段特定的代码,您不希望 GCC 重新排序或简化计算,您可以使用asm陈述。

例如,以下代码执行舍入操作f。然而,两人f += g and f -= ggcc 可能会优化操作:

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

在 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;
}

不幸的是,您需要针对每种架构进行调整。在 PowerPC 上,使用+f代替+x.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

double 和 ffast-math 的自动矢量化 的相关文章

随机推荐