21using SyevChoice = std::variant<Cta, CtaFused, Jacobi, Blocked, TwoStage, Vendor>;
29inline constexpr std::array<std::string_view, 3>
key_names{
"jobz:exact",
"n:log:3",
"batch:log"};
32inline constexpr std::array<int, 37>
grid_n{1, 2, 3, 4, 6, 8, 9, 12, 16, 20, 24, 25, 28,
33 32, 33, 40, 48, 64, 96, 128, 192, 256, 257, 320, 321, 384,
34 448, 449, 512, 513, 640, 768, 1024, 1025, 1536, 2048, 4096};
35inline 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, 5 > grid_batch
constexpr std::array< int, 37 > grid_n
Both sides of every transcribed threshold plus a log grid; the transcriber (tuned/README....
std::variant< Cta, CtaFused, Jacobi, Blocked, TwoStage, Vendor > SyevChoice
GPU natives: square, no NETLIB.
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.
constexpr std::array< std::string_view, 3 > key_names
Keys: jobz N|V exact; uplo is no key (Upper mirrors into Lower); n log weight 3; batch log.
Flat kernel selection: one choose() per op over measured per-device tables.
syev_blocked: sytrd_blocked + stedc, any n
syev_cta_fused: one kernel, n <= 32
syev_cta: sytrd + steqr_cta, n <= 32
syev_two_stage: sy2sb + sb2st + stedc, any n
backend::syev_vendor; needs the solver 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...