Skip to content

fix: close issue #249 — Emscripten OOM in CKKS unit tests#1215

Open
BAder82t wants to merge 2 commits into
devfrom
249-fix-emscripten-oom
Open

fix: close issue #249 — Emscripten OOM in CKKS unit tests#1215
BAder82t wants to merge 2 commits into
devfrom
249-fix-emscripten-oom

Conversation

@BAder82t

@BAder82t BAder82t commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

Closes #249. Resubmission of #1208 / #1214 from an org branch as requested.

PR #1179 added the cache-clear helpers but didn't wire them into ReleaseAllContexts. This wires the walk in, makes the per-context clears noexcept-safe, and re-enables the 16 rows previously guarded under !__EMSCRIPTEN__ (EVAL_FAST_ROTATION_41–48, CONTEXT_WITH_SERTYPE_01–08).

UTCKKSCacheClear extends its existing WITH_TCM skip to __EMSCRIPTEN__ — its heap probes rely on mallinfo2. New emscripten.yml runs emsdk 3.1.59 + node slices so this can't go silent again.

No hot-path file is touched.

Validated locally

  • Native (clang, MB4): pke_tests 1892/1892, core_tests 158/158
  • WASM (emsdk 3.1.59, node 22, NATIVE_SIZE=64): the 16 re-enabled rows pass; CKKS slice 939/941 (2 heap-probe skips), BFV+BGV+binfhe 324/324; peak ~1.6 GB / 4 GB cap

BAder82t and others added 2 commits July 8, 2026 14:21
PR #1179 added ClearBootstrapPrecom and ClearSchemeSwitchPrecom helpers
but did not wire them into ReleaseAllContexts. This change completes
that work, then re-enables the EVAL_FAST_ROTATION and CONTEXT_WITH_SERTYPE
tests that PR #985 had to guard under !defined(__EMSCRIPTEN__) for the
original std::bad_alloc failure.

Library changes (no hot-path touched):
- ReleaseAllContexts now walks every live context and calls
  ClearAllCKKSCaches before clearing the static maps.
- Adds malloc_zone_pressure_relief(Apple) and _heapmin(MSVC) to AllocTrim.
- Add ClearAllCKKSCaches convenience on CryptoContextImpl.
- ClearBootstrapPrecom and ClearSchemeSwitchPrecom bodies made
  noexcept-safe so the walk does not throw on contexts that have not
  Enable(FHE)'d or Enable(SCHEMESWITCH)'d.

Test changes:
- Mid-test ClearAllCKKSCaches between JSON and BINARY rounds in
  UnitTestCKKSrnsSerialize.
- UTCKKSCacheClear extends its WITH_TCM skip to __EMSCRIPTEN__ (the
  heap-probe helper has no emmalloc backend).
- Remove the !defined(__EMSCRIPTEN__) guards around the affected rows.

CI:
- Add .github/workflows/emscripten.yml: builds with emsdk 3.1.59 and
  runs pke_tests/core_tests under node in two slices.

Validated on macOS + WASM:
- Native: pke_tests 1892/1892 pass, core_tests 158/158 pass.
- WASM:   CKKS slice 939/941 pass (2 heap-probe tests skipped),
          BFV+BGV+binfhe slice 324/324 pass, peak 1.6 GB.

Closes #249.
Make the process-wide allocator tuning introduced in #1213 opt-out via a
new build flag, since it changes malloc policy for the whole host
application (freed memory is retained in-process, raising resident set
size for workloads with large transient peaks).

- Gate the glibc mallopt(M_MMAP_MAX=0, M_TRIM_THRESHOLD=-1) startup
  tuning behind WITH_MALLOC_TUNING and propagate the flag through
  config_core.h; build with -DWITH_MALLOC_TUNING=OFF to disable.
- Document per-platform behavior in explicit branches: macOS libmalloc
  already retains freed memory (madvise-reusable pages plus the large
  cache), and the Windows process heap exposes no retention knob.
- Rewrite the __APPLE__ branch of AllocTrim() to use the supported
  malloc_zone_pressure_relief(NULL, 0) all-zones call instead of the
  malloc_get_all_zones()/mach introspection API, dropping <mach/mach.h>.
- Docs: add the new flag and the previously undocumented options
  (GIT_SUBMOD_AUTO, WITH_COVTEST, WITH_NOISE_DEBUG, WITH_REDUCED_NOISE,
  USE_MACPORTS) to the CMake flags table, and fix stale defaults
  (WITH_BE2 is OFF; the default math backend is 4, not 2).
@pascoec pascoec force-pushed the 249-fix-emscripten-oom branch from c1e92af to 92b3837 Compare July 8, 2026 20:07
@pascoec

pascoec commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator

-Rebased and addressed conflicts introduced by #1213
-Removed ReleaseAllContextsAndTrim as ReleaseAllContexts now trims
-Rewrote APPLE branch of AllocTrim() to use supported malloc_zone_pressure_relief(NULL, 0) all-zones call instead of the malloc_get_all_zones()/mach introspection API, dropping <mach/mach.h>
-Added WITH_MALLOC_TUNING CMake option (default ON)
-Updated documentation

Did not verify the Emscripten changes. Will wait for @dsuponitskiy to review and approve/deny the proposed ci changes.

@pascoec pascoec requested review from dsuponitskiy and pascoec and removed request for pascoec July 8, 2026 20:30
@pascoec pascoec self-assigned this Jul 8, 2026
@pascoec pascoec added documentation Improvements or additions to documentation ci/cd new feature New feature or request labels Jul 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd documentation Improvements or additions to documentation new feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants