【发布时间】:2021-12-01 23:48:17
【问题描述】:
有vrecpeq_f32ARM NEON Intrinsic。
vrecpeq_f32的官方解释:https://developer.arm.com/architectures/instruction-sets/intrinsics/#f:@navigationhierarchiessimdisa=[Neon]&q=vrecpeq_f32。
浮点倒数估计。该指令为源 SIMD&FP 寄存器中的每个向量元素找到一个近似倒数估计,将结果放入一个向量中,并将该向量写入目标 SIMD&FP 寄存器。
但是,它对我来说仍然不准确。只是想知道我们是否可以用 C/C++ 编写一个参考实现来保持与vrecpeq_f32 完全相同的结果?
我尝试调用vrecpeq_f32 并得到结果:
float32x4_t v1 = {1, 2, 3, 4};
float32x4_t v_out = vrecpeq_f32(v1);//0.99805, 0.49902, 0.33301, 0.24951
很好奇为什么 1 的倒数是 0.99805 而不是 1.0。
附:我对如何使用 NEON 内在函数和一些技巧来获得更好的精确倒数结果不感兴趣,例如一次或多次 Newton-Raphson 迭代。
【问题讨论】:
-
它记录在 FPRecipEstimate 下的here
-
@Frank 哦,在你提到之前我没有点击那个链接。不过好像伪代码太长了,我以为会短一点。
-
> 很好奇为什么 1 的倒数是 0.99805 而不是 1.0 。 ——我怀疑,这条指令的结果是从一个具有一组有限 bin 的 ROM 中读取的,每个 bin 用于一系列浮点数。 IOW,必须生成 0.99805 的值并且不仅对 1.0 的输入有效,而且对其他相邻值也有效。因此,结果是近似值,而不是精确值。
-
因为它只是一个估计,正如指令助记符明确指出的那样。
标签: c++ simd intrinsics neon