- [ ] Verify full GPU offload (`--gpu-layers all` or `-ngl <total_layers>`). Partial offload forces CPU-GPU sync stalls during prefill.
- [ ] Reduce `--batch` and `--ctx-size`. Prefill is memory-bandwidth bound; large contexts/batches saturate VRAM bandwidth and throttle prefill.
- [ ] Confirm correct backend build. Ensure compiled with `-DGGML_CUDA=ON` (or Metal/Vulkan). Fallback to CPU or unoptimized kernels kills prefill throughput.
- [ ] Update to latest `llama.cpp` & GGUF. Newer releases include fused prefill kernels and fixed KV cache allocation logic.
- [ ] Check VRAM utilization & paging. If >90% used, prefill stalls due to cache thrashing or swap. Lower `--ctx-size` or switch to higher quantization.
- [ ] Set `--parallel 1`. Multi-parallel on a single GPU causes thread contention without compute headroom.
- [ ] Disable server overhead. Use `--log-disable` or `--log-level warn`. JSON serialization, prompt caching, or verbose logging add measurable prefill latency.
- [ ] Test with a short prompt. If prefill normalizes, the bottleneck is context-window scaling (expected memory-bandwidth limit on single GPU).
- [ ] Profile with `--log-level debug`. Look for `CPU sync wait`, `KV cache reallocation`, or `backend fallback` warnings that indicate misconfiguration.

*Note: Prefill being slower than decode is normal on single GPUs due to memory-bound vs compute-bound phases. This checklist targets configuration/build bottlenecks that exacerbate the gap.*