use std::hint::black_box; use criterion::{BenchmarkId, Criterion}; use rand::RngCore; use crate::{ api::{ ModuleNew, SvpApplyDft, SvpApplyDftToDft, SvpApplyDftToDftAdd, SvpApplyDftToDftInplace, SvpPPolAlloc, SvpPrepare, VecZnxDftAlloc, }, layouts::{Backend, DataViewMut, FillUniform, Module, ScalarZnx, SvpPPol, VecZnx, VecZnxDft}, source::Source, }; pub fn bench_svp_prepare(c: &mut Criterion, label: &str) where Module: SvpPrepare + SvpPPolAlloc + ModuleNew, B: Backend, { let group_name: String = format!("svp_prepare::{label}"); let mut group = c.benchmark_group(group_name); fn runner(log_n: usize) -> impl FnMut() where Module: SvpPrepare + SvpPPolAlloc + ModuleNew, B: Backend, { let module: Module = Module::::new(1 << log_n); let cols: usize = 2; let mut svp: SvpPPol, B> = module.svp_ppol_alloc(cols); let mut a: ScalarZnx> = ScalarZnx::alloc(module.n(), cols); let mut source = Source::new([0u8; 32]); a.fill_uniform(50, &mut source); move || { module.svp_prepare(&mut svp, 0, &a, 0); black_box(()); } } for log_n in [10, 11, 12, 13, 14] { let id: BenchmarkId = BenchmarkId::from_parameter(format!("{}", 1 << log_n)); let mut runner = runner::(log_n); group.bench_with_input(id, &(), |b, _| b.iter(&mut runner)); } group.finish(); } pub fn bench_svp_apply_dft(c: &mut Criterion, label: &str) where Module: SvpApplyDft + SvpPPolAlloc + ModuleNew + VecZnxDftAlloc, B: Backend, { let group_name: String = format!("svp_apply_dft::{label}"); let mut group = c.benchmark_group(group_name); fn runner(params: [usize; 3]) -> impl FnMut() where Module: SvpApplyDft + SvpPPolAlloc + ModuleNew + VecZnxDftAlloc, B: Backend, { let n: usize = 1 << params[0]; let cols: usize = params[1]; let size: usize = params[2]; let module: Module = Module::::new(n as u64); let mut svp: SvpPPol, B> = module.svp_ppol_alloc(cols); let mut res: VecZnxDft, B> = module.vec_znx_dft_alloc(cols, size); let mut a: VecZnx> = VecZnx::alloc(n, cols, size); let mut source = Source::new([0u8; 32]); source.fill_bytes(svp.data_mut()); source.fill_bytes(res.data_mut()); source.fill_bytes(a.data_mut()); move || { for j in 0..cols { module.svp_apply_dft(&mut res, j, &svp, j, &a, j); } black_box(()); } } for params in [[10, 2, 2], [11, 2, 4], [12, 2, 7], [13, 2, 15], [14, 2, 31]] { let id: BenchmarkId = BenchmarkId::from_parameter(format!("{}x({}x{})", 1 << params[0], params[1], params[2])); let mut runner = runner::(params); group.bench_with_input(id, &(), |b, _| b.iter(&mut runner)); } group.finish(); } pub fn bench_svp_apply_dft_to_dft(c: &mut Criterion, label: &str) where Module: SvpApplyDftToDft + SvpPPolAlloc + ModuleNew + VecZnxDftAlloc, B: Backend, { let group_name: String = format!("svp_apply_dft_to_dft::{label}"); let mut group = c.benchmark_group(group_name); fn runner(params: [usize; 3]) -> impl FnMut() where Module: SvpApplyDftToDft + SvpPPolAlloc + ModuleNew + VecZnxDftAlloc, B: Backend, { let n: usize = 1 << params[0]; let cols: usize = params[1]; let size: usize = params[2]; let module: Module = Module::::new(n as u64); let mut svp: SvpPPol, B> = module.svp_ppol_alloc(cols); let mut res: VecZnxDft, B> = module.vec_znx_dft_alloc(cols, size); let mut a: VecZnxDft, B> = module.vec_znx_dft_alloc(cols, size); let mut source = Source::new([0u8; 32]); source.fill_bytes(svp.data_mut()); source.fill_bytes(res.data_mut()); source.fill_bytes(a.data_mut()); move || { for j in 0..cols { module.svp_apply_dft_to_dft(&mut res, j, &svp, j, &a, j); } black_box(()); } } for params in [[10, 2, 2], [11, 2, 4], [12, 2, 7], [13, 2, 15], [14, 2, 31]] { let id: BenchmarkId = BenchmarkId::from_parameter(format!("{}x({}x{})", 1 << params[0], params[1], params[2])); let mut runner = runner::(params); group.bench_with_input(id, &(), |b, _| b.iter(&mut runner)); } group.finish(); } pub fn bench_svp_apply_dft_to_dft_add(c: &mut Criterion, label: &str) where Module: SvpApplyDftToDftAdd + SvpPPolAlloc + ModuleNew + VecZnxDftAlloc, B: Backend, { let group_name: String = format!("svp_apply_dft_to_dft_add::{label}"); let mut group = c.benchmark_group(group_name); fn runner(params: [usize; 3]) -> impl FnMut() where Module: SvpApplyDftToDftAdd + SvpPPolAlloc + ModuleNew + VecZnxDftAlloc, B: Backend, { let n: usize = 1 << params[0]; let cols: usize = params[1]; let size: usize = params[2]; let module: Module = Module::::new(n as u64); let mut svp: SvpPPol, B> = module.svp_ppol_alloc(cols); let mut res: VecZnxDft, B> = module.vec_znx_dft_alloc(cols, size); let mut a: VecZnxDft, B> = module.vec_znx_dft_alloc(cols, size); let mut source = Source::new([0u8; 32]); source.fill_bytes(svp.data_mut()); source.fill_bytes(res.data_mut()); source.fill_bytes(a.data_mut()); move || { for j in 0..cols { module.svp_apply_dft_to_dft_add(&mut res, j, &svp, j, &a, j); } black_box(()); } } for params in [[10, 2, 2], [11, 2, 4], [12, 2, 7], [13, 2, 15], [14, 2, 31]] { let id: BenchmarkId = BenchmarkId::from_parameter(format!("{}x({}x{})", 1 << params[0], params[1], params[2])); let mut runner = runner::(params); group.bench_with_input(id, &(), |b, _| b.iter(&mut runner)); } group.finish(); } pub fn bench_svp_apply_dft_to_dft_inplace(c: &mut Criterion, label: &str) where Module: SvpApplyDftToDftInplace + SvpPPolAlloc + ModuleNew + VecZnxDftAlloc, B: Backend, { let group_name: String = format!("svp_apply_dft_to_dft_inplace::{label}"); let mut group = c.benchmark_group(group_name); fn runner(params: [usize; 3]) -> impl FnMut() where Module: SvpApplyDftToDftInplace + SvpPPolAlloc + ModuleNew + VecZnxDftAlloc, B: Backend, { let n: usize = 1 << params[0]; let cols: usize = params[1]; let size: usize = params[2]; let module: Module = Module::::new(n as u64); let mut svp: SvpPPol, B> = module.svp_ppol_alloc(cols); let mut res: VecZnxDft, B> = module.vec_znx_dft_alloc(cols, size); let mut source = Source::new([0u8; 32]); source.fill_bytes(svp.data_mut()); source.fill_bytes(res.data_mut()); move || { for j in 0..cols { module.svp_apply_dft_to_dft_inplace(&mut res, j, &svp, j); } black_box(()); } } for params in [[10, 2, 2], [11, 2, 4], [12, 2, 7], [13, 2, 15], [14, 2, 31]] { let id: BenchmarkId = BenchmarkId::from_parameter(format!("{}x({}x{})", 1 << params[0], params[1], params[2])); let mut runner = runner::(params); group.bench_with_input(id, &(), |b, _| b.iter(&mut runner)); } group.finish(); }