SiliconScope
June 14, 2026 · View on GitHub
What SiliconScope shows and why. Derived from analysis of btop / NeoAsitop / iStat Menus plus the on-device-AI trend. All in-app labels are English (the names in the tables below are the actual UI labels).
0. Core insight — "where does an AI workload actually run?"
Tracing today's growing workloads makes the differentiator clear:
| Workload | Engine actually used | Bottleneck |
|---|---|---|
| Local LLM (llama.cpp / MLX / Ollama) | Metal GPU + unified memory (ANE not used) | memory bandwidth (esp. 27B+) |
| AI photo/video, Siri, classification (CoreML) | ANE (+ some GPU) | ANE throughput / power & heat |
| Large resident model | unified-memory capacity | memory pressure / swap |
Design principles
- Put GPU + memory bandwidth + memory pressure front and center — what LLM users actually care about.
- ANE is a "which engine is working" signal — for an LLM only the GPU lights up while ANE stays idle; a CoreML app lights up ANE. That contrast is the insight.
- Thermals/throttle + sustained power — AI is a sustained load, so throttling governs real performance.
- Because memory is unified, surface wired memory (Metal/GPU allocations) separately.
⚠️ ANE "utilization" is a power-based estimate (Apple exposes no true figure). Labelled
est.in the UI.
1. Tool comparison — what each surfaces
| Item | btop | NeoAsitop | iStat Menus | SiliconScope |
|---|---|---|---|---|
| Per-core CPU | ✓ | ✗ (E/P aggregate only) | ✓ | ✓ |
| E/P core split | ✗ | ✓ | ✓ (freq) | ✓✓ core feature |
| GPU usage/freq | Linux only | ✓ | ✓ | ✓ |
| ANE | ✗ | ✓ | ✗ | ✓ differentiator |
| Memory bandwidth | ✗ | ✓ (E/P/GPU/Media) | ✗ | ✓✓ differentiator |
| Memory pressure | ✗ | ✗ | ✓ | ✓ |
| Wired/compressed/swap | swap only | ✗ | ✓ | ✓ |
| Power (per domain) | ✗ | ✓ (CPU/GPU/sys/RAM) | ✓ | ✓ |
| Thermal / throttle | temp | ✗ | sensors | ✓ |
| Fans | limited | ✓ | ✓✓ | ✓ |
| Processes (top/tree/kill) | ✓✓ | ✗ | top apps | ✓ |
| Disk / Network | ✓ | ✗ | ✓✓ | ✓ |
| Battery | basic | ✗ | ✓✓ | ✓ |
| Alerts | ✗ | ✗ | ✓ | ✓✓ (bottleneck classifier, GPU throttle, memory pressure) |
Read: NeoAsitop = strong chip metrics (plain UI) / iStat = broad (weak on AI; no ANE/bandwidth) / btop = strong processes & UX (thin on Apple Silicon). → SiliconScope = NeoAsitop's chip metrics + iStat's memory-pressure/thermal breadth + btop's process/UX, plus an AI-workload lens.
2. Information set
All data sources are sudoless (see ioreport-channels.md).
Apple Silicon / AI signature (the differentiators)
| In-app label | Content | Source |
|---|---|---|
E-cores / P-cores | per-cluster usage % + frequency | host_processor_info (usage) + IOReport CPU Stats × DVFS (freq) |
GPU | usage %, frequency, power | IOReport GPU Stats + Energy Model |
ANE (est.) | power-based activity + "engine in use" hint | IOReport Energy Model |
Memory Bandwidth | CPU / GPU / Media / total GB/s | IOReport AMC Stats |
Memory pressure | normal / elevated / critical + wired/compressed/swap | host_statistics64 + sysctl |
Power | CPU / GPU / ANE / DRAM / SoC W | IOReport Energy Model |
Thermal | thermal pressure, fans, die temps | ProcessInfo + SMC |
Core system (parity)
| In-app label | Content | Source |
|---|---|---|
Memory | wired / active / compressed / free, swap | vm_statistics64 |
Temperatures | grouped CPU / GPU / Memory / Battery °C | SMC |
Fans | RPM (fanless models handled) | SMC |
Network | download / upload | getifaddrs |
Disk | read / write + capacity | IOBlockStorageDriver + volume capacity |
Processes | top by CPU/MEM, filter, kill/signal | libproc |
Battery | %, charging state | IOPowerSources |
Later / stretch
| Item | Note |
|---|---|
| Per-app network/disk breakdown | private NetworkStatistics — harder |
| Per-process GPU/ANE attribution | ⚠️ not reliably possible sudoless — deferred |
| History logging, configurable alerts | nice-to-have |
3. "AI Workload" view (shipped)
A curated hero card that answers "where does my AI workload run, and what limits it right now?" at a glance. A single bottleneck classifier verdict drives it:
┌─ AI Workload ─────────────────────────────────────────────────┐
│ ● Bandwidth-bound Memory BW near ceiling, GPU not maxed │
│ Mem BW % of ceiling ████████░░ 78% · 312 / 400 GB/s · M3 Max │
│ GPU 64% · GPU/Metal (LLM-style) │
└────────────────────────────────────────────────────────────────┘
- Verdict (precedence: memory > thermal > workload profile):
- Memory-pressured — unified memory full (macOS pressure critical).
- Thermal-throttled — GPU clock held below its rolling peak while pressure rises.
- Bandwidth-bound — BW near the chip ceiling, GPU not maxed (LLM token generation).
- Compute-bound — GPU saturated, BW has headroom (prompt processing).
- GPU-active / Idle — otherwise.
- "% of ceiling" uses a per-chip unified-memory-bandwidth table (M1–M4, Max bins split by P-core count), raised to the observed peak so it self-corrects and still works on chips not in the table.
- Likely engine: GPU high / ANE low →
GPU/Metal (LLM-style); ANE high →ANE (CoreML-style).
This interpretation layer — not the raw numbers — is what sets SiliconScope apart from general-purpose monitors.