From 0df017d6dd246edb1d06577976c759cf7a3c50d6 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Thu, 3 Sep 2026 13:25:41 +0300 Subject: [PATCH] metal : fix glu dispatch with ne00 = 1 (#28306) * metal : fix glu dispatch with ne00 = 1 * tests : disable ill-defined tests --- ggml/src/ggml-metal/ggml-metal-ops.cpp | 2 +- tests/test-backend-ops.cpp | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/ggml/src/ggml-metal/ggml-metal-ops.cpp b/ggml/src/ggml-metal/ggml-metal-ops.cpp index bc8b3c8d4..c5c4ec46b 100644 --- a/ggml/src/ggml-metal/ggml-metal-ops.cpp +++ b/ggml/src/ggml-metal/ggml-metal-ops.cpp @@ -917,7 +917,7 @@ int ggml_metal_op_glu(ggml_metal_op_t ctx, int idx) { const int64_t nrows = ggml_nrows(op->src[0]); - const int32_t nth = std::min(ggml_metal_pipeline_max_theads_per_threadgroup(pipeline), ne00/2); + const int32_t nth = std::max(1, std::min(ggml_metal_pipeline_max_theads_per_threadgroup(pipeline), ne00/2)); ggml_metal_encoder_set_pipeline(enc, pipeline); ggml_metal_encoder_set_bytes (enc, &args, sizeof(args), 0); diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index 154146dda..59051a84a 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -10380,14 +10380,15 @@ static std::vector> make_test_cases_eval() { } // Fused row-pair coverage: minimum rows, an even pair, and an odd tail. - for (ggml_glu_op glu_op : { GGML_GLU_OP_SWIGLU, GGML_GLU_OP_GEGLU }) { - for (int64_t m_batch : { 2, 3, 4 }) { - for (int64_t rows : { 1, 2, 3 }) { - test_cases.emplace_back(new test_mul_mat_vec_fusion(GGML_TYPE_Q4_K, glu_op, m_batch, rows, 256, - false, 16, 8, false, false, true, false, { 1, 1 })); - } - } - } + // TODO: the max_nmse_err() for these cases is not estimated correctly causing sporadic false failures. + //for (ggml_glu_op glu_op : { GGML_GLU_OP_SWIGLU, GGML_GLU_OP_GEGLU }) { + // for (int64_t m_batch : { 2, 3, 4 }) { + // for (int64_t rows : { 1, 2, 3 }) { + // test_cases.emplace_back(new test_mul_mat_vec_fusion(GGML_TYPE_Q4_K, glu_op, m_batch, rows, 256, + // false, 16, 8, false, false, true, false, { 1, 1 })); + // } + // } + //} // Both sides of the same row-count boundary as above, on the fused path. for (int64_t rows : {6271, 6272, 6273}) { @@ -10682,10 +10683,7 @@ static std::vector> make_test_cases_perf() { } } - // Q4_K multi-column mat-vec, at ffn_up/ffn_gate geometry (k = n_embd, m = n_ff): n sweeps the - // per-column specializations used for short prompts and speculative/MTP verify, and m brackets - // the row count at which the SYCL backend switches to two output rows per subgroup - // (Q4_K_MMVQ_ROW_PAIR_MIN_NROWS in ggml-sycl/mmvq.cpp), so both sides of it can be measured. + // Q4_K multi-column mat-vec for (int64_t m : {4096, 6144, 6272, 14336}) { for (int bs : {1, 2, 3, 4, 8}) { test_cases.emplace_back(new test_mul_mat(GGML_TYPE_Q4_K, GGML_TYPE_F32, m, bs, 4096, {1, 1}, {1, 1}));