ARM v7:32 位浮点的 SIMD 查找表

Zvi*_*red 0 arm intrinsics neon

我有一个 float32 数字向量。对于每个元素,我必须找到 cos,sin

我想使用查找表而不是默认库。是否有 ARM 内部代码可以用于此目的?

Aki*_*nen 6

Arm v7 必须uint8x8_t vtbl4_u8(uint8x8x4_t tbl, uint8x8_t idx)从大小为 32 的表中并行提取 8 个值。其他表大小为 8,16 和 24 个条目;还有一个uint8x8_t vtbxN_u8(uint8x8_t result, uint8x8xN_t tbl, uin8x8_t idx)变体可用,如果相应的 idx 超出范围,则不会清除车道。因此,vtbx 可用于扩展表大小。

这些指令/内在函数可用于例如分段多项式近似以获得每个范围的系数。然而,我不希望这样的解决方案对浮点数有效,因为需要 3 或 4 个表进行线性插值,需要 6 到 8 个表进行分段二次插值 - 每个表仅提供 4 字节 float32_t 系数的一个字节。

相比之下,在泰勒或麦克劳林展开式中添加更多条目在内存、指令数和延迟方面要高效得多。