vfmaq_f32真的有更高的运行精度吗? 我猜测vfmaq_f32的精度根据不同架构中浮点处理单元的位扩展长度的不同而有所不同,在macos arm64上,运行代码的结果是一致的。 在其他架构上能否获得更高或更低精度的结果?或者有没有编译选项可以控制结果的准确性?
#include<arm_neon.h>
#include<iostream>
using namespace std;
int main(){
float a = 12.3839467819;
float b = 21.437678904;
float c = 4171.42144;
printf("%.17f\n",a);
printf("%.17f\n",b);
printf("%.17f\n",c);
printf("%.17f\n",a+b*c);
float32x4_t a_reg = vdupq_n_f32(a);
float32x4_t b_reg = vdupq_n_f32(b);
float32x4_t c_reg = vdupq_n_f32(c);
float32x4_t res_reg = vfmaq_f32(a_reg, b_reg, c_reg);
float res[4] = {0.f};
vst1q_f32(res,res_reg);
printf("%.17f\n",res[0]);
res_reg = vmlaq_f32(a_reg, b_reg, c_reg);
vst1q_f32(res,res_reg);
printf("%.17f\n",res[0]);
res_reg = vmulq_f32(b_reg, c_reg);
res_reg = vaddq_f32(res_reg, a_reg);
vst1q_f32(res,res_reg);
printf("%.17f\n",res[0]);
return 0;
}
一般情况下合并浮点运算可以保持较高的运行精度。融合乘法累加和点积运算是指令集中最常见的两种运算。无法保证这些操作的输出在不同 CPU 架构中是一致的。
在编译普通 C 代码(即无内在函数)以实现“严格”IEEE 浮点合规性时,编译器不得生成这些约定操作,因为它们不符合规范。