4.5 KiB
P14 perf pass: handoff (closed 2026-10-07)
The pass is closed at 781a7446, plus this docs commit. Results are in BENCH.md and
README.md. The next phase is the per-(VAO, program) draw-packet cache
(NEXT-draw-packet-cache.md). Its first item is an off-CPU profile of
FCL Magma monolith (README "Headline numbers").
Where things stand (rd12, pinned, FINISH=false, best of 3)
| arm | Espryt | Magma | dev Espryt / Magma |
|---|---|---|---|
| monolith | 91.1 | 83.8 | 115.2 / 87.0 |
| inproc | 111.9 | 110.0 | |
| shm | 87.8 | 95.6 | |
| tcp | 68.7 | 69.9 |
FCL MC in world:
- dev: Espryt 228.6, Magma 231.8;
- feat monolith: Espryt 198.3, Magma 171.4;
- feat inproc: Espryt 241.5, Magma 194.8.
All arms are CPU-bound (GPU 19-39 %).
Open items (DEBTS.md has the rows)
- FCL Magma monolith waits about 3 ms/frame. The trace does not show it. Profile it off-CPU first. Both close-out attempts caught no game frames, because FCL start-up ran past the 60 s warm-up.
- The draw-packet cache (design sketch). Prototype the client half on Espryt monolith first.
- The Espryt driver +0.33 ms is a cache-pressure inference. Check it with L1D refills before and after (2).
- Native TLS, minSdk 29 vs 26, is the user's call: +1.7 % Espryt, noise on Magma.
Harness
Session scratchpad scripts:
build_trace.sh W:/perf .p14X: trace APK, packagetop.mobilegl.plugin.p14X.trace.sign_install.sh <apk> <name>.devjob.sh <log> <cmd>: runs a device job under a mkdir lock. Always use it; two concurrent device jobs contaminate each other, and killing a job leaves its children running.incl.py/children.py/lines.py/layers2.py/drvcall.py/offcpu.py: simpleperf analyses. The tail window comes from the render thread'sretraceCallsamples.profile_offcpu.sh:--trace-offcpuvariant ofprofile_p14.sh.stat_p14.sh:simpleperf statcounters.fcl_offcpu.sh: FCL profile plus restore.
Then:
cd tools/device_bench/disagg
FIXTURES=<main checkout>/tools/trace_replay/fixtures PREP_PKGS=top.mobilegl.plugin.p14X.trace bash matrix_p14.sh prep
ARMS="monolith@p14a monolith@p14b" BACKENDS="DirectGLES DirectVulkan" WLS=rd12 REPS=3 TAG=ab bash matrix_p14.sh run
python p14_report.py ../../../.trace-work/perf-p14/ab
ARMS="monolith@p14X inproc@p14X shm@p14X tcp@p14X" REPS=1 TAG=ssim bash matrix_p14.sh ssim # SSIM gate
ARM=monolith BACKEND=DirectGLES WL=rd12 TAG=prof PKG_FEAT=... SYMDIR=<unstripped libs> bash profile_p14.sh
The FCL library comes from :app:assemblePluginRelease. Unzip lib/arm64-v8a/libMobileGL.so from
app/build/outputs/apk/plugin/release/; the unstripped copy is under
intermediates/merged_native_libs/pluginRelease. Run fcl_p14.sh run, then restore
(md5-checked).
Gradle's packageTraceRelease sometimes fails on the first try with
IncrementalSplitterRunnable; a rerun succeeds.
Host:
- Unit tests: WSL archlinux
~/mgl-perf-bld(clang, split + inproc).- ServerSpawnTest, FuzzArm2 and PeerLatchTest fail there with
Refuse{BuildFingerprint}; that is environmental. - The google-benchmark targets don't build with clang 22; also environmental.
- ServerSpawnTest, FuzzArm2 and PeerLatchTest fail there with
- CI-shaped integration tree:
~/mgl-perf-ci31, configured with CMake 3.31.10 from the~/mgl-perf-toolsvenv.- The system CMake 4.x joins
gtest_discover_testsENVIRONMENT lists into one variable, and every entry then skips. Use 3.31.10. - lavapipe ICD; spawn/tcp lanes are environmental there.
- To run the syncval gates:
scripts/ci/magma_runahead_checks.py validation --build-dir ~/mgl-perf-ci31 --execute, withGIT_DIR=.../.git/modules/MobileGL/worktrees/perfset for the cache script.
- The system CMake 4.x joins
~/mgl-perf-ciis a CMake 4 tree. Use it only through the scratchpad'srunentry.sh, which splits the joined environment.
Device state
- HA27Q3LQ CPU/GPU clocks are still PINNED: the next phase wants them pinned.
bash pin_clocks.sh restoreundoes it; ask before unpinning. - FCL is restored: lib md5 matches
/data/local/tmp/p14-fcl-orig.so, config.json matches its saved copy, and thedebug.mobilegl.*properties are deleted. - Trace APKs
top.mobilegl.plugin.p14*.traceare installed;p14finis the close-out build.
CI
Dispatched runs (workflow_dispatch, not cancelled by later pushes):
86ab2835: Test 37702990844, APK 37702995519.781a7446: Test 37707221661.- The close-out docs head: see the final report.
There is only one self-hosted GPU runner (minipc-8845-arch-wsl-gpu), so GPU jobs queue behind it.