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 数学
每月 823 次下载
用于 11 个 Crates(2 个直接使用)
585KB
25K 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 软件许可进行许可。