A driver stack, measured on a 6-vCPU ARM VM
softgpu is a software model of a GPU. The device is threads and memcpy on a 1 GHz clock. The stack above it is the real subject: rings, fences, interrupts, a page table, a runlist, and the user/kernel boundary those things sit on.
Each one started from a number in the previous record. The stage ids follow the design notes, which is why 7 landed before 5.
One 64-byte fill after a quiet gap. spin keeps both engines hot. sleep gates immediately and pays the wake on every command. Hybrid 50 µs is the default: gaps inside the budget are free, and a quiet device drops to a few hundredths of a core.
Latency of the command that breaks the gap. Log scale. A 10 µs budget gates on the 30 µs row. 50 µs and 200 µs both wait until 300 µs; the longer budget does not make that command faster. Source: gate-spin.json, gated.json, gate-sleep.json, vm7-idle10k.json, vm7-idle200k.json.
Both engines together. 2.0 is the bill this project paid from stage 0 until stage 7, without printing it.
All of these are from the VM, canary-gated, best pass per row. The fast cluster itself drifted from about 208 ns to about 375 ns across the project, so a later round trip is not automatically a regression.
| Stage | GB/s |
|---|---|
| 3a pinned | 65.6 |
| 4 no global lock | 52.0 |
| 7 idle gating | 39.5 |
| 5 virtual memory | 9.0 |
| Mode | MB/s | µs/page |
|---|---|---|
| Prefetch on | 469 | 8.7 |
| Prefetch off | 29 | 140 |
| Engines spinning | 883 | 4.6 |
| Run | First probe | Pair GB/s | Preempts / op |
|---|---|---|---|
| No timeslice, equal priority | 210 µs | 39.2 | 0 |
| 50 µs slice, equal | 78 µs | 39.2 | 0.09 |
| 5 µs slice, equal pair | 2.7 µs | 24.9 | 0.94 |
| Priority, no slice | 28 µs | — | 0.10 |