OpenMP experiment: archived 2026-11-03
Decision
Keep GGML’s existing multithreaded worker pool. Remove the app-owned OpenMP
module, native selector, and paired comparison UI from the maintained app.
Retain the foreground saved-WAV worker-pool benchmark with cold and warm passes.
Leave the vendored Whisper/GGML sources unchanged, including their upstream
OpenMP support; the app build explicitly sets GGML_OPENMP=OFF.
The complete pre-removal source snapshot is retained on the local Git branch
archive/openmp-experiment-20261103. It includes the foreground benchmark and
other in-progress source changes as dependencies of the experiment. It excludes
recordings, transcripts, databases, APKs, logs, and screenshot attachments.
This branch is an experiment archive, not a release or a claim that all
in-progress changes have passed release acceptance. Nothing has been pushed.
User measurements
Motorola Edge 50 Fusion, small.en, same saved WAV and thread count for both
backends within each comparison. Cold creates and loads a fresh model context;
warm reuses it. Cold does not mean an empty operating-system file cache.
Times below are seconds copied from the user’s screenshots. Percentages are
the app’s reported warm-pass differences, calculated before display rounding.
| Recording | Threads | First | Worker cold / warm | OpenMP cold / warm | OpenMP warm |
|---|---|---|---|---|---|
GA automation test stack alignment (478.3 s) |
4 |
Worker |
690.3 / 741.9 |
874.9 / 748.8 |
0.9% more time |
Generating app design tokens (57.8 s), trial 1 |
4 |
OpenMP |
70.2 / 70.5 |
72.3 / 77.7 |
10.2% more time |
Same 57.8 s clip, trial 2 |
4 |
Worker |
73.6 / 81.0 |
85.4 / 92.6 |
14.2% more time |
Same 57.8 s clip |
6 |
OpenMP |
83.0 / 79.8 |
122.6 / 123.2 |
54.3% more time |
All four transcripts matched within each comparison. The short clip’s displayed
SHA-256 prefix was 62bb36d26659; the longer clip’s was 6799ef74eef4.
Battery fell below 20% during the longer comparison. The user allowed no cooling gap between the two short four-thread comparisons. Each comparison performs four inference passes, so even a short source clip keeps the CPU busy for several minutes. Temperature, CPU frequency, and energy were not captured. These conditions limit attribution of the timing differences; they do not establish that OpenMP is slower on every device or future Whisper version. Nevertheless, OpenMP provided no measured benefit in these representative runs and lost in both backend orders at four threads. Its maintenance cost is not justified for the current app. These runs do not establish an optimal production thread count.
Archived implementation and validation
The debug-only whisperOpenMpNative module built the same vendored sources in a
separate CMake invocation with static GGML/OpenMP, hidden project symbols,
symbolic binding, distinct shared-library names, and a separate JNI namespace.
Both backends used the same pinned NDK and shared C++ runtime. The comparison
verified native system-info strings, alternated backend order, and ran one cold
and one warm pass per backend. Normal and release transcription used the worker
pool throughout.
Before removal, all three supported ABIs built, native export/dependency checks passed, 14 JVM tests passed, lint reported zero errors, and three opt-in device checks passed (native scheduler isolation, foreground lifecycle/data preservation, and failure cleanup). A one-second synthetic smoke was for lifecycle validation, not a meaningful performance or accuracy benchmark. Saved audio hashes and recording/session/version contents were unchanged during that validation.
Revisit the archived backend only when a new device, upstream change, or measured worker-pool limitation supplies a concrete hypothesis to test. Preserve the foreground lifecycle and data-preservation checks if restoring the experiment.
Removal validation
On 2026-11-03 the worker-pool-only debug app and Android test APK built, all
14 JVM tests passed, and lint reported zero errors (31 warnings). Native builds
passed for arm64-v8a, armeabi-v7a, and x86_64; all three CMake caches reported
GGML_OPENMP=OFF. APK inspection found no OpenMP shared libraries or alternate
JNI class.
The debug app was updated in place on the Motorola Edge 50 Fusion. Three opt-in
device checks passed in 62.027 seconds: native worker-pool identity, cold/warm
foreground completion with normal-queue handoff and saved-data preservation,
and missing-audio failure cleanup. Foreground ownership and the scoped partial
wake lock were also observed during inference. Only a new one-second synthetic
fixture was transcribed. Host-side before/after backups confirmed all 75 saved
WAVs, 14 recording rows, one session row, 56 transcript-version rows, and the
previous benchmark preferences unchanged; SQLite integrity was ok. The updated
debug app cold-launched successfully. The production app was not updated.