Files
poulpy/poulpy-cpu-avx
Jean-Philippe Bossuat 4e90e08a71 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
2025-12-21 16:56:42 +01:00
..
2025-11-21 16:38:19 +01:00

🐙 Poulpy-CPU-AVX

Poulpy-CPU-AVX is a Rust crate that provides an AVX2 + FMA accelerated CPU backend for Poulpy.

This backend implements the Poulpy HAL extension traits and can be used by:

🚩 Safety and Requirements

To avoid illegal hardware instructions (SIGILL) on unsupported CPUs, this backend is opt-in and only builds when explicitly requested.

Requirement Status
Cargo feature flag --features enable-avx must be enabled
CPU architecture x86_64
CPU target features AVX2 + FMA

If enable-avx is enabled but the target does not provide these capabilities, the build fails immediately with a clear error message, rather than generating invalid binaries.

When enable-avx is not enabled, this crate is simply skipped and Poulpy automatically falls back to the portable poulpy-cpu-ref backend. This ensure that Poulpy's workspace remains portable (e.g. for macOS ARM).

⚙️ Building with the AVX backend enabled

Because the compiler must generate AVX2 + FMA instructions, both the Cargo feature and CPU target flags must be specified:

RUSTFLAGS="-C target-feature=+avx2,+fma" \
cargo build --features enable-avx

Running an example

RUSTFLAGS="-C target-feature=+avx2,+fma" \
cargo run --example <name> --features enable-avx

Running benchmarks

RUSTFLAGS="-C target-feature=+avx2,+fma" \
cargo bench --features enable-avx

Basic Usage

use poulpy_backend_cpu_avx::FFT64Avx;
use poulpy_hal::{api::ModuleNew, layouts::Module};

let log_n: usize = 10;
let module = Module<FFT64Avx> = Module<FFT64Avx>::new(1<<log_n);

Once compiled with enable-avx, the backend is usable transparently anywhere Poulpy expects a backend type (poulpy-hal, poulpy-core, poulpy-schemes).

🤝 Contributors

To implement your own Poulpy backend (SIMD or accelerator):

  1. Define a backend struct
  2. Implement the open extension traits from poulpy-hal/oep
  3. Implement the Backend trait

Your backend will automatically integrate with:

  • poulpy-hal
  • poulpy-core
  • poulpy-schemes

No modifications to those crates are required — the HAL provides the extension points.


For questions or guidance, feel free to open an issue or discussion in the repository.