体系结构的差异
计算结果的差异往往是多方面因素引起的。当两个平台的代码实现不同时,精度差异就很容易产生。当两个平台的代码实现相同时,精度主要由体系结构、编译器、数学库、MPI的差异引起。不同平台损失精度换取速度的策略不同,会导致结果不准。相同平台修改不同编译选项,也会造成结果不一致。对于HPC应用来说还要考虑一种情况,就是不同的进程数也会造成精度差异。因为进程数不同,对应的应用网格剖分策略就不同,导致对产生的结果进行汇总时精度也不同。
从底层架构来看,鲲鹏处理器和x86的芯片架构不同,x86设计有40位和80位的浮点计算单元,而鲲鹏处理器上并没有这些计算单元。如果x86平台有使用到这些计算单元,那么两个平台的计算结果就可能不一致。目前可以在鲲鹏机器上通过软件模拟的方式来解决这类问题。例如,icc的数学库使用了powr8i4函数,该函数调用了x87的80位指令,即用80位来表示浮点数。在鲲鹏机器上可以使用支持多种精度计算的开源mpfr库来实现80位浮点数的pow运算。
- x86设计有40位、80位的浮点计算单元,在鲲鹏处理器上并没有这些计算单元。
- FTZ和DAZ是专门用来处理非规格浮点数的标准,并且已经固化到硬件实现。在这个标准上,鲲鹏和Intel存在差异,以计算如下值为例:
float a= 1.09628081709e-33; float b= 1.07225660031e-05; float c = a * b;
鲲鹏结果(先执行乘法得到非规格浮点数,然后执行FTZ转化为0,最后执行舍入,结果还是0): 0
x86结果(先执行乘法得到非规格浮点数,然后执行舍入,转化为0x800000,最后执行FTZ,结果就是0x800000): 1.17549435082e-38
父主题: 计算结果差异来源