返回首頁

推論系統

llama.cpp 改寫 Adreno 矩陣乘法路由,兩代晶片的提示預填加速 9% 至 25%

llama.cpp b10687 針對 Snapdragon X2 與較舊 A7X GPU,避開 OpenCL 編譯器選中的低效矩陣乘法路徑。維護者測得 gpt-oss-20b 與 Gemma 3n 的提示預填分別加速約 20% 至 25% 及 9%,但逐 token 解碼並未變快。

The GGML authors · Public domain · Image source
zh-Hant

llama.cpp 在 8 月 29 日合併 Qualcomm 貢獻的 OpenCL 路由修正,重點不是加入新核心,而是讓兩代 Adreno GPU 預設選到已有的較快實作。Snapdragon X2 Elite 的 Adreno X2-90 原本會以 `kernel_mul_mm_f16_f32_l4_lm` 處理 F16 權重與 F32 activation;在標準 gpt-oss-20b 上,這個核心執行 attention projection 的速度僅約同機最佳化 Q4_0 GEMM 的四分之一,並佔去 40.8% 預填 GPU 時間。新版因此在 X2E 預設啟用 xmem F16×F32 路徑,維護者在不同摘要中報告約 20% 至 25% 的 prefill 增益。

另一項修改處理 Adreno A7X 的 OpenCL 編譯問題。舊版 register allocator 讓 tiled F32 GEMM 每個 work item 使用 488 bytes 私有記憶體,相較下一代的 304 bytes 出現更多 K-loop spill,速度只及同晶片 F16、Q4_K 核心約十分之一。對批次寬度大於八的 F32×F32 運算,新路由改用逐列核心,使 Adreno 740 執行 Gemma-3n-E4B 的預填約快 9%;小批次仍保留原路徑,亦可透過 `GGML_OPENCL_A7X_F32_LM_BYPASS=0` 關閉。

這項修正顯示,端側模型速度不只取決於量化位元與標稱算力,模型內仍保留 F16/F32 的層、驅動編譯器版本及 GEMM dispatch 都可能成為主要瓶頸。不過兩項改動只作用於較大的矩陣批次,因此不改善逐 token decode;Q8 attention 已走 DP4A 路徑,也不會受益。工程團隊應在自己的 GGUF、驅動與提示長度上分開量測 prefill 和 decode,而不能把單一模型的百分比直接外推至所有 Snapdragon 裝置。

來源

  1. opencl: use a better matmul path on two Adreno GPU generations
  2. llama.cpp b10687