计算结果差异产生来源

芯片架构差异

从底层架构来看,鲲鹏处理器和x86的芯片架构不同,如x86设计有40位、80位的浮点计算单元,在鲲鹏处理器上并没有这些计算单元。如果x86平台有使用到这些计算单元,就会导致两个平台的计算结果不一致。目前可以在鲲鹏平台上通过软件模拟的方式来解决这类问题引起的差异。例如icc的数学库使用了powr8i4函数,该函数调用了x87的80位指令,即用80位来表示浮点数。在鲲鹏平台上可以使用支持多种精度计算的开源MPFR(Multiple Precision Floating-Point Reliable)库来实现80位浮点数的pow运算。

编译器差异

数学库差异

如果函数在任何情况下产生的误差总是小于0.5ulp,那么说明这个函数总是能够返回最接近精确结果的近似值。但是目前没有统一的标准去约束数学库中log、sin、pow等函数的输出,因此不同的数学库中的函数实现可能具有不一样的舍入模式和精度计算。有下面示例代码:

program test
real::x, y, z
x = 0.699129045
y = 1.4
z = x ** y
print*, z
end

使用系统数学库libm.so.6编译,输出结果为:

0.605871201

使用鲲鹏数学库libkm.so编译,输出结果为:

0.605871141

应用代码引起的差异