如何使用SIMD实现atoi?
问题:
我想尝试编写一个atoi使用 SIMD 指令实现,包含在 RapidJSON 中。我想出的算法如下:
我的算法正确吗?有更好的办法吗?有使用任何 SIMD 指令集的 atoi 参考实现吗?
答案:
算法正确且完整。它适用于 int 和 uint,从 MIN_INT=-2147483648 到 MAX_INT=2147483647 以及从 MIN_UINT=0 到 MAX_UINT=4294967295。
提供了参考实现,使用 intel 语法用 GNU 汇编器编写。
这段代码的属性如下:
的方法算法如下:
最后一步是将这四个 DWORD 添加在一起2PHADDD 由 2(PSHUFD PADDD)
的结果Haswell 32 位的 Intel-IACA 吞吐量分析:
吞吐量分析报告块吞吐量:16.10 个周期吞吐量瓶颈:迭代N - 端口号或周期数资源冲突导致延迟,DV - 分配器管道(在端口 0 上)
D - 数据获取管道(在端口 2 和 3 上),CP - 在关键路径
F - 与上一条指令的宏融合发生
指令微操作未绑定到端口
^ - 微融合发生
@ - SSE 指令后面跟着 AVX256 指令,几十个周期的损失是预计
! - 不支持指令,未在分析中考虑
| | 数量 | 循环端口压力| |
| 0* | | | | | | | | | |异或 eax, eax
| 0* | | | | | | | | | |异或 ecx, ecx
| 0* | | | | | | | | | |异或 edx, edx
| 1 | | 0.1 | 0.1 | | | | 0.9 |
以上是如何使用SIMD指令高效实现atoi?的详细内容。更多信息请关注PHP中文网其他相关文章!