19using TrsmChoice = std::variant<Cta, SgLeft, Blocked, Vendor>;
26inline constexpr std::array<std::string_view, 5>
key_names{
27 "side:exact",
"trans:exact",
"order:log:2",
"q:log",
"batch:log"};
31inline constexpr std::array<int, 18>
grid_order{1, 2, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512,
33inline constexpr std::array<int, 12>
grid_q{1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 4096};
34inline constexpr std::array<int, 5>
grid_batch{128, 512, 2048, 8192, 32768};
constexpr auto all_of()
Every alternative of a field-less choice variant, in declaration (= tie-break) order.
constexpr std::array< int, 18 > grid_order
The tuner's grid; the transcriber (tuned/README.md) spells the same grid.
constexpr std::array< int, 12 > grid_q
constexpr std::array< int, 5 > grid_batch
std::variant< Cta, SgLeft, Blocked, Vendor > TrsmChoice
fieldless: buckets, wg ladder, outer block derived
constexpr std::array< std::string_view, 5 > key_names
q: B.cols (Left) or B.rows (Right)
constexpr select::OpSpec spec
last resort (§5.5): blocked, vendor (CPU)
constexpr auto candidates()
Every compiled choice, once, in tie-break order (§6.3): native first, vendor last.
Flat kernel selection: one choose() per op over measured per-device tables.
trsm_native_blocked + the public gemm, any order
trsm_native_v1_dispatch, order <= 32
trsm_native_sg_left_dispatch: Left, order <= 32, sg 32
backend::trsm_vendor; needs the level-3 library
Base of a family with no knobs: struct Cta : NoFields<"cta"> {};.
What an op's choice.hh declares once: its name, the library its Vendor family calls (one gate for can...