Files
Niko1221 aea8d64bcc metal: prompt experts and QSA attention on matrix-unit register operands (v3), prompt_chain defaults to them
- moe_mm.metal: mm_gu3 / mm_down3 - weights decoded per lane straight into matmul2d's right-input cooperative tensor
  (single-simdgroup scope, no threadgroup staging or barriers in the K loop); W4<F> 4-value decoders for Q2_0,
  IQ3_XXS, IQ2_XXS, IQ2_XS, IQ2_S, IQ3_S, IQ4_NL (quant.metal's deq arithmetic)
- qsa_prompt.metal: qsa_attn_mm (S = Q K^T and P V as single-simdgroup matmuls, int8 K/V decoded into the right
  input; same partials as qsa_attn, so qsa_merge is unchanged), qsa_q_f16
- tests: qsa_prompt_parity, coop_layout (the cooperative tensors' element layout), moe_mm_parity --v3;
  prompt_chain PC_GU / PC_DN / PC_QSA switches (defaults v3 / v3 / mm)
2026-10-12 14:54:56 +02:00

33 lines
1.2 KiB
C++

// metal/tests/coop_layout.cpp - which (index 0, index 1) elements of a single-simdgroup matmul2d's right input, left
// input and destination cooperative tensors each lane holds (mm_bench.metal coop_layout).
// coop_layout [TM_TN_TK]
#include "mtl_rt.h"
#include <cstdio>
#include <string>
int main(int argc, char** argv) {
const std::string cfg = argc > 1 ? argv[1] : "16_32_16";
mtl::Context cx;
const int lib = cx.compile({"mm_bench.metal"}, "#define NO_GGML_COMMON 1\n");
mtl::Pipeline p = cx.pipeline(lib, "coop_layout_" + cfg);
mtl::Buffer out = cx.alloc(4 * 3 * 32 * 128 * 4);
mtl::Dispatch d;
d.p = &p;
d.args = {mtl::Arg::B(out)};
d.tg[0] = 32;
cx.run({d});
const int* o = out.as<int>();
const char* nm[3] = {"right", "left", "dest"};
for (int w = 0; w < 3; ++w) {
std::printf("%s (tile %s):\n", nm[w], cfg.c_str());
for (int l = 0; l < 32; ++l) {
const int* q = o + (w * 32 + l) * 128 * 4;
std::printf(" l%-2d cap %d:", l, q[2]);
for (int i = 0; i < q[2] && i < 128; ++i) std::printf(" (%d,%d)", q[i * 4], q[i * 4 + 1]);
std::printf("\n");
}
}
return 0;
}