[2.0.0]
The headline: universal Arm support via runtime CPU backend dispatch. ENTITY previously shipped a single CPU backend compiled for one known SoC. v2.0.0 ships 7 Arm CPU backend variants (armv8.0, armv8.2×2, armv8.6, armv9.0, armv9.2×2, each with KleidiAI kernels) and dynamically loads the best one the phone's CPU supports at startup — so the app now runs on essentially any Arm Android phone without crashing on older cores or missing faster kernels on new ones. A new first-run "Optimize for your device" dialog detects the loaded backend's ISA features (e.g. i8mm, dotprod, SVE) and suggests Auto mode. The big-core affinity optimization is unchanged and was already SoC-agnostic.
A power measurement bug was fixed: many OEM kernels report BATTERY_PROPERTY_CURRENT_NOW in
milliamps instead of the documented microamps, causing 1000× underreporting on affected devices; a
new PowerMath helper uses physical plausibility instead of trusting the unit. This fix is confirmed
on hardware via cross-device validation.
Cross-vendor measurement: the core optimization was independently validated on a second device (Qualcomm Snapdragon 6 Gen 4) using the same model and protocol as the reference device. Reference device (MediaTek Dimensity 7300): 8.0 → 17.7 tok/s (+121%), 1.7 → 4.2 tok/W (2.5×). Second device (Snapdragon 6 Gen 4): 6.0 → 13.1 tok/s (+117%), 1.8 → 3.8 tok/W (2.1×). The core optimization reproduces across vendors without vendor-specific code.
The in-app benchmark now measures ENTITY's shipped Auto configuration (split thread pools for prompt/decode) instead of an explicit 4-thread test, so the result accurately reflects what users get. UI strings are now SoC-neutral and report detected core counts and ISA features at runtime instead of hardcoding Cortex-A78 names. Eight new unit tests cover device detection and power-unit resolution.
Added
- Runtime CPU backend dispatch — 7 Arm variants with automatic selection at startup via
ggml_backend_load_all_from_path+ scoring. No UI toggle, no config — just works. - First-run "Optimize for your device" dialog — detects perf/efficiency-core counts, ISA features (i8mm, dotprod, SVE2, etc.) from the loaded backend, suggests Auto mode. "Not now" to dismiss; can be re-run from Settings.
- SoC-neutral model-info string — reports actually-detected core counts and ISA features, not hardcoded Cortex-A78 names; works on MediaTek, Qualcomm, Samsung, etc.
PowerMathhelper — resolvesBATTERY_PROPERTY_CURRENT_NOWunit (microamps vs milliamps) by physical plausibility instead of trusting the documented unit; fixes 1000× underreporting on affected OEM kernels (Qualcomm especially).- Unit tests —
app/src/test/java/com/example/llama/DeviceOptimizerTest.kt: 8 JUnit4 tests covering backend feature detection, core ranking, and device optimization; plus 6 tests forPowerMathTest.ktcovering unit resolution and boundary cases.
Changed
- In-app benchmark measures the shipped configuration — now runs Auto mode with split thread pools (generation on big cores, prompt processing on all cores) instead of an explicit 4-thread config. The naive control (8 threads, all cores) unchanged; protocol (PP 512 / TG 128) unchanged.
Fixed
- Power readout was 1000× wrong on some devices — OEM milliamp/microamp confusion now resolved via plausibility, not trust-the-unit. Affects only power/efficiency display, not tok/s measurements.
- Power graph received garbage on unsupported devices —
getIntPropertysentinel value was feeding bad data; now guarded.
Log in or sign up for Devpost to join the conversation.