2 个不稳定版本
0.2.1 | 2024年4月13日 |
---|---|
0.2.0 |
|
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