---
title: 体系结构的差异
description: "计算结果的差异往往是多方面因素引起的。当两个平台的代码实现不同时，精度差异就很容易产生。当两个平台的代码实现相同时，精度主要由体系结构、编译器、数学库、MPI的差异引起。不同平台损失精度换取速度的策略不同，会导致结果不准。相同平台修改不同编译选项，也会造成结果不一致。对于HPC应用来说还要考虑一种情况，就是不同的进程数也会造成精度差异。因为进程数不同，对应的应用网格剖分策略就不同，导致对产生的结果进行汇总时精度也不同。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/precisionopt/kunpengprecision_12_0008.html
sourcePath: /source/zh/perftuning/precisionopt/kunpengprecision_12_0008.html
indexId: ac41d691eef2dc1c77364c388154e99d23600338407650fbcefe1c40966156ef64
---
# 体系结构的差异

计算结果的差异往往是多方面因素引起的。当两个平台的代码实现不同时，精度差异就很容易产生。当两个平台的代码实现相同时，精度主要由体系结构、编译器、数学库、MPI的差异引起。不同平台损失精度换取速度的策略不同，会导致结果不准。相同平台修改不同编译选项，也会造成结果不一致。对于HPC应用来说还要考虑一种情况，就是不同的进程数也会造成精度差异。因为进程数不同，对应的应用网格剖分策略就不同，导致对产生的结果进行汇总时精度也不同。

从底层架构来看，鲲鹏处理器和x86的芯片架构不同，x86设计有40位和80位的浮点计算单元，而鲲鹏处理器上并没有这些计算单元。如果x86平台有使用到这些计算单元，那么两个平台的计算结果就可能不一致。目前可以在鲲鹏机器上通过软件模拟的方式来解决这类问题。例如，ICC的数学库使用了powr8i4函数，该函数调用了x87的80位指令，即用80位来表示浮点数。在鲲鹏机器上可以使用支持多种精度计算的开源MPFR库来实现80位浮点数的pow运算。

- x86设计有40位、80位的浮点计算单元，在鲲鹏处理器上并没有这些计算单元。
- FTZ和DAZ是专门用来处理非规格浮点数的标准，并且已经固化到硬件实现。在这个标准上，鲲鹏和Intel存在差异，以计算如下值为例：
  1 2 3 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
