mirror of
https://github.com/arnaucube/poulpy.git
synced 2026-02-10 05:06:44 +01:00
Support for bivariate convolution & normalization with offset (#126)
* Add bivariate-convolution * Add pair-wise convolution + tests + benches * Add take_cnv_pvec_[left/right] to Scratch & updated CHANGELOG.md * cross-base2k normalization with positive offset * clippy & fix CI doctest avx compile error * more streamlined bounds derivation for normalization * Working cross-base2k normalization with pos/neg offset * Update normalization API & tests * Add glwe tensoring test * Add relinearization + preliminary test * Fix GGLWEToGGSW key infos * Add (X,Y) convolution by const (1, Y) poly * Faster normalization test + add bench for cnv_by_const * Update changelog
This commit is contained in:
committed by
GitHub
parent
76424d0ab5
commit
4e90e08a71
116
poulpy-cpu-avx/benches/convolution.rs
Normal file
116
poulpy-cpu-avx/benches/convolution.rs
Normal file
@@ -0,0 +1,116 @@
|
||||
use criterion::{Criterion, criterion_group, criterion_main};
|
||||
|
||||
#[cfg(not(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
)))]
|
||||
fn bench_cnv_prepare_left_cpu_avx_fft64(_c: &mut Criterion) {
|
||||
eprintln!("Skipping: AVX IFft benchmark requires x86_64 + AVX2 + FMA");
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
))]
|
||||
fn bench_cnv_prepare_left_cpu_avx_fft64(c: &mut Criterion) {
|
||||
use poulpy_cpu_avx::FFT64Avx;
|
||||
poulpy_hal::bench_suite::convolution::bench_cnv_prepare_left::<FFT64Avx>(c, "cpu_avx::fft64");
|
||||
}
|
||||
|
||||
#[cfg(not(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
)))]
|
||||
fn bench_cnv_prepare_right_cpu_avx_fft64(_c: &mut Criterion) {
|
||||
eprintln!("Skipping: AVX IFft benchmark requires x86_64 + AVX2 + FMA");
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
))]
|
||||
fn bench_cnv_prepare_right_cpu_avx_fft64(c: &mut Criterion) {
|
||||
use poulpy_cpu_avx::FFT64Avx;
|
||||
poulpy_hal::bench_suite::convolution::bench_cnv_prepare_right::<FFT64Avx>(c, "cpu_avx::fft64");
|
||||
}
|
||||
|
||||
#[cfg(not(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
)))]
|
||||
fn bench_cnv_apply_dft_cpu_avx_fft64(_c: &mut Criterion) {
|
||||
eprintln!("Skipping: AVX IFft benchmark requires x86_64 + AVX2 + FMA");
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
))]
|
||||
fn bench_cnv_apply_dft_cpu_avx_fft64(c: &mut Criterion) {
|
||||
use poulpy_cpu_avx::FFT64Avx;
|
||||
poulpy_hal::bench_suite::convolution::bench_cnv_apply_dft::<FFT64Avx>(c, "cpu_avx::fft64");
|
||||
}
|
||||
|
||||
#[cfg(not(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
)))]
|
||||
fn bench_cnv_pairwise_apply_dft_cpu_avx_fft64(_c: &mut Criterion) {
|
||||
eprintln!("Skipping: AVX IFft benchmark requires x86_64 + AVX2 + FMA");
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
))]
|
||||
fn bench_cnv_pairwise_apply_dft_cpu_avx_fft64(c: &mut Criterion) {
|
||||
use poulpy_cpu_avx::FFT64Avx;
|
||||
poulpy_hal::bench_suite::convolution::bench_cnv_pairwise_apply_dft::<FFT64Avx>(c, "cpu_avx::fft64");
|
||||
}
|
||||
|
||||
#[cfg(not(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
)))]
|
||||
fn bench_cnv_by_const_apply_cpu_avx_fft64(_c: &mut Criterion) {
|
||||
eprintln!("Skipping: AVX IFft benchmark requires x86_64 + AVX2 + FMA");
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
))]
|
||||
fn bench_cnv_by_const_apply_cpu_avx_fft64(c: &mut Criterion) {
|
||||
use poulpy_cpu_avx::FFT64Avx;
|
||||
poulpy_hal::bench_suite::convolution::bench_cnv_by_const_apply::<FFT64Avx>(c, "cpu_avx::fft64");
|
||||
}
|
||||
|
||||
criterion_group!(
|
||||
benches,
|
||||
bench_cnv_prepare_left_cpu_avx_fft64,
|
||||
bench_cnv_prepare_right_cpu_avx_fft64,
|
||||
bench_cnv_apply_dft_cpu_avx_fft64,
|
||||
bench_cnv_pairwise_apply_dft_cpu_avx_fft64,
|
||||
bench_cnv_by_const_apply_cpu_avx_fft64,
|
||||
);
|
||||
criterion_main!(benches);
|
||||
@@ -1,11 +1,21 @@
|
||||
use criterion::{Criterion, criterion_group, criterion_main};
|
||||
|
||||
#[cfg(not(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma")))]
|
||||
#[cfg(not(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
)))]
|
||||
fn bench_ifft_avx2_fma(_c: &mut Criterion) {
|
||||
eprintln!("Skipping: AVX IFft benchmark requires x86_64 + AVX2 + FMA");
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma"))]
|
||||
#[cfg(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
))]
|
||||
pub fn bench_ifft_avx2_fma(c: &mut Criterion) {
|
||||
use criterion::BenchmarkId;
|
||||
use poulpy_cpu_avx::ReimIFFTAvx;
|
||||
@@ -21,10 +31,7 @@ pub fn bench_ifft_avx2_fma(c: &mut Criterion) {
|
||||
let mut values: Vec<f64> = vec![0f64; m << 1];
|
||||
|
||||
let scale = 1.0f64 / (2 * m) as f64;
|
||||
values
|
||||
.iter_mut()
|
||||
.enumerate()
|
||||
.for_each(|(i, x)| *x = (i + 1) as f64 * scale);
|
||||
values.iter_mut().enumerate().for_each(|(i, x)| *x = (i + 1) as f64 * scale);
|
||||
|
||||
let table: ReimIFFTTable<f64> = ReimIFFTTable::<f64>::new(m);
|
||||
move || {
|
||||
@@ -47,12 +54,22 @@ pub fn bench_ifft_avx2_fma(c: &mut Criterion) {
|
||||
group.finish();
|
||||
}
|
||||
|
||||
#[cfg(not(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma")))]
|
||||
#[cfg(not(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
)))]
|
||||
fn bench_fft_avx2_fma(_c: &mut Criterion) {
|
||||
eprintln!("Skipping: AVX FFT benchmark requires x86_64 + AVX2 + FMA");
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma"))]
|
||||
#[cfg(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
))]
|
||||
pub fn bench_fft_avx2_fma(c: &mut Criterion) {
|
||||
use criterion::BenchmarkId;
|
||||
use poulpy_cpu_avx::ReimFFTAvx;
|
||||
@@ -68,10 +85,7 @@ pub fn bench_fft_avx2_fma(c: &mut Criterion) {
|
||||
let mut values: Vec<f64> = vec![0f64; m << 1];
|
||||
|
||||
let scale = 1.0f64 / (2 * m) as f64;
|
||||
values
|
||||
.iter_mut()
|
||||
.enumerate()
|
||||
.for_each(|(i, x)| *x = (i + 1) as f64 * scale);
|
||||
values.iter_mut().enumerate().for_each(|(i, x)| *x = (i + 1) as f64 * scale);
|
||||
|
||||
let table: ReimFFTTable<f64> = ReimFFTTable::<f64>::new(m);
|
||||
move || {
|
||||
|
||||
@@ -1,33 +1,63 @@
|
||||
use criterion::{Criterion, criterion_group, criterion_main};
|
||||
|
||||
#[cfg(not(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma")))]
|
||||
#[cfg(not(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
)))]
|
||||
fn bench_vec_znx_add_cpu_avx_fft64(_c: &mut Criterion) {
|
||||
eprintln!("Skipping: AVX IFft benchmark requires x86_64 + AVX2 + FMA");
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma"))]
|
||||
#[cfg(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
))]
|
||||
fn bench_vec_znx_add_cpu_avx_fft64(c: &mut Criterion) {
|
||||
use poulpy_cpu_avx::FFT64Avx;
|
||||
poulpy_hal::reference::vec_znx::bench_vec_znx_add::<FFT64Avx>(c, "FFT64Avx");
|
||||
}
|
||||
|
||||
#[cfg(not(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma")))]
|
||||
#[cfg(not(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
)))]
|
||||
fn bench_vec_znx_normalize_inplace_cpu_avx_fft64(_c: &mut Criterion) {
|
||||
eprintln!("Skipping: AVX IFft benchmark requires x86_64 + AVX2 + FMA");
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma"))]
|
||||
#[cfg(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
))]
|
||||
fn bench_vec_znx_normalize_inplace_cpu_avx_fft64(c: &mut Criterion) {
|
||||
use poulpy_cpu_avx::FFT64Avx;
|
||||
poulpy_hal::reference::vec_znx::bench_vec_znx_normalize_inplace::<FFT64Avx>(c, "FFT64Avx");
|
||||
}
|
||||
|
||||
#[cfg(not(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma")))]
|
||||
#[cfg(not(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
)))]
|
||||
fn bench_vec_znx_automorphism_cpu_avx_fft64(_c: &mut Criterion) {
|
||||
eprintln!("Skipping: AVX IFft benchmark requires x86_64 + AVX2 + FMA");
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma"))]
|
||||
#[cfg(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
))]
|
||||
fn bench_vec_znx_automorphism_cpu_avx_fft64(c: &mut Criterion) {
|
||||
use poulpy_cpu_avx::FFT64Avx;
|
||||
poulpy_hal::reference::vec_znx::bench_vec_znx_automorphism::<FFT64Avx>(c, "FFT64Avx");
|
||||
|
||||
@@ -1,11 +1,21 @@
|
||||
use criterion::{Criterion, criterion_group, criterion_main};
|
||||
|
||||
#[cfg(not(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma")))]
|
||||
#[cfg(not(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
)))]
|
||||
fn bench_vmp_apply_dft_to_dft_cpu_avx_fft64(_c: &mut Criterion) {
|
||||
eprintln!("Skipping: AVX IFft benchmark requires x86_64 + AVX2 + FMA");
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "enable-avx", target_arch = "x86_64", target_feature = "avx2", target_feature = "fma"))]
|
||||
#[cfg(all(
|
||||
feature = "enable-avx",
|
||||
target_arch = "x86_64",
|
||||
target_feature = "avx2",
|
||||
target_feature = "fma"
|
||||
))]
|
||||
fn bench_vmp_apply_dft_to_dft_cpu_avx_fft64(c: &mut Criterion) {
|
||||
use poulpy_cpu_avx::FFT64Avx;
|
||||
poulpy_hal::bench_suite::vmp::bench_vmp_apply_dft_to_dft::<FFT64Avx>(c, "FFT64Avx");
|
||||
|
||||
Reference in New Issue
Block a user