fix: wait through transient feeder starvation in CUDA SA kernel (v0.2.1-rc49)

Kernel-side completion of the QUI-828 / gh-19 CUDA throughput decay. Companion to the host-side rotation fix (!150 (merged)).

Problem

The host-side SlotState revive logic (!150 (merged)) was inert on its own: the self-feeding SA kernel searched for the next READY slot with a bounded ~100 ms retry (10000 × 10µs __nanosleep) and then let the GPU block return permanently. Any feeder stall longer than that killed the block, so the host could not revive the nonce and the attempt rate still decayed block-by-block until restart.

Fix

GPU/cuda_sa.cu: the next-slot search now waits through starvation and exits only on the host EXIT_NOW flag, which teardown always raises (signal_exit in the streaming loop's finally and the batch path), so it cannot hang.

Test

tests/test_cuda_nonce_starvation.py (GPU-gated via importorskip("cupy")) drives the streaming loop under induced starvation and asserts completions sustain past the cold-start ceiling — fails on the bounded-retry kernel, passes on the fix.

Also bumps v0.2.1-rc49.

Closes the kernel half of gh-19 / QUI-828.

Merge request reports

Loading