poulpy/math/benches/operations.rs
math/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::ONCE;
6use math::CHUNK;
7
8fn vec_add_unary(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.vec_add_unary_assign::<CHUNK, ONCE>(&p0.0, &mut p1.0);
19 })
20 }
21
22 let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("add_vec_unary");
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 vec_mul_montgomery_external_unary_assign(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.vec_mul_montgomery_external_unary_assign::<CHUNK, ONCE>(&p0.0, &mut p1.0);
52 })
53 }
54
55 let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("mul_vec_montgomery_external_unary_assign");
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 vec_mul_montgomery_external_binary_assign(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.vec_mul_montgomery_external_binary_assign::<CHUNK,ONCE>(&p0.0, & p1.0, &mut p2.0);
86 })
87 }
88
89 let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("mul_vec_montgomery_external_binary_assign");
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, vec_add_unary, vec_mul_montgomery_external_unary_assign, vec_mul_montgomery_external_binary_assign);
109criterion_main!(benches);