英特尔 C++ 编译器提供两个控制浮点的选项:
-fp-推测(快速/安全/严格/关闭)
-fp-model(精确/快速/严格和源/双/扩展)
我想我明白 fp-model 的作用。但什么是 fp 推测以及它与 fp 模型有何关系?我还没有找到任何解释这一点的英特尔文档!
-fp-model
影响how执行浮点计算,并且可以更改数值结果(通过许可不安全的优化或更改评估中间结果的精度)。
-fp-speculation
不会更改数值结果,但会影响操作引发的浮点标志(或者在启用浮点陷阱的情况下采取哪些陷阱)。 99.99%的程序员不需要关心这些事情,所以你可能可以使用默认值运行而不用担心。
这是一个具体的例子;假设您有以下功能:
double foo(double x) {
// lots of computation
if (x >= 0) return sqrt(x);
else return x;
}
sqrt
相对而言,速度很慢。那就太好了hoist的计算sqrt(x)
像这样:
double foo(double x) {
const double sqrtx = sqrt(x);
// lots of computation
if (x >= 0) return sqrtx;
else return x;
}
通过这样做,我们可以计算sqrt
与其他计算同时进行,减少函数的延迟。然而,有一个问题;如果x
是负数,那么sqrt(x)
提出无效标志。在原来的程序中,这永远不会发生,因为sqrt(x)
仅计算如果x
是非负的。在修改后的程序中,sqrt(x)
是无条件计算的。因此,如果x
为负数时,修改后的程序会引发无效标志,而原始程序则不会。
The -fp-speculation
flag 为您提供了一种方法来告诉编译器您是否关心这些情况,因此它知道它是否被许可进行此类转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)