mirror of
https://github.com/Niko1221/Strata.git
synced 2026-11-07 18:35:04 -10:00
Correctness (class E): kept even without a speedup. Flag B (PR #5096): the graph waits for "flag B >= layer + 1" and flag B is one counter that only rises. A non-empty plan raises it from a host function on the copy stream, after its uploads. An empty plan (n <= 0) raised it on the spot, even when the copy stream still held an earlier layer's, or the other token group's, uploads: the counter jumped past a layer whose bytes had not landed. Verifier::raise_flag_b_ordered() now raises it through the copy stream whenever copies were queued in this window, and directly only when none were. The same ordering is used at the four places that publish an empty plan when the pool did not (run, run_slot_rows, batch_serve, service), which had the same hazard. A failed host-function launch used to be ignored (flag B never rose and the window hung); it now stops the engine like a failed upload does, after releasing the GPU waits. Adaptive-copy bookkeeping (PR #4844): a round planned on the pipelined loop whose loop drained before step 3 is marked resident on the serial rule, which used the lo/hi/bi of an earlier round, so only that range of swaps was marked and the others were lost (the slot held the new expert, the table still named the old one). The pipelined plan now names the whole round. The range arithmetic moved into AdaptiveCopyRange (adaptive_range.hpp) so a host test can walk the rounds. Tests: tests/core/flag_order_test.cu (delayed host-function copy standing in for a slow DMA, a consumer kernel that reads staging once flag B allows it, a negative control that shows the old direct raise releases it early, flag only rises, nothing queued, graph replay twice, every device; passes on both A4000s of z440), tests/program/ adaptive_range_test.cpp (serial batches for 0, 1, many swaps and several caps, the stale-range loss, empty round). Co-authored-by: AlanJager <[email protected]> Co-authored-by: uvlad23 <[email protected]>