如何控制 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 库中看到类似的问题。
如果你需要完美的再现性,你有两条路:
是否可以控制 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 库中看到类似的问题。
如果你需要完美的再现性,你有两条路: