Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FP操作是否在各种x86 CPU上给出完全相同的结果?_X86_Floating Accuracy - Fatal编程技术网

FP操作是否在各种x86 CPU上给出完全相同的结果?

FP操作是否在各种x86 CPU上给出完全相同的结果?,x86,floating-accuracy,X86,Floating Accuracy,假设被比较的CPU上有相同的指令、相同的输入和相同的操作参数(如舍入模式),不同的x86 CPU(具有内置FPU和合理的最新版本,比如本世纪推出的)是否会为其浮点原语产生完全相同的结果?我对时间上的差异不感兴趣,也对时间上的差异不感兴趣(这不符合条件,因为那个事件是古老的) 我想加法、减法、求反和整数四舍五入的答案是肯定的,因为它们都有精确的定义,我很难想象实现中会有什么分歧(可能在检测溢出/下溢时缺少一个bug,但在某些应用程序中这将是一场灾难,所以我想这可能早就被发现并修复了) 乘法似乎更可

假设被比较的CPU上有相同的指令、相同的输入和相同的操作参数(如舍入模式),不同的x86 CPU(具有内置FPU和合理的最新版本,比如本世纪推出的)是否会为其浮点原语产生完全相同的结果?我对时间上的差异不感兴趣,也对时间上的差异不感兴趣(这不符合条件,因为那个事件是古老的)

我想加法、减法、求反和整数四舍五入的答案是肯定的,因为它们都有精确的定义,我很难想象实现中会有什么分歧(可能在检测溢出/下溢时缺少一个bug,但在某些应用程序中这将是一场灾难,所以我想这可能早就被发现并修复了)

乘法似乎更可能有不同的实现:确定两个DPFPN乘积的(比如)最近可表示的双精度浮点数(64位,包括尾数的52+1)有时需要计算其尾数的乘积到(大约)104位精度,对于少数LSBits来说,这无疑是一种浪费。我想知道这是否是尝试过的,并且做得是否正确。或者IEEE-754,或者一些事实上的标准,规定了什么

分裂似乎更加微妙

而且,由于缺乏一个通用的设计,考虑到可以使用的数学方法的多样性,我怀疑更复杂的事情(trig函数、日志等)的所有实现是否能够完全同步


我这样问是出于纯粹的噪音、改进的意愿以及(有时)允许在VM中运行的程序检测假装运行的CPU与实际运行的CPU之间的不匹配的方法的愿望。

汇编级基本浮点指令(加、减、乘、除、平方根、FMA、舍入)总是产生相同的结果,如IEEE754标准所述。有两种指令可能在不同的体系结构上产生不同的结果:用于计算超越运算的复杂FPU指令(FSIN、FCOS、F2XM1等),和近似SSE指令(用于计算近似倒数的RCPSS/RCPPS,以及用于计算近似倒数平方根的RSQRTSS、RSQRTPS)超越X87的FPU操作是用微码实现的,除了AMD K5之外的所有英特尔和AMD CPU都使用相同的微码,所以不能用它来检测。它可能只对VIS、CyRIX、Timeta和其他旧CPU的检测有帮助,但是这些太少了。在Intel、AMD和AFAIK上,旧版本(K8之前)的实现有所不同和更新的AMD CPU。您可以利用这种差异来检测假装是Intel的AMD CPU,反之亦然,但这是一个有限的使用案例。

除了勘误表中详细记录的极端情况外,所有的IA-32指令在处理器之间的行为都是相同的

当然,
CPUID
和MSR访问是明显的例外

显而易见的非例外是各种逻辑、整数和浮点运算。如前所述,许多更复杂的运算都是通过微码计算的。不同微体系结构的处理器之间,微码可能会有很大差异,但结果保证是相同的。例如,英特尔(我对其他x86开发人员没有第一手的了解),我投入了巨大的资源来确保处理器之间的向后兼容性,甚至复制“bug”行为(这会将bug更改为新规范)

如果体系结构的行为不同,例如使用VMX(虚拟化)和SMM(系统管理),则控制结构包括一个修订ID。所有使用相同修订ID的处理器保证在这些体系结构上的行为方式相同


要回答最初的问题,FP操作,无论是x87、SSE还是AVX,在所有处理器上都会给出相同的结果。

虽然这个问题非常有趣(我希望看到答案),但您似乎不太可能使用它来检测虚拟化。我运行的大多数虚拟机(主要是VMWare和KVM)正确报告物理CPU,这样在这种情况下芯片组的异常不会导致不匹配。优化的代码生成是一个更大的问题。FPU很难以一致的方式进行优化。编译器一直迁移到SSE2的主要原因。我不同意密切的评论。虽然stion可能是非建设性的,实际问题是非常有效的,并且可以“由事实、参考资料或特定专业知识支持”。我做了一些随机实验,这些实验与答案一致。我将伪随机位(使用C并集转换为80位长的双精度位)输入到
/
sqrtl
sinl
(作为x87指令实现),并将结果散列(转换回位)1e6次。我发现的唯一区别在于
sinl
,它在Intel和AMD之间给出了不同的散列(但在PIII和Core i7以及Athlon XP和Althlon 50505e之间是一致的)。