Commit cea74625f for llama.cpp
commit cea74625fa0bd59464a6c6f5ac3c1c1ebfec5344
Author: Ruben Ortlam <rortlam@redhat.com>
Date: Sun Sep 27 12:06:06 2026 +0200
vulkan: fix argsort kernel selection for Adreno (#29469)
diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp
index ce40baec2..414e14f85 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: