29inline constexpr std::array<std::string_view, 3>
key_names{
"form:exact",
"n:log:3",
"aspect:log"};
33 const std::int64_t lo = m < n ? m : n, hi = m < n ? n : m;
34 return lo < 1 ? 1 : hi / lo;
39inline constexpr std::array<int, 52>
grid_n{1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14, 16, 17, 20, 21, 22,
40 23, 24, 28, 31, 32, 33, 40, 47, 48, 49, 56, 63, 64, 75, 76, 80, 96,
41 97, 112, 128, 160, 192, 224, 255, 256, 288, 384, 512, 768, 1024, 1536, 2048,
43inline constexpr std::array<int, 11>
grid_aspect{1, 2, 3, 4, 5, 7, 8, 12, 16, 64, 256};
44inline constexpr std::array<int, 4>
grid_wide_n{2, 64, 1024, 8192};
constexpr auto all_of()
Every alternative of a field-less choice variant, in declaration (= tie-break) order.
std::variant< Tiny, Cta, Blocked, Vendor > GeqrfChoice
fieldless: buckets, packing, nb, leaf derived
constexpr auto candidates()
Every compiled choice, once, in tie-break order (§6.3): narrowest first, vendor last.
constexpr std::array< int, 11 > grid_aspect
constexpr std::int64_t aspect_of(Int m, Int n)
The aspect key: max(m, n) / min(m, n), 1 for an empty view.
constexpr std::array< int, 52 > grid_n
Rows: sq x grid_n, tall x grid_n x grid_aspect, wide x grid_wide_n x grid_wide_aspect; both sides of ...
constexpr std::array< int, 3 > grid_wide_aspect
constexpr select::OpSpec spec
last resort (§5.5): blocked, vendor
constexpr std::array< int, 4 > grid_wide_n
constexpr std::array< std::string_view, 3 > key_names
Keys: form sq | tall (m > n) | wide (m < n), exact; n log weight 3; aspect log. Work ~ n^3 * aspect.
Flat kernel selection: one choose() per op over measured per-device tables.
geqrf_blocked_dispatch + the public gemm, any m >= n
geqrf_cta_dispatch: the whole panel in SLM (geqrf_cta_fits)
geqrf_tiny_dispatch: square, registers, n <= the tiny ceiling
backend::geqrf_vendor; needs the factorization 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...