Commit 3b83d12b0 for llama.cpp
commit 3b83d12b0876f2eaef38c708ac40b15c6e1c7b3f
Author: Nisbenz <benazzaanis783@gmail.com>
Date: Thu Nov 5 11:02:39 2026 +0100
vulkan : check combined K+V f16 scratch size in FA dequant path (#30487)
Fixes #30048
Assisted-by: Claude
diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp
index 48281acf9..d18ea9ab2 100644
--- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp
+++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp
@@ -8232,10 +8232,14 @@ void ggml_vk_flash_attn(ggml_backend_vk_context * ctx, vk_context& subctx, const
v->nb[1] != (uint64_t)HSV * ggml_type_size(v->type)) &&
(HSK % 8) == 0 && (HSV % 8) == 0;
const size_t kv_scratch_ts = kv_raw_strided ? ggml_type_size(k->type) : sizeof(ggml_fp16_t);
+ // K and V share one scratch buffer, so the sum must fit in one allocation
+ const uint64_t dequant_kv_sz = ((uint64_t)ggml_nelements(k) + (uint64_t)ggml_nelements(v)) * kv_scratch_ts;
const bool use_dequant_kv = ((k_quant && v_quant) || kv_raw_strided) && neq1 >= 64 &&
is_dense_kv_cache(k) && is_dense_kv_cache(v) &&
(uint64_t)ggml_nelements(k) * kv_scratch_ts <= ctx->device->properties.limits.maxStorageBufferRange &&
(uint64_t)ggml_nelements(v) * kv_scratch_ts <= ctx->device->properties.limits.maxStorageBufferRange &&
+ dequant_kv_sz <= ctx->device->max_buffer_size &&
+ dequant_kv_sz <= ctx->device->max_memory_allocation_size &&
(kv_raw_strided ||
(ctx->device->pipeline_dequant_transpose[k->type] != nullptr &&
ctx->device->pipeline_dequant_transpose[v->type] != nullptr)) &&