Commit 7d516e25e for llama.cpp
commit 7d516e25ead4653169236b3f90d13f7bd8629724
Author: shaofeiqi <shaoqi@qti.qualcomm.com>
Date: Wed Nov 4 21:22:41 2026 -0800
opencl: enable f32 and q5_k multi column GEMV by default for Adreno X2 (#31694)
* opencl: use the small-N f32 GEMV by default on X2E
Assisted-by: Claude Opus 5.5
Co-authored-by: Shaofei Qi <shaoqi@qti.qualcomm.com>
* opencl: use the q5_K multi-column verify GEMV by default on X2E
Assisted-by: Claude Opus 5.5
Co-authored-by: Shaofei Qi <shaoqi@qti.qualcomm.com>
---------
Co-authored-by: Li He <lih@qti.qualcomm.com>
diff --git a/ggml/src/ggml-opencl/ggml-opencl.cpp b/ggml/src/ggml-opencl/ggml-opencl.cpp
index e5b382c7a..dc096dbb0 100644
--- a/ggml/src/ggml-opencl/ggml-opencl.cpp
+++ b/ggml/src/ggml-opencl/ggml-opencl.cpp
@@ -28445,8 +28445,9 @@ static void ggml_cl_mul_mat_q5_K_f32_adreno(ggml_backend_t backend, const ggml_t
// (ne1==3) onto the efficient GEMV path instead of the transposed-GEMM dead-
// zone (gemm_noshuffle_q5_k, the #2 chunk of MTP decode on a Q4_0-mix model
// after q4_0 mc3). Reuses the ne1==1 GEMV image setup (q + qh + activations).
- // Opt-in via GGML_OPENCL_Q5K_MC3=1. Per-layer only (ne01 < 32768).
- static const bool q5k_mc3 = (getenv("GGML_OPENCL_Q5K_MC3") != nullptr);
+ // Default on for X2E, GGML_OPENCL_Q5_K_MC3=0/1 forces it. Per-layer only (ne01 < 32768).
+ static const char * q5k_mc3_env = getenv("GGML_OPENCL_Q5_K_MC3");
+ const bool q5k_mc3 = q5k_mc3_env ? atoi(q5k_mc3_env) != 0 : backend_ctx->adreno_gen == ADRENO_GPU_GEN::X2E;
const bool use_q5k_mc3 = q5k_mc3 && (ne1 >= 2 && ne1 <= 4) && (ne01 < 32768);
const bool use_bin = use_q5_k_bin_kernels(backend_ctx, src0);
@@ -28455,7 +28456,7 @@ static void ggml_cl_mul_mat_q5_K_f32_adreno(ggml_backend_t backend, const ggml_t
if (use_q5k_mc3) {
static bool warned = false;
if (!warned) {
- GGML_LOG_WARN("ggml_opencl: GGML_OPENCL_Q5K_MC3 is bypassed by Q5_K binary kernels\n");
+ GGML_LOG_WARN("ggml_opencl: GGML_OPENCL_Q5_K_MC3 is bypassed by Q5_K binary kernels\n");
warned = true;
}
}
@@ -31012,8 +31013,9 @@ static void ggml_cl_mul_mat(ggml_backend_t backend, const ggml_tensor * src0, co
// skinny f32 weight (GDN ssm_alpha/ssm_beta, M=32) it launches one
// under-occupied WG at ~2.3% tile utilization. Route to a per-output
// (m,n) GEMV (64-thread WG, K-split + __local reduce) instead.
- // Opt-in GGML_OPENCL_F32_MC=1; 2D contiguous, small N + skinny M only.
- static const bool f32_mc = (getenv("GGML_OPENCL_F32_MC") != nullptr);
+ // 2D contiguous, small N + skinny M only. Default on for X2E, GGML_OPENCL_F32_MC=0/1 forces it.
+ static const char * f32_mc_env = getenv("GGML_OPENCL_F32_MC");
+ const bool f32_mc = f32_mc_env ? atoi(f32_mc_env) != 0 : backend_ctx->adreno_gen == ADRENO_GPU_GEN::X2E;
if (f32_mc && ne11 >= 2 && ne11 <= 8 && ne01 <= 512 && (ne00 % 4 == 0) &&
ne02 == 1 && ne12 == 1 && ne13 == 1 &&
ggml_is_contiguous(src0) && ggml_is_contiguous(src1)) {