From: Jeff Bolz Date: Sat, 29 Nov 2025 07:39:57 +0000 (-0600) Subject: vulkan: improve topk perf for large k, fix overflow in unit tests (llama/17582) X-Git-Tag: upstream/1.8.3~219 X-Git-Url: https://git.djapps.eu/?a=commitdiff_plain;h=dbf8766ffad8e36cdd4176a92d62f3d4dece6c1b;p=pkg%2Fggml%2Fsources%2Fwhisper.cpp vulkan: improve topk perf for large k, fix overflow in unit tests (llama/17582) --- diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 73562bc1..f3aba816 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -10239,7 +10239,9 @@ static void ggml_vk_topk(ggml_backend_vk_context * ctx, vk_context& subctx, cons // Prefer going as small as num_topk_pipelines - 3 for perf reasons. // But if K is larger, then we need a larger workgroup - uint32_t max_pipeline = num_topk_pipelines - 3; + uint32_t max_pipeline = num_topk_pipelines - 1; + uint32_t preferred_pipeline = std::max(num_topk_pipelines - 3, (uint32_t)log2f(float(k)) + 2); + max_pipeline = std::min(preferred_pipeline, max_pipeline); uint32_t min_pipeline = (uint32_t)log2f(float(k)) + 1; // require full subgroup min_pipeline = std::max(min_pipeline, ctx->device->subgroup_size_log2);