13次发布

0.1.12 2021年7月29日
0.1.11 2021年7月23日

#585 in 数学


2 crate中使用

GPL-2.0-or-later OR LGPL-2.0-or-later

150KB
2.5K SLoC

guff-matrix

此crate使用SIMD代码实现非常快速的伽罗瓦域矩阵乘法。

先前实现

我之前在PlayStation 3上实现了此算法的一个版本。它在这里可用 这里

SIMD支持

我将实现三种不同的SIMD引擎,以在向量间进行域乘法

  • x86并行长(按位)乘法的实现

  • Arm/Aarch64 NEON实现使用硬件多项式乘法和基于表的模数缩减(vmull/tvbl)

  • Arm NEON的并行长(按位)乘法实现

  • 4-way armv6 (Thumb)长乘法例程的实现

支持Arm目标需要夜间构建的Rust构建。

无限带(模拟)

在开始编写特定架构的实现之前,我专注于清楚地记录算法的工作原理。我将实现一个非SIMD版本,该版本使用类似的基本思想,但使用更“锈”的风格(无限迭代器)。它位于 src/arch.rs,并可作为功能启用

cargo test --features simulator --tests simulator

我还会使用此来证明算法按预期工作。

  • 编写和测试非SIMD算法的模拟

  • 编写和测试SIMD算法的模拟

矩阵乘法

使用场乘法例程的SIMD版本,我现在有

  • x86矩阵乘法的SIMD版本

需要做更多的工作,但经过测试,它比参考版本快3倍左右。有关详细信息,请参阅 benches/vector_mul.rs。要运行它并启用所有相关优化,可能需要打开一些编译器标志

RUSTFLAGS="-O -C target-cpu=native -C target-feature=+ssse3,+sse4.1,+sse4.2,+avx" cargo bench -q "matrix" 

依赖关系

~550KB
~11K SLoC