英特尔C ++编译器提供了两个用于控制浮点的选项:
-fp-speculation(快速/安全/严格/关闭) -fp-model(精确/快速/严格和源/双/扩展)
我想我理解fp模型的作用。但是什么是fp-speculation以及它与fp模型有什么关系?我还没有找到解释这个问题的英特尔文档!
答案 0 :(得分:13)
-fp-model
会影响如何执行浮点计算,并且可以更改数值结果(通过许可不安全优化或更改评估中间结果的精度)。< / p>
-fp-speculation
不会更改数值结果,但会影响操作引发的浮点标记(或者如果启用了浮点陷阱,则会产生陷阱)。 99.99%的程序员不需要关心这些事情,所以你可以运行默认值而不用担心它。
这是一个具体的例子;假设你有以下功能:
double foo(double x) {
// lots of computation
if (x >= 0) return sqrt(x);
else return x;
}
相对而言, sqrt
很慢。 提升计算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
为负数,则修改后的程序会引发无效标志,而原始程序则不会。
-fp-speculation
标志为您提供了一种方法来告诉编译器您是否关心这些情况,因此它知道它是否被许可进行此类转换。
答案 1 :(得分:1)
乱序执行和推测执行可能导致无关的异常或在错误的时间引发异常。
如果这对您很重要,您可以使用fp-speculation
选项来控制对浮点指令的推测。
答案 2 :(得分:-1)
在Windows操作系统上: 1.Intel编译器浮动计算32位应用程序vs 64位应用程序,相同代码可以给你不同的结果!!!!无论你选择什么旗帜:)!!!!
2.Visual studio编译器浮动计算32位与64位应用程序,相同的代码输出相同的结果。