Skip to content
sysout.dev

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.