#curve #optimized #x86-64 #aarch64 #low-level #arithmetic #pasta

sys semolina

针对 x86-64 和 aarch64 的 Pasta 模数优化的域算术

5 个版本

0.1.4 2023 年 5 月 17 日
0.1.3 2023 年 5 月 5 日
0.1.2 2022 年 6 月 25 日
0.1.1 2022 年 6 月 9 日
0.1.0 2022 年 5 月 19 日

#562 in 数学

Download history 400/week @ 2024-04-08 406/week @ 2024-04-15 320/week @ 2024-04-22 303/week @ 2024-04-29 247/week @ 2024-05-06 244/week @ 2024-05-13 282/week @ 2024-05-20 358/week @ 2024-05-27 432/week @ 2024-06-03 206/week @ 2024-06-10 194/week @ 2024-06-17 305/week @ 2024-06-24 234/week @ 2024-07-01 186/week @ 2024-07-08 260/week @ 2024-07-15 121/week @ 2024-07-22

每月 823 次下载
用于 11 Crates(2 个直接使用)

Apache-2.0

585KB
25K SLoC

GNU Style Assembly 14K SLoC // 0.0% comments Assembly 5K SLoC Perl 5K SLoC // 0.1% comments Rust 619 SLoC // 0.0% comments C 93 SLoC // 0.2% comments Shell 19 SLoC

Semolina

尽管 Pasta 曲线 的名字来源于天文学,但它听起来太像食物了,所以这个名字,小麦粉,是制作面条的主要成分。这个库是针对低级 x86_64 和 aarch64 原语的集合,针对 Pasta 模数进行了优化。它目前提供基本的算术、转换、指数辅助和模逆子程序。 cargo test 练习这些功能与 Python。没有提供基准测试,因为有人认为对高级实现进行基准测试更有意义。

技术抱怨[s]

从性能角度来看,以下实现是最优的,因为它编译为对 pasta_mul 的简单调用,返回值的地址作为目标指针

impl core::ops::Mul for $field {
    type Output = Self;

    fn mul(self, other: Self) -> Self {
        unsafe {
            let mut out = MaybeUninit::<Self>::uninit().assume_init();
            pasta_mul(&mut out.0, &self.0, &other.0, &$mod, $m0);
            out
        }
    }
}

然而,有人认为使用 assume_init() 作为初始赋值在 Rust 中是不安全的,并且应该在使用子程序返回后使用。这被编译为 a) 在栈上分配一个临时值,b) 使用临时值的地址作为目标指针调用 pasta_mul,c) 最后将临时值复制到目标位置。这可以说是低效的。另一方面,下面的片段被编译为 a) 将返回值清零,b) 使用返回值的地址作为目标指针调用 pasta_mul。这也是为什么选择它的原因,因为它更高效。

impl core::ops::Mul for $field {
    type Output = Self;

    fn mul(self, other: Self) -> Self {
        let mut out = Self::default();
        unsafe { pasta_mul(&mut out.0, &self.0, &other.0, &$mod, $m0) };
        out
    }
}

许可

semolina 库根据 Apache License Version 2.0 软件许可进行许可。

依赖项