arnaucube
arnaucube/phantom-zonePublic Self-hosted repository
phantom-zone/benches/modulus.rs
benches/modulus.rsRaw
 1use bin_rs::{ModInit, ModularOpsU64, VectorOps};
 2use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
 3use itertools::Itertools;
 4use rand::{thread_rng, Rng};
 5use rand_distr::Uniform;
 6
 7fn benchmark(c: &mut Criterion) {
 8    let mut group = c.benchmark_group("modulus");
 9    // 55
10    for prime in [36028797017456641] {
11        for ring_size in [1 << 11, 1 << 15] {
12            let modop = ModularOpsU64::new(prime);
13
14            let mut rng = thread_rng();
15            let dist = Uniform::new(0, prime);
16
17            let a0 = (&mut rng).sample_iter(dist).take(ring_size).collect_vec();
18            let a1 = (&mut rng).sample_iter(dist).take(ring_size).collect_vec();
19            let a2 = (&mut rng).sample_iter(dist).take(ring_size).collect_vec();
20
21            group.bench_function(
22                BenchmarkId::new("elwise_fma", format!("q={prime}/{ring_size}")),
23                |b| {
24                    b.iter_batched_ref(
25                        || (a0.clone(), a1.clone(), a2.clone()),
26                        |(a0, a1, a2)| black_box(modop.elwise_fma_mut(a0, a1, a2)),
27                        criterion::BatchSize::PerIteration,
28                    )
29                },
30            );
31        }
32    }
33
34    group.finish();
35}
36
37criterion_group!(modulus, benchmark);
38criterion_main!(modulus);