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;
}
字符串
1条答案
按热度按时间vc6uscn91#
一般来说,合并浮点运算可以保持更高的运行精度。合并乘法、累加和点积运算是指令集中最常见的两种运算。不能保证这些运算的输出在CPU架构中是一致的。
当编译正常的C代码(即没有intrinsic)以“严格”IEEE浮点兼容时,编译器不能生成这些收缩操作,因为它们不符合规范。