nsys profile showed gpu_gather_bce_labels consumed 95.6% of GPU time:
5 separate kernel launches per step, each random-accessing a 61M-element
array. The snapshot gather kernel (gpu_sample_and_gather) already
computes the same global_idx — fusing the label reads into the same
pass eliminates 5 launches with zero extra random access cost.
Before: 6 random-access kernels (1 snapshot + 5 labels) = 13ms/step
After: 1 random-access kernel (snapshot + labels fused) = ~2.5ms/step
Expected speedup: 6 sps → 30-50+ sps at b=1024.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>