6个版本 (3个重大更改)
0.4.1 | 2024年2月28日 |
---|---|
0.4.0 | 2024年2月14日 |
0.3.0 | 2023年8月28日 |
0.2.1 | 2023年3月24日 |
0.1.0 | 2022年9月7日 |
在数学类别中排名第89
每月下载量8,716
在8个包中使用(直接使用2个)
600KB
17K SLoC
Concrete-FFT是一个纯Rust高性能快速傅里叶变换库,它处理的是大小为2的幂的向量。它被设计成Zama的TFHE-rs库的后端。
此库提供两个FFT模块
- 有序模块FFT使用标准顺序的输入执行正向/反向FFT,并以标准顺序输出结果。有关FFT计算更详细的信息,请查看有序模块级别的文档。
- 无序模块FFT执行正向FFT,其输入为标准顺序,输出为FFT计划可能依赖的某种排列顺序。另一方面,反向FFT以相同的排列顺序输入,并以标准顺序输出结果。这在傅里叶域系数顺序不重要的情况下很有用。一个例子是使用傅里叶变换进行向量卷积。傅里叶域中仅执行逐元素操作,因此系数的顺序不会影响结果。
此外,还提供了一个可选的128位递减FFT模块。
特性
std
(默认):此选项启用运行时架构检测以使用加速的SIMD指令,并测量各种实现以在运行时选择最快的FFT计划。fft128
:此标志提供了对128位FFT的访问,可在fft128
模块中使用。nightly
:此功能通过在支持它们的CPU上启用AVX512F指令,进一步加快FFT的速度,从而启用不稳定的Rust功能。此功能需要nightly Rust工具链。serde
:此功能为无序计划启用序列化和反序列化函数。这些函数允许将傅里叶域中的数据从排列顺序序列化为标准顺序,并将数据从标准顺序反序列化为排列顺序。由于逆变换必须与计算/反序列化正变换的同一天计划一起使用(或更具体地说,具有相同内部基本FFT大小的计划),因此需要此功能。
示例
use concrete_fft::c64;
use concrete_fft::ordered::{Plan, Method};
use dyn_stack::{PodStack, GlobalPodBuffer, ReborrowMut};
use num_complex::ComplexFloat;
use std::time::Duration;
const N: usize = 4;
let plan = Plan::new(4, Method::Measure(Duration::from_millis(10)));
let mut scratch_memory = GlobalPodBuffer::new(plan.fft_scratch().unwrap());
let mut stack = PodStack::new(&mut scratch_memory);
let data = [
c64::new(1.0, 0.0),
c64::new(2.0, 0.0),
c64::new(3.0, 0.0),
c64::new(4.0, 0.0),
];
let mut transformed_fwd = data;
plan.fwd(&mut transformed_fwd, stack.rb_mut());
let mut transformed_inv = transformed_fwd;
plan.inv(&mut transformed_inv, stack.rb_mut());
for (actual, expected) in transformed_inv.iter().map(|z| z / N as f64).zip(data) {
assert!((expected - actual).abs() < 1e-9);
}
链接
许可证
本软件在BSD-3-Clause-Clear许可证下分发,其中包含一项豁免,允许在研究、评估和原型设计目的以及个人项目中使用我们的专利权。
然而,如果您想在商业产品中使用concrete-fft,则需要购买单独的商业许可证。
如果您有任何疑问,请通过hello@zama.ai.
与我们联系
依赖关系
~2.5MB
~54K SLoC