# Stage 8 — Apple GPU batch

Verdict on this Mac: **PASS** for the calls below. No-device: **NOT OBSERVED**. Linux GPU: **NOT RUN**. NVIDIA: **NOT RUN**.

`experiments/gpu/gpu_nif.mojo` and `experiments/gpu/add_host.mojo` are unchanged. `scripts/gpu-batch.sh` rebuilds the historical library, builds `experiments/gpu/batch_nif.mojo`, and loads both.

E25: `gpu_nif 42`. The batch kernel adds four float32 pairs, `(1,10)`, `(2,20)`, `(3,30)`, `(4,40)`, and the NIF returns the integer sum `110`. A second call returned 110. Two concurrent tasks returned `[110, 110]` (`inspect` printed the charlist `~c"nn"` before the script asked for `charlists: :as_lists`).

The batch callback calls `initialize_runtime()` and is registered with `abi_dirty_cpu()`, because the host waits on `ctx.synchronize()`. That flag is a choice from the Stage 4 constants, not a measurement that the GPU driver yields the scheduler for the whole wait.

If `has_accelerator()` is false, `batch_sum` raises and the callback returns `{:error, :no_device}`. This machine took the device path, so that tuple was not seen. A CPU sum is not substituted.

MAX is pinned in `requirements-gpu.txt` (`max==26.6.0`). `requirements.txt` stays `mojo==1.1.0` only. The Linux workflow does not install MAX.
