arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/math/benches/ntt.rs
math/benches/ntt.rsRaw
  1use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
  2use math::dft::DFT;
  3use math::{dft::ntt::Table, modulus::prime::Prime};
  4
  5fn forward_inplace(c: &mut Criterion) {
  6    fn runner(prime_instance: Prime<u64>, nth_root: usize) -> Box<dyn FnMut()> {
  7        let ntt_table: Table<u64> = Table::<u64>::new(prime_instance, nth_root);
  8        let mut a: Vec<u64> = vec![0; (nth_root >> 1) as usize];
  9        for i in 0..a.len() {
 10            a[i] = i as u64;
 11        }
 12        Box::new(move || ntt_table.forward_inplace::<false>(&mut a))
 13    }
 14
 15    let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> =
 16        c.benchmark_group("forward_inplace");
 17    for log_nth_root in 11..18 {
 18        let prime_instance: Prime<u64> = Prime::<u64>::new(0x1fffffffffe00001, 1);
 19
 20        let runners = [("prime", { runner(prime_instance, 1 << log_nth_root) })];
 21        for (name, mut runner) in runners {
 22            let id = BenchmarkId::new(name, 1 << (log_nth_root - 1));
 23            b.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
 24        }
 25    }
 26}
 27
 28fn forward_inplace_lazy(c: &mut Criterion) {
 29    fn runner(prime_instance: Prime<u64>, nth_root: usize) -> Box<dyn FnMut()> {
 30        let ntt_table: Table<u64> = Table::<u64>::new(prime_instance, nth_root);
 31        let mut a: Vec<u64> = vec![0; (nth_root >> 1) as usize];
 32        for i in 0..a.len() {
 33            a[i] = i as u64;
 34        }
 35        Box::new(move || ntt_table.forward_inplace_lazy(&mut a))
 36    }
 37
 38    let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> =
 39        c.benchmark_group("forward_inplace_lazy");
 40    for log_nth_root in 11..17 {
 41        let prime_instance: Prime<u64> = Prime::<u64>::new(0x1fffffffffe00001, 1);
 42
 43        let runners = [("prime", { runner(prime_instance, 1 << log_nth_root) })];
 44        for (name, mut runner) in runners {
 45            let id = BenchmarkId::new(name, 1 << (log_nth_root - 1));
 46            b.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
 47        }
 48    }
 49}
 50
 51fn backward_inplace(c: &mut Criterion) {
 52    fn runner(prime_instance: Prime<u64>, nth_root: usize) -> Box<dyn FnMut()> {
 53        let ntt_table: Table<u64> = Table::<u64>::new(prime_instance, nth_root);
 54        let mut a: Vec<u64> = vec![0; (nth_root >> 1) as usize];
 55        for i in 0..a.len() {
 56            a[i] = i as u64;
 57        }
 58        Box::new(move || ntt_table.backward_inplace::<false>(&mut a))
 59    }
 60
 61    let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> =
 62        c.benchmark_group("backward_inplace");
 63    for log_nth_root in 11..18 {
 64        let prime_instance: Prime<u64> = Prime::<u64>::new(0x1fffffffffe00001, 1);
 65
 66        let runners = [("prime", { runner(prime_instance, 1 << log_nth_root) })];
 67        for (name, mut runner) in runners {
 68            let id = BenchmarkId::new(name, 1 << (log_nth_root - 1));
 69            b.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
 70        }
 71    }
 72}
 73
 74fn backward_inplace_lazy(c: &mut Criterion) {
 75    fn runner(prime_instance: Prime<u64>, nth_root: usize) -> Box<dyn FnMut()> {
 76        let ntt_table: Table<u64> = Table::<u64>::new(prime_instance, nth_root);
 77        let mut a: Vec<u64> = vec![0; (nth_root >> 1) as usize];
 78        for i in 0..a.len() {
 79            a[i] = i as u64;
 80        }
 81        Box::new(move || ntt_table.backward_inplace::<true>(&mut a))
 82    }
 83
 84    let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> =
 85        c.benchmark_group("backward_inplace_lazy");
 86    for log_nth_root in 11..17 {
 87        let prime_instance: Prime<u64> = Prime::<u64>::new(0x1fffffffffe00001, 1);
 88
 89        let runners = [("prime", { runner(prime_instance, 1 << log_nth_root) })];
 90        for (name, mut runner) in runners {
 91            let id = BenchmarkId::new(name, 1 << (log_nth_root - 1));
 92            b.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
 93        }
 94    }
 95}
 96
 97criterion_group!(
 98    benches,
 99    forward_inplace,
100    forward_inplace_lazy,
101    backward_inplace,
102    backward_inplace_lazy
103);
104criterion_main!(benches);