c – 如何控制Microsoft C运行时库使用的CPU指令?
是否可以控制MS C运行时库使用哪些CPU指令集(Visual Studio 2013,2015)?如果我进入反汇编,例如cos(),则代码将与预先计算的CPU功能集进行比较,然后使用CPU上可用的“最佳”功能执行该功能.问题是不同的指令集会产生不同的结果,因此结果会因CPU架构而异.
例如,构建一个64位可执行文件: std::cout << std::setprecision(20) << cos(-0.61385470201194381) << std:: endl; 在Haswell / Broadwell以及之后返回0.81743370050726594(与x86相同).在较旧的CPU上返回0.81743370050726583. 运行时库使用FMA instruction set(如果可用),执行不同的实现并产生不同的结果.请注意,这不受应用程序中选择的编译器选项的影响,因为运行时库是预编译的.还要注意浮点精度控制函数_controlfp()cannot control是64位运行时的精度. 是否可以控制运行时库使用哪些指令集,以便结果更具确定性? 解决方法
没有. 如果您只使用基本算术(,–,*,/,sqrt),并强制您的编译器使用严格的IEEE754算法,那么它应该是完全可重现的.对于其他函数,例如cos,你受libm的支配,不需要提供任何准确性保证.您还将看到BLAS库的类似问题. 如果您需要完美的再现性,您有两条路径: >使用正确舍入的数学库,例如CRlibm(尽管我认为像pow这样的2参数函数已被证明是正确的). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |