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.

Investigate memory problem while running unit tests linked with Emscripten

2 participants