22inline constexpr std::array<std::string_view, 2>
last_resort{
"vendor",
"direct"};
26inline constexpr std::array<std::string_view, 5>
key_names{
27 "transA:exact",
"transB:exact",
"m:log",
"nrhs:log",
"batch:log"};
30inline constexpr std::array<int, 5>
grid_m{1, 16, 256, 4096, 65536};
31inline constexpr std::array<int, 5>
grid_nrhs{1, 2, 4, 16, 64};
32inline constexpr std::array<int, 5>
grid_batch{1, 8, 128, 1024, 16384};
constexpr auto all_of()
Every alternative of a field-less choice variant, in declaration (= tie-break) order.
constexpr std::array< int, 5 > grid_m
The transcriber (tuned/README.md) spells the same grid; the transcribed predicates read no extent.
constexpr std::array< int, 5 > grid_nrhs
std::variant< Direct, Vendor > SpmmChoice
fieldless: body (by transA), column block, pair load derived
constexpr auto candidates()
Every compiled choice, in tie-break order (§6.3).
constexpr std::array< std::string_view, 2 > last_resort
vendor: every format
constexpr select::OpSpec spec
op, library, rules
constexpr std::array< std::string_view, 5 > key_names
ConjTrans folds to T; m = A.rows() as stored; no nnz key (device memory). Work ~ m nrhs batch.
constexpr std::array< int, 5 > grid_batch
Flat kernel selection: one choose() per op over measured per-device tables.
sycl_spmm::spmm_native_csr: CSR only, no GPU gate (native_cpu too)
backend::spmm_vendor (cuSPARSE, rocSPARSE, netlib) less known-defect shapes
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...