2 个不稳定版本

0.2.1 2024年4月13日
0.2.0 2024年4月13日
0.1.1 2023年7月22日

#560 in 硬件支持

自定义许可

21KB
89

Absolut

Absolut 代表 "Autogenerated Bytewise SIMD-Optimized Look-Up Tables". 以下是对这个术语的解释

  • 按字节查找表:字节集之间的一对一映射。
  • SIMD 优化:这些查找表使用 SIMD (Single Instruction Multiple Data) 指令实现,例如 x86_64 上的 PSHUFB 和 AArch64 上的 TBL
  • 自动生成:这个包使用过程宏来生成(如果可能的话)基于可读的按字节映射的 SIMD 查找表。

为什么?

SIMD 指令允许在执行字节查找表操作时具有更高的数据并行性。这对于 高性能数据处理 非常有用。

遗憾的是,SIMD 表查找指令(或字节洗牌指令)操作的范围太小,无法覆盖整个 8 位整数空间。这些表在 x86_64 上的大小通常是 16,而在 AArch64 上支持的表大小最多为 64 个元素。

这个库通过从字节到字节映射的高级描述生成 SIMD 查找表。目标是避免手动硬编码 SIMD 查找表的需要,从而使更广泛的受众能够更容易地使用这些技术。

如何?

Absolut 实质上是一组过程宏,它接受以 Rust 枚举形式存在的字节到字节映射描述

#[absolut::one_hot]
pub enum JsonTable {
    #[matches(b',')]
    Comma,
    #[matches(b':')]
    Colon,
    #[matches(b'[', b']', b'{', b'}')]
    Brackets,
    #[matches(b'\r', b'\n', b'\t')]
    Control,
    #[matches(b' ')]
    Space,
    #[wildcard]
    Other,
}

上面的 JsonTable 枚举编码以下一对一映射

输入 输出
0x2C 逗号
0x3A 冒号
0x5B, 0x5D, 0x7B, 0x7D 括号
0xD, 0xA, 0x9 控制
0x20 空格
* 其他

其中 * 表示所有未显式映射的其他字节。

映射结果不需要显式定义,因为 Absolut 会自动解决。在前面的代码片段中,表达式 JsonTable::Space as u8 在对 0x20 执行表查找时评估为输出字节。

Absolut支持多种构建SIMD查找表的技巧,这些技巧被称为算法。每个算法都实现为一个过程宏,它接受使用枚举和属性注解的变体描述的字节到字节的映射,如图所示absolut::one_hot算法。

已知问题

错误消息

如果无法使用给定的Absolut算法(即表是不可满足的)来实现字节到字节的映射,则产生的错误消息将不会有助于理解算法失败解决表的原因。除非用户至少对正在运行的算法的工作方式有模糊的了解,否则他们很难找出如何更改映射,使其变得可满足并且对他们的目的有用。

SIMD查找例程

Absolut目前不提供为生成的查找表提供SIMD实现查找例程。然而,库测试包含SSSE3和NEON的查找例程。

许可

Absolut是开源软件,根据MIT许可证的条款授权。

依赖关系

~0.3–1.4MB
~30K SLoC