unique_actions was hardcoded to 5 in the GPU backtest path, making the
diversity penalty (0.8 max weight) always return 0.0 — another dead
objective component. CPU backtest path correctly computed it via HashSet.
Added 5-bit bitmask OR-reduction: each thread sets bit(action_id) during
the existing per-step loop, then a single OR-reduction across the block
produces the union. __popc() gives unique count in one PTX instruction.
Memory efficiency: reuses s_sorted shared memory (sequential staging —
OR-reduction completes before bitonic sort overwrites it). No extra
shared memory arrays needed. Output expanded from 13→14 floats/window.
Combined with the previous commit, this restores gradient signal for
100% of the multi-objective function: composite (60%), HFT activity
(25%), stability (15%), and diversity penalty (soft signal).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>