mirror of
https://github.com/Niko1221/Strata.git
synced 2026-11-07 06:15:58 -10:00
- 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)
33 lines
1.2 KiB
C++
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;
|
|
}
|