编译选项分析法
编译器对精度有很大的影响,有些编译选项为了性能会牺牲掉精度,或者同一编译选项在不同的编译器上的实现是不一致的。本节介绍如何找到影响计算结果的编译选项。
前提条件
两个平台初始时结果不一致,但在不添加任何编译选项时,两个平台的输出结果是完全一致的。如果存在数学库导致的差异,可以统一使用开源数学库SLEEF暂时屏蔽,使用方法请参考开源数据库SLEEF使用方法。
下面以WRF 3.4.1为例。
- 鲲鹏使用毕昇编译器,初始编译选项:
FCBASEOPTS_NO_G = -w
- x86使用icc编译器,初始编译选项:
FCBASEOPTS_NO_G = -w -ftz -align all -fno-alias -fp-model precise
- 两个平台去掉FCBASEOPTS_NO_G的编译选项。
其计算结果是完全一致的。
- 鲲鹏编译选项:
FCBASEOPTS_NO_G =
- x86编译选项:
FCBASEOPTS_NO_G =
- 鲲鹏编译选项:
- 逐步增加剩余编译选项。
- 增加-w,两个平台计算结果仍旧一致。
- 鲲鹏编译选项:
FCBASEOPTS_NO_G = -w
- x86初始编译选项:
FCBASEOPTS_NO_G = -w
- 鲲鹏编译选项:
- 增加-ftz,两个平台计算结果出现差异。
- 鲲鹏编译选项:
FCBASEOPTS_NO_G = -w
- x86编译选项:
FCBASEOPTS_NO_G = -w -ftz
- 鲲鹏编译选项:
- 先屏蔽-ftz编译选项,继续增加剩余编译选项。最终确认无新的编译选项会影响结果。
- 增加-w,两个平台计算结果仍旧一致。
- 针对找出影响计算结果的-ftz编译选项,分析其产生差异的原因和修改方法。
父主题: 差异分析方法