ci / fmt (pull_request) Successful in 19s
bench / build (pull_request) Successful in 1m13s
bench / measure (pull_request) Failing after 14s
ci / clippy (pull_request) Successful in 1m49s
ci / doc (pull_request) Successful in 2m25s
ci / test (pull_request) Successful in 8m23s
A second entry point in the same fatbin, sharing every arithmetic primitive with mining_main, with the round loops rolled and the round constants fetched from constant memory by index (quantus/miner#27). The per-nonce body is one template used by both entries, so the deployed kernel is byte-identical (sm_120 21,120 instructions, 110 registers). Selected at run time: MINER_CUDA_KERNEL=loop loads mining_loop, reports kernel id cuda-loop on the per-device metrics, and defaults the block size to 512 (LAIR_LOOP_TPB); unset or unrolled keeps mining_main and the cuda kernel id the deploy validate asserts. Measured on beast, three interleaved rounds, parity 500/500 on both: unrolled 2206, loop 2130 MH/s (-3.4%). The loop kernel is 11,840 static instructions at 128 registers (88 bytes of spill) on sm_120; 88 registers with no spill on sm_86/89. Shapes tried for it: 192 registers 1976 (one block per SM, card underfilled), 80 registers 2005 (424 B spill), 64 registers 373-532 (716-872 B spill), two internal rounds per iteration 1976 against one at 2105, 256/128-thread blocks below 512. Not the win #27 hoped for yet: the loop structure alone does not lower this arithmetic's register footprint the way the quanpool kernel's is, and its internal round is 254 instructions to their 199. Kept as an opt-in path so the next steps (the round arithmetic as one carry chain) can be measured against the deployed kernel without touching it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ue5ZZm1Hiv5zPnucykKKuF