Skip to content

Vulkan: GPU firmware crashes on Imagination PowerVR C-series (Pixel 11 Pro, Tensor G6, subgroupSize 128) #28214

Description

@JulianPscheid

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 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.

Ruled out, all measured on the device

  • llama.cpp version: b10621 and b10731 (the latter includes vulkan: warptiles currently assume warp sizes <= 64, clamp to work around larger warps #27726's warptile clamp for subgroup > 64).
  • 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.

Related

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions