什么是浮点推测以及它与编译器的浮点模型有何不同

时间:2011-09-14 15:40:35

标签: c++ floating-point intel

英特尔C ++编译器提供了两个用于控制浮点的选项:

-fp-speculation(快速/安全/严格/关闭) -fp-model(精确/快速/严格和源/双/扩展)

我想我理解fp模型的作用。但是什么是fp-speculation以及它与fp模型有什么关系?我还没有找到解释这个问题的英特尔文档!

3 个答案:

答案 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选项来控制对浮点指令的推测。

获取(一点点)更多信息:http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/fortran/lin/compiler_f/copts/common_options/option_fp_speculation.htm

答案 2 :(得分:-1)

在Windows操作系统上: 1.Intel编译器浮动计算32位应用程序vs 64位应用程序,相同代码可以给你不同的结果!!!!无论你选择什么旗帜:)!!!!

2.Visual studio编译器浮动计算32位与64位应用程序,相同的代码输出相同的结果。