From 9033f306ce6c41097503a2db2c9ef19962f3aebb Mon Sep 17 00:00:00 2001 From: Aditya Waghmare Date: Sun, 13 Sep 2026 23:29:17 +0530 Subject: [PATCH 1/2] vulkan: fix COL2IM_1D dispatch for large tensors --- external/ggml/src/ggml-vulkan/ggml-vulkan.cpp | 3 +- .../ggml-vulkan/vulkan-shaders/col2im_1d.comp | 50 +++++++++---------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/external/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/external/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 433e89ccb..e55b65e1e 100644 --- a/external/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/external/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -10381,8 +10381,7 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co } break; case GGML_OP_COL2IM_1D: { - const uint32_t total = (uint32_t)(dst->ne[0] * dst->ne[1]); - elements = { total, 1, 1 }; + elements = { uint32_t(dst->ne[0]), uint32_t(dst->ne[1]), 1 }; } break; case GGML_OP_IM2COL_3D: { diff --git a/external/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp b/external/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp index 2b8f8acb2..4646cadd7 100644 --- a/external/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp +++ b/external/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp @@ -19,31 +19,29 @@ layout (binding = 0) readonly buffer X {A_TYPE data_a[];}; layout (binding = 1) writeonly buffer D {D_TYPE data_d[];}; void main() { - uint idx = gl_GlobalInvocationID.x; - const uint total = p.T_out * p.OC; - const uint stride = gl_NumWorkGroups.x * gl_WorkGroupSize.x; - - while (idx < total) { - const int t_out = int(idx % p.T_out); - const int oc = int(idx / p.T_out); - const int t_abs = t_out + p.p0; - - int t_in_min = (t_abs - int(p.K) + p.s0) / p.s0; - if (t_in_min < 0) { - t_in_min = 0; - } - int t_in_max = t_abs / p.s0; - if (t_in_max >= int(p.T_in)) { - t_in_max = int(p.T_in) - 1; - } - - float sum = 0.0; - for (int t_in = t_in_min; t_in <= t_in_max; ++t_in) { - const int k = t_abs - t_in * p.s0; - sum += float(data_a[uint(oc) * p.K + uint(k) + uint(t_in) * p.K_OC]); - } - - data_d[idx] = D_TYPE(sum); - idx += stride; + const uint t_out = gl_GlobalInvocationID.x; + const uint oc = gl_GlobalInvocationID.y; + + if (t_out >= p.T_out || oc >= p.OC) { + return; + } + + const int t_abs = int(t_out) + p.p0; + + int t_in_min = (t_abs - int(p.K) + p.s0) / p.s0; + if (t_in_min < 0) { + t_in_min = 0; } + int t_in_max = t_abs / p.s0; + if (t_in_max >= int(p.T_in)) { + t_in_max = int(p.T_in) - 1; + } + + float sum = 0.0; + for (int t_in = t_in_min; t_in <= t_in_max; ++t_in) { + const int k = t_abs - t_in * p.s0; + sum += float(data_a[uint(oc) * p.K + uint(k) + uint(t_in) * p.K_OC]); + } + + data_d[t_out + oc * p.T_out] = D_TYPE(sum); } From 9ced82eb751ca0d6d444942e083bf7f188e8dd1c Mon Sep 17 00:00:00 2001 From: Aditya Waghmare Date: Tue, 15 Sep 2026 11:09:13 +0530 Subject: [PATCH 2/2] vulkan: cap COL2IM_1D dispatch elements --- external/ggml/src/ggml-vulkan/ggml-vulkan.cpp | 11 +++- .../ggml-vulkan/vulkan-shaders/col2im_1d.comp | 50 ++++++++++--------- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/external/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/external/ggml/src/ggml-vulkan/ggml-vulkan.cpp index e55b65e1e..44dc9318c 100644 --- a/external/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/external/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -10381,7 +10381,16 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co } break; case GGML_OP_COL2IM_1D: { - elements = { uint32_t(dst->ne[0]), uint32_t(dst->ne[1]), 1 }; + const uint64_t total = uint64_t(dst->ne[0]) * uint64_t(dst->ne[1]); + const uint64_t max_x_elements = + uint64_t(ctx->device->properties.limits.maxComputeWorkGroupCount[0]) * + uint64_t(pipeline->wg_denoms[0]); + + elements = { + uint32_t(std::min(total, max_x_elements)), + 1, + 1 + }; } break; case GGML_OP_IM2COL_3D: { diff --git a/external/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp b/external/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp index 4646cadd7..2b8f8acb2 100644 --- a/external/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp +++ b/external/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp @@ -19,29 +19,31 @@ layout (binding = 0) readonly buffer X {A_TYPE data_a[];}; layout (binding = 1) writeonly buffer D {D_TYPE data_d[];}; void main() { - const uint t_out = gl_GlobalInvocationID.x; - const uint oc = gl_GlobalInvocationID.y; - - if (t_out >= p.T_out || oc >= p.OC) { - return; - } - - const int t_abs = int(t_out) + p.p0; - - int t_in_min = (t_abs - int(p.K) + p.s0) / p.s0; - if (t_in_min < 0) { - t_in_min = 0; + uint idx = gl_GlobalInvocationID.x; + const uint total = p.T_out * p.OC; + const uint stride = gl_NumWorkGroups.x * gl_WorkGroupSize.x; + + while (idx < total) { + const int t_out = int(idx % p.T_out); + const int oc = int(idx / p.T_out); + const int t_abs = t_out + p.p0; + + int t_in_min = (t_abs - int(p.K) + p.s0) / p.s0; + if (t_in_min < 0) { + t_in_min = 0; + } + int t_in_max = t_abs / p.s0; + if (t_in_max >= int(p.T_in)) { + t_in_max = int(p.T_in) - 1; + } + + float sum = 0.0; + for (int t_in = t_in_min; t_in <= t_in_max; ++t_in) { + const int k = t_abs - t_in * p.s0; + sum += float(data_a[uint(oc) * p.K + uint(k) + uint(t_in) * p.K_OC]); + } + + data_d[idx] = D_TYPE(sum); + idx += stride; } - int t_in_max = t_abs / p.s0; - if (t_in_max >= int(p.T_in)) { - t_in_max = int(p.T_in) - 1; - } - - float sum = 0.0; - for (int t_in = t_in_min; t_in <= t_in_max; ++t_in) { - const int k = t_abs - t_in * p.s0; - sum += float(data_a[uint(oc) * p.K + uint(k) + uint(t_in) * p.K_OC]); - } - - data_d[t_out + oc * p.T_out] = D_TYPE(sum); }