Repository navigation
cost: read the team dispatch cost from threadteam 0.1.2; drop team_section_cost (threadteam-rs#6 stage 4) - #104
Conversation
…ction_cost threadteam 0.1.1 extrapolates WidthCosts linearly above a row's largest anchor and 0.1.2 measures a Zen2 team row for x86_64-avx2 up to width 64 (tensor4all/threadteam-rs#6), so faer's own extrapolation above width 8 (team_section_cost, MEASURED_MAX_WIDTH, #97) is deleted and the four readers ask threadteam's table. kernel_width searches from the full width down: measured rows fall with the width, so a narrow width that does not pay says nothing about a wide one. Requirement threadteam 0.1.2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Before/after on broccoli: 1T and 16T are decision-neutral; 64T is not resolvable here
Both arms link threadteam 0.1.2 (the harness's own lock already carries it), so the difference
A floor change shows up as "a region splits or it does not", so this is the answer that matters: 64T: no verdict from this host. The cells are bimodal there in both arms: |
…25.2 (#155) The minor version moves because #97 removed Par::Rayon, Par::rayon, ParShape::Rayon and ParShape::rayon. CHANGELOG.md lists the changes since faer-v0.25.2 with the migration: correctness fixes (nonsymmetric EVD #112/#144/#145, SVD #110/#108, LU ties #105, diagonal products #113, sparse LU #132, Krylov #133/#134), MaybeUninit matmul (#136), the team route (#91, #111, #104), threadteam 0.1.3, t4a-private-gemm-x86 0.1.27, MSRV 1.89 and the opt-in x86-v4. t4a-faer-traits 0.24.2 only adds rust-version. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Stage 4 of tensor4all/threadteam-rs#6. faer stops extrapolating the team dispatch cost itself and reads threadteam's table, so the model exists in one place for every consumer.
Changes
utils::cost::team_section_costandMEASURED_MAX_WIDTH(threadteam is the only parallel route: drop Par::Rayon, the spindle path and the Rayon cost model #97, provisional). threadteam now does the extrapolation:WidthCostsgrows linearly above a row's largest anchor;from_anchorsaccepts variable anchors.x86_64-avx2at widths 2 to 64, from the 並列ゲートの dispatch cost が幅 6 で頭打ち、通れば常に全幅: p=32〜64 で floor 付近の region が過剰に開く #91 broccoli measurements.ParShape::dispatch_costreadsDispatchCosts::cost(Team, w);par_pays_time,team::kernel::kernel_widthand the tiled team product's floor askTeamExec::dispatch_cost(w).kernel_widthsearches from the full width down. It used to stop at the first width that did not pay, which assumed the cost never falls with the width. Measured rows do fall (aarch64-appleteam 3.0 / 2.3 / 1.4 us), so a product that pays at 6 but not at 2 got no width.kernelmodule's x86_64 cfg. The existing rising-row test was missing it too.threadteam = "0.1.2", so the resolver cannot pick 0.1.0, which is flat above 6.Cargo.lockchanges threadteam only.docs/worklogs/2026-10-29-team-cost-from-threadteam.md), and a short update indocs/par-team-migration.md. The historical threadteam is the only parallel route: drop Par::Rayon, the spindle path and the Rayon cost model #97 worklog is left unchanged.Gate decisions that change (by design)
x86_64-avx512teamx86_64-avx2(Zen2 row)3 * 64 / 8= 24 us at width 64Tests
utils::cost::tests::the_team_cost_is_threadteams_table_at_every_widthchecks:cost(w_m) * w / w_min integer ns, including width 128 on the Zen2 row;utils::team::tests::kernel_width_finds_the_widest_paying_width_on_a_falling_row.Verification
cargo test -p t4a-faer --lib: 520 passed.--doc: 63 passed.--lib utils::after the last edit: 54 passed.cargo check -p t4a-faerfor no-default,std,std,rayon, default andstd,rayon,threadteam: no new warnings, and one fewer (MEASURED_MAX_WIDTHunused).Not run: the adoption-protocol acceptance measurement
docs/adoption-protocol.mdasks for a blast-radius acceptance run before merge. Here the blast radius is every family whose parallel gate reads the team cost: GEMM and the triangular products throughkernel_widthand the tiled floor, plus the factorizations and solves throughParShapeandpar_pays_time.This change moves gate inputs, not kernels. Following the maintainer's rule against a long campaign per change, the run was not done; the maintainer decides before merge whether to run it.
Next
tcontract-exec and tlinalg lock updates follow this PR.
🤖 Generated with Claude Code