From cea74625fa0bd59464a6c6f5ac3c1c1ebfec5344 Mon Sep 17 00:00:00 2001 From: Ruben Ortlam Date: Sun, 27 Sep 2026 12:06:06 +0200 Subject: [PATCH] vulkan: fix argsort kernel selection for Adreno (#29469) --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index ce40baec2d..414e14f856 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -11172,8 +11172,10 @@ void ggml_vk_argsort(ggml_backend_vk_context * ctx, vk_context& subctx, const gg // Pick the largest workgroup size <= ncolsp2 uint32_t pipeline_idx = std::min(ncols_pad_log2, num_argsort_pipelines - 1); + uint32_t max_wg_log2 = std::min(ctx->device->max_workgroup_size_log2, num_argsort_pipelines - 1); + // Use the "small" argsort shader if the whole sort can be done by a single workgroup. - bool use_small = ncols_pad_log2 <= ctx->device->max_workgroup_size_log2 && + bool use_small = ncols_pad_log2 <= max_wg_log2 && ctx->device->pipeline_argsort_f32[pipeline_idx] != nullptr; vk_pipeline pipeline = use_small ? ctx->device->pipeline_argsort_f32[pipeline_idx] @@ -11208,7 +11210,7 @@ void ggml_vk_argsort(ggml_backend_vk_context * ctx, vk_context& subctx, const gg { vk_op_argsort_push_constants pc2 = pc; pc2.outer_start = 0; - pc2.outer_end = std::min(ncols_pad_log2, ctx->device->max_workgroup_size_log2); + pc2.outer_end = std::min(ncols_pad_log2, max_wg_log2); pc2.inner_start = 0; pc2.inner_end = 100; ggml_pipeline_request_descriptor_sets(ctx, pipeline, 1); @@ -11217,7 +11219,7 @@ void ggml_vk_argsort(ggml_backend_vk_context * ctx, vk_context& subctx, const gg if (!use_small) { ggml_vk_sync_buffers(ctx, subctx); // Loop over outer/inner passes, synchronizing between each pass. - for (uint32_t outer = ctx->device->max_workgroup_size_log2; outer < ncols_pad_log2; ++outer) { + for (uint32_t outer = max_wg_log2; outer < ncols_pad_log2; ++outer) { for (uint32_t inner = 0; inner < outer + 1; ++inner) { vk_op_argsort_push_constants pc2 = pc; pc2.outer_start = outer; @@ -15612,7 +15614,7 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm if (device->vulkan_memory_model) { return true; } else { - return op->ne[0] <= (1 << device->max_workgroup_size_log2); + return op->ne[0] <= (1 << std::min(device->max_workgroup_size_log2, num_argsort_pipelines - 1)); } } case GGML_OP_TOP_K: