You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
On a Google Pixel 11 Pro (Imagination PowerVR C-Series CXTP-48-1536 MC1, VK_DRIVER_ID_IMAGINATION_PROPRIETARY, Vulkan 1.4.317, subgroupSize=128, maxComputeWorkGroupInvocations=1024, maxComputeSharedMemorySize=32768), the Vulkan backend crashes the GPU firmware during prompt processing.
Every compute pipeline compiles. The first 128-token batch returns from llama_decode. About 9 seconds after the context is created, Android logs a PowerVR subsystem restart, the compositor wedges, and the device usually reboots. No tokens are produced.
The same app and models work on a Pixel 8 Pro (ARM Mali/Immortalis).
I don't expect a fix in llama.cpp; the fault is almost certainly in Imagination's driver. This is filed so the next person who tries Vulkan on a Tensor G6 finds it, and in case the subgroup-128 detail suggests a workaround to someone who knows the backend.
Android's GPU crash record
adb shell dumpsys dropbox --print | grep -A12 SubsystemRestart gives a per-crash reason. Across builds:
llama.cpp
flash attn
submissions
OS build
crash reason
b10621
on
default
2026-07
GUILTY_OVERRUNING
b10731
on
default
2026-07
[0]:[addr=0x8056288700]:[FW_PAGEFAULT]
b10731
off
default
2026-07
[0]:[addr=0x805730fd80]:[FW_PAGEFAULT]
b10731
on
serialised
2026-07 and 2026-09
GUILTY_OVERRUNING
b10731
on
default
2026-09
[0]:[addr=0x8047852d80]:[FW_PAGEFAULT]
GUILTY_OVERRUNING reads as a job that never terminated and hit the GPU watchdog. FW_PAGEFAULT reads as an MMU fault on an unmapped GPU address. The fault address is stable within a process (allocations move between runs), so the access is deterministic rather than a race.
b10621 -> b10731 changed the failure class but fixed nothing.
Flash attention: LLAMA_FLASH_ATTN_TYPE_DISABLED for this vendor. No change.
Submission structure: GGML_VK_SERIALIZE_SUBMISSIONS=1. No change except the crash class. Since every submit then waits for completion, this also shows that the first 128-token chunk finishes on the GPU and a later one faults. It is not a cross-submission race.
Memory: reproduced on a fresh boot with 14 GB available and zero swap.
Model architecture: a hybrid model (Qwen 3.5 2B, gated delta net + SSM) and a plain transformer (Gemma 4 E2B) fail identically.
Quantisation: Q4_0 crashes exactly like Q4_K_M and UD-Q4_K_XL. This matters because a user on Imagination's own forum found that on the Pixel 10's D-series DXT-48-1536, k-quant compute shaders return wrong results while Q4_0, Q5_0, Q8_0, F16 and F32 are correct (https://forums.imgtec.com/t/powervr-dxt-48-1536-incorrect-results-from-k-quant-vulkan-compute-shaders-in-llama-cpp/4291). That is a different bug. The D-series computes wrong answers; the C-series crashes its firmware.
Driver: the September 2026 Pixel OTA (CD1A.260905.001.A1, new vendor image) behaves identically. The driver still reports 1.4.317.
Configuration
Vulkan only, all layers offloaded, n_batch=128, n_ctx=7168-7424, prompt of about 2,850 to 3,000 tokens, type_k and type_v left at F16.
So far only reproduced from an app embedding libllama, not from llama-bench. I can run a standalone repro on the device if someone suggests the exact invocation. Each attempt costs a reboot.
Summary
On a Google Pixel 11 Pro (Imagination PowerVR C-Series CXTP-48-1536 MC1,
VK_DRIVER_ID_IMAGINATION_PROPRIETARY, Vulkan 1.4.317,subgroupSize=128,maxComputeWorkGroupInvocations=1024,maxComputeSharedMemorySize=32768), the Vulkan backend crashes the GPU firmware during prompt processing.Every compute pipeline compiles. The first 128-token batch returns from
llama_decode. About 9 seconds after the context is created, Android logs a PowerVR subsystem restart, the compositor wedges, and the device usually reboots. No tokens are produced.The same app and models work on a Pixel 8 Pro (ARM Mali/Immortalis).
I don't expect a fix in llama.cpp; the fault is almost certainly in Imagination's driver. This is filed so the next person who tries Vulkan on a Tensor G6 finds it, and in case the subgroup-128 detail suggests a workaround to someone who knows the backend.
Android's GPU crash record
adb shell dumpsys dropbox --print | grep -A12 SubsystemRestartgives a per-crash reason. Across builds:GUILTY_OVERRUNING[0]:[addr=0x8056288700]:[FW_PAGEFAULT][0]:[addr=0x805730fd80]:[FW_PAGEFAULT]GUILTY_OVERRUNING[0]:[addr=0x8047852d80]:[FW_PAGEFAULT]GUILTY_OVERRUNINGreads as a job that never terminated and hit the GPU watchdog.FW_PAGEFAULTreads as an MMU fault on an unmapped GPU address. The fault address is stable within a process (allocations move between runs), so the access is deterministic rather than a race.b10621 -> b10731changed the failure class but fixed nothing.Ruled out, all measured on the device
LLAMA_FLASH_ATTN_TYPE_DISABLEDfor this vendor. No change.GGML_VK_SERIALIZE_SUBMISSIONS=1. No change except the crash class. Since every submit then waits for completion, this also shows that the first 128-token chunk finishes on the GPU and a later one faults. It is not a cross-submission race.Q4_0crashes exactly likeQ4_K_MandUD-Q4_K_XL. This matters because a user on Imagination's own forum found that on the Pixel 10's D-series DXT-48-1536, k-quant compute shaders return wrong results whileQ4_0,Q5_0,Q8_0,F16andF32are correct (https://forums.imgtec.com/t/powervr-dxt-48-1536-incorrect-results-from-k-quant-vulkan-compute-shaders-in-llama-cpp/4291). That is a different bug. The D-series computes wrong answers; the C-series crashes its firmware.CD1A.260905.001.A1, new vendor image) behaves identically. The driver still reports 1.4.317.Configuration
Vulkan only, all layers offloaded,
n_batch=128,n_ctx=7168-7424, prompt of about 2,850 to 3,000 tokens,type_kandtype_vleft at F16.Related
WM <= BMinvariant violated for subgroupSize > 64) #25734: AdrenosubgroupSize=128, wrong matmul results, fixed by vulkan: warptiles currently assume warp sizes <= 64, clamp to work around larger warps #27726.Repro
So far only reproduced from an app embedding libllama, not from
llama-bench. I can run a standalone repro on the device if someone suggests the exact invocation. Each attempt costs a reboot.