如何控制 Microsoft C 运行时库使用的 CPU 指令?

How to control CPU instructions used by Microsoft C Runtime Libraries?

是否可以控制 MS C 运行时库(Visual Studio 2013、2015)使用哪些 CPU 指令集?如果我为 cos() 进行反汇编,代码将与一组预先计算的 CPU 功能进行比较,然后使用 CPU 上可用的 'best' 功能执行函数。问题在于不同的指令集会产生不同的结果,因此结果会因 CPU 架构而异。

例如,构建一个 64 位可执行文件:

std::cout << std::setprecision(20) << cos(-0.61385470201194381) << std:: endl;

在 Haswell/Broadwell 之后 returns 0.81743370050726594(与 x86 相同)。在较旧的 CPU 上 returns 0.81743370050726583.

运行时库使用 FMA instruction set if available, executes a different implementation and yields the different results. Note that this is not affected by the compiler options selected in the application because the Runtime Libraries are provided pre-compiled. Also note that the floating point precision control function _controlfp() cannot control 64 位运行时的精度。

是否可以控制运行时库使用哪些指令集,以便结果更具确定性?

Is it possible to control which instruction sets the Runtime Library uses so that the results can be more deterministic?

没有

如果你只使用基本算术(+-*/sqrt),并强制你的编译器使用严格IEEE754算法,那么它应该是可以完美重现的。对于其他功能,例如 cos,您受 libm 的支配,不需要提供任何准确性保证。您还会在 BLAS 库中看到类似的问题。

如果你需要完美的再现性,你有两条路:

  1. 使用正确舍入的数学库,例如 CRlibm(尽管我不认为 pow 等 2 参数函数已被证明是正确的)。
  2. 滚动你自己的数学函数,将自己限制在上面的算术运算中(在这种情况下,fdlibm 可能是一个好的开始)。