Speeding up gearhash on ARM64 (2× faster)
a day ago
- gearhash crate 版本 0.1.4 为 ARM64 添加了一个 NEON 后端,在典型块大小下速度大约快 2 倍,在 aarch64 上自动选择并保持向后兼容。
- 挑战:gear hash 是串行的,带有依赖链,并使用表查找(gather),使得向量化变得困难。
- 关键洞察:将哈希在 64 字节上开窗,允许将块分割成条带,从而实现并行处理。
- 将 SSE4.2 移植到 NEON 除了掩码提取外都很直接;由于循环携带的延迟,初始结果较慢(0.92 倍)。
- 通过展开每步处理 4 字节来缩短依赖链,在手动修复编译器重关联问题前,最初提升到 1.46 倍。
- 进一步优化包括减少加载指令(将字节加载合并为 32 位加载)以及合并边界测试以减少分支频率,实现了 1.81 倍速度提升。
- 最终基准测试显示,NEON 加速比从 0.25 倍(非常稀疏掩码)到 2.17 倍(稀疏掩码),典型使用(16 位掩码)为 2.14 倍。
- 未来工作包括利用 NEON 优化的经验重新审视 x86 后端。