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