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

时间:2016-02-01 05:50:22

标签: c++ floating-point floating-accuracy msvcrt

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

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

if(convertView == null){
 vi.setTag(p);
}

On Haswell / Broadwell及以后返回0.81743370050726594(与x86相同)。在较旧的CPU上返回0.81743370050726583。

运行时库使用FMA instruction set(如果可用),执行不同的实现并产生不同的结果。请注意,这不受应用程序中选择的编译器选项的影响,因为运行时库是预编译的。还要注意浮点精度控制函数_controlfp()cannot control 64位运行时的精度。

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

1 个答案:

答案 0 :(得分:0)

  

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

没有

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

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

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