Next call
An open call every two weeks. Bring questions, show what you are building, or just listen in.
Poulpy news
Releases, office hours, events and projects built on the library. Everything announced elsewhere lands here first.
Subscribe by RSS →Archive
Every announcement, newest first. The same items go out on RSS and in the Telegram group.
A minimal HAL with full parity across backends, CKKS bootstrapping in 767 ms on an Apple M5 Pro, conjugate-invariant CKKS, multi-degree modules and multiparty HE.
This release completes the HAL/OEP cleanup: the generic layers describe what is
computed, and the backends decide how to compute it efficiently. poulpy-hal
is back to a minimal set of mathematical operations, each with a documented
contract. The scheme crates define every operation once, as a reference
composition of that set. A backend can override any of them with fused or
specialized kernels, and each override is parity-tested against its reference.
The new poulpy-cpu-oracle crate is the root of trust: independent scalar
backends. A backend validated against it becomes the reference for the
operations it passed, so validation chains from one backend to the next instead
of running every backend against the slow oracle: oracle → portable →
portable-rayon, then on to ARM, or to AVX2 → AVX-512 → AVX-512 IFMA on x86. The
result is full parity across
backends, down to CKKS encoding, which returns the same bytes on every backend
and target.
The backends are also faster. CKKS bootstrapping (S2C-first, N = 2^16, 16
levels restored at scale 2^35) runs in 4.29s on one thread and 1.66s on 16
threads with AVX-512 IFMA, about 30% faster than 0.8.3. The ARM
backend was reworked from the ground up and is 683% faster: 5.66s on one thread
and 767ms on 16 threads on an Apple M5 Pro.
CKKS gains the conjugate-invariant ring (N real slots) on every CPU backend,
and ciphertexts fold into a smaller degree for bootstrapping. A module of
degree N now serves every power-of-two degree up to N. The new poulpy-mhe
crate brings
multiparty HE: collective keys, collective key switching, and conversions
between ciphertexts and additive shares.
Sampling moves into poulpy-core behind a single Noise, and ciphertexts and
keys carry their noise metadata. poulpy-cpu-ref is now poulpy-cpu-portable,
and HAL methods drop their _backend and _into suffixes; the changelog lists
every breaking change.
Portable backends, multiparty setup, deterministic encoding, multi-ring and conjugate-invariant CKKS.
What we will go through this call: portable GPU, oracle and optimized backends, another round of backend optimizations, multiparty setup, deterministic CKKS encoding, multi-ring operations, and conjugate-invariant CKKS.
Open call — bring questions or something you are building.
What changed in the hardware abstraction layer since 0.8.3, and why the backend API got smaller.
Most of the work since 0.8.3 went into the hardware abstraction layer: a smaller API surface, explicit contracts, derived defaults, and a single-backend path through the OEP. Sparse operands and the hot-path rework came out of the same pass, along with the CKKS canonical scale and Windows support.
Bring questions, or something you are building — the second half of the call is open.
The encrypted RISC-V virtual machine that has run on Poulpy since an early build now has its own page on the site.
Phantom is as old as Poulpy. It has been running on the library since an early build, and its virtual machine still depends on the HAL, core, scheme operations and CPU backends.
It now has a page here explaining what it actually does: how a Rust program becomes an encrypted RISC-V binary, and what stays hidden while it executes — the instructions, the constants and the machine state, not just the inputs.
Multithreaded CPU backends bring CKKS bootstrapping to 2.3s on 16 threads, and poulpy.dev goes live.
The CPU backends are now multithreaded, and another optimization pass landed on top of it: CKKS bootstrapping runs in 2.3s on 16 threads and 5.5s on a single thread. Normalization was reworked, partial limbs are canonicalized in linear transforms, and functional bootstrapping now handles non-power-of-two inputs.
This release also ships the site you are reading, with the guides, the architecture walkthrough and a benchmark table you can filter by scheme, operation and backend.