加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:50:59 所属栏目:百科 来源:网络整理
导读:是否可以控制MS C运行时库使用哪些CPU指令集(Visual Studio 2013,2015)?如果我进入反汇编,例如cos(),则代码将与预先计算的CPU功能集进行比较,然后使用CPU上可用的“最佳”功能执行该功能.问题是不同的指令集会产生不同的结果,因此结果会因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位运行时的精度.

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

解决方法

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库的类似问题.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读