鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

GCC编译器优化浮点运算精度

现象描述

编译优化选项设置-O2级别及以上时,鲲鹏处理器将对连续的浮点数乘法、加法融合为乘加运算,以提升性能和精度。在-O2级以上编译选项,x86处理器不会将乘法和加法做融合乘加运算,因此两种处理器在连续的浮点数乘法、加法运算后,小数点后16位存在差异。

问题原因

在鲲鹏处理器,编译优化选项设置为-O2级别及以上,连续的浮点数乘法(fmul指令)和加法(fadd指令)运算,如表达式:(a+=b*c),将被融合为乘加运算(fmadd指令)。fmadd将浮点数的乘法和加法看成不可分的一个操作,不对中间结果做精度舍入,从而导致计算结果有所差别。

对系统的影响

编译优化选项设置-O2级别及以上时,浮点乘加运算的性能有提升,但是运算的精度受到影响。

处理步骤

添加编译选项-ffp-contract=off可以关闭该优化。