arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/benches/operations.rs
benches/operations.rsRaw
  1use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
  2use math::ring::Ring;
  3use math::modulus::VecOperations;
  4use math::modulus::montgomery::Montgomery;
  5use math::modulus::{BARRETT, ONCE};
  6
  7const CHUNK: usize= 8;
  8
  9fn vec_add_unary(c: &mut Criterion) {
 10    fn runner(r: Ring<u64>) -> Box<dyn FnMut()> {
 11        
 12        let mut p0: math::poly::Poly<u64> = r.new_poly();
 13        let mut p1: math::poly::Poly<u64> = r.new_poly();
 14        for i in 0..p0.n(){
 15            p0.0[i] = i as u64;
 16            p1.0[i] = i as u64;
 17        }
 18        Box::new(move || {
 19            r.modulus.vec_add_unary_assign::<CHUNK, ONCE>(&p0.0, &mut p1.0);
 20        })
 21    }
 22
 23    let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("add_vec_unary");
 24    for log_n in 11..17 {
 25
 26        let n: usize = 1<<log_n as usize;
 27        let q_base: u64 = 0x1fffffffffe00001u64;
 28        let q_power: usize = 1usize;
 29        let r: Ring<u64> = Ring::<u64>::new(n, q_base, q_power);
 30        let runners = [
 31            ("prime", {
 32                runner(r)
 33            }),
 34        ];
 35        for (name, mut runner) in runners {
 36            let id = BenchmarkId::new(name, n);
 37            b.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
 38        }
 39    }
 40}
 41
 42fn vec_mul_montgomery_external_unary_assign(c: &mut Criterion) {
 43    fn runner(r: Ring<u64>) -> Box<dyn FnMut()> {
 44        
 45        let mut p0: math::poly::Poly<Montgomery<u64>> = r.new_poly();
 46        let mut p1: math::poly::Poly<u64> = r.new_poly();
 47        for i in 0..p0.n(){
 48            p0.0[i] = r.modulus.montgomery.prepare::<ONCE>(i as u64);
 49            p1.0[i] = i as u64;
 50        }
 51        Box::new(move || {
 52            r.modulus.vec_mul_montgomery_external_unary_assign::<CHUNK, ONCE>(&p0.0, &mut p1.0);
 53        })
 54    }
 55
 56    let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("mul_vec_montgomery_external_unary_assign");
 57    for log_n in 11..17 {
 58
 59        let n: usize = 1<<log_n as usize;
 60        let q_base: u64 = 0x1fffffffffe00001u64;
 61        let q_power: usize = 1usize;
 62        let r: Ring<u64> = Ring::<u64>::new(n, q_base, q_power);
 63        let runners = [
 64            ("prime", {
 65                runner(r)
 66            }),
 67        ];
 68        for (name, mut runner) in runners {
 69            let id = BenchmarkId::new(name, n);
 70            b.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
 71        }
 72    }
 73}
 74
 75fn vec_mul_montgomery_external_binary_assign(c: &mut Criterion) {
 76    fn runner(r: Ring<u64>) -> Box<dyn FnMut()> {
 77        
 78        let mut p0: math::poly::Poly<Montgomery<u64>> = r.new_poly();
 79        let mut p1: math::poly::Poly<u64> = r.new_poly();
 80        let mut p2: math::poly::Poly<u64> = r.new_poly();
 81        for i in 0..p0.n(){
 82            p0.0[i] = r.modulus.montgomery.prepare::<ONCE>(i as u64);
 83            p1.0[i] = i as u64;
 84        }
 85        Box::new(move || {
 86            r.modulus.vec_mul_montgomery_external_binary_assign::<CHUNK,ONCE>(&p0.0, & p1.0, &mut p2.0);
 87        })
 88    }
 89
 90    let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("mul_vec_montgomery_external_binary_assign");
 91    for log_n in 11..17 {
 92
 93        let n: usize = 1<<log_n as usize;
 94        let q_base: u64 = 0x1fffffffffe00001u64;
 95        let q_power: usize = 1usize;
 96        let r: Ring<u64> = Ring::<u64>::new(n, q_base, q_power);
 97        let runners = [
 98            ("prime", {
 99                runner(r)
100            }),
101        ];
102        for (name, mut runner) in runners {
103            let id = BenchmarkId::new(name, n);
104            b.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
105        }
106    }
107}
108
109criterion_group!(benches, vec_add_unary, vec_mul_montgomery_external_unary_assign, vec_mul_montgomery_external_binary_assign);
110criterion_main!(benches);