From fb0e6b621917488d623437349fb5361e0ac21c70 Mon Sep 17 00:00:00 2001 From: Kamalesh VS <76260512+kkjjkamal123@users.noreply.github.com> Date: Tue, 21 Jul 2026 21:40:29 +0530 Subject: [PATCH] kleidiai : warn once when a weight type has no KleidiAI kernel (#25701) --- ggml/src/ggml-cpu/kleidiai/kleidiai.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp b/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp index 5cdcbdfe4c..1c5a459f21 100644 --- a/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +++ b/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp @@ -1719,6 +1719,7 @@ class extra_buffer_type : ggml::cpu::extra_buffer_type { return true; } + return false; } @@ -1727,6 +1728,20 @@ class extra_buffer_type : ggml::cpu::extra_buffer_type { if (op->src[0]->buffer && op->src[0]->buffer->buft == ggml_backend_cpu_kleidiai_buffer_type()) { return (ggml::cpu::tensor_traits *) op->src[0]->extra; } else { + // KleidiAI only has kernels for Q4_0 and Q8_0. For a quantized weight of any + // other type (K-quants, IQ) it declines the op and returns nullptr below, so + // KleidiAI does not accelerate it. Another CPU backend may still take the op, + // and this can run during graph planning, so the message says what KleidiAI + // did rather than what ends up executing. Warn once per process. + if (ggml_is_quantized(op->src[0]->type) && + op->src[0]->type != GGML_TYPE_Q4_0 && op->src[0]->type != GGML_TYPE_Q8_0) { + static std::atomic warned(false); + if (!warned.exchange(true)) { + GGML_LOG_WARN("kleidiai: no kernel for tensor type %s, not accelerated by KleidiAI " + "(kernels available for Q4_0 and Q8_0)\n", + ggml_type_name(op->src[0]->type)); + } + } if (op->src[0]->type != GGML_TYPE_F16) { return nullptr; }