Files
foxhunt/crates
jgrusewski 199feff4db fix(cuda): per-stream cublasLt handles (Option C) — 10× determinism improvement on cuBLAS path
Replaces SharedCublasHandle (one lt_handle rebound across streams) with
PerStreamCublasHandles (one lt_handle per CUDA stream). Implements
NVIDIA's cuBLAS §2.1.4 remediation #1 — documented fix for concurrent-
stream non-determinism.

Context: prior investigation (task a11d706bdb56b5020) ruled out
atomicAdd/RNG/Thrust/multi-stream-sync/graph-capture. Option B (commit
bb399b635) fixed algo-selection determinism via AlgoGetIds+Init+Check
but HEALTH_DIAG still varied 1.5-2.5% at epoch 0. Context7 query of
NVIDIA docs identified shared-handle-across-streams as the remaining
cause even with user-owned workspaces and CUBLAS_WORKSPACE_CONFIG=:4096:8.

Fix:
  * PerStreamCublasHandles replaces SharedCublasHandle — HashMap<raw
    cu_stream ptr, lt_handle>, per-stream workspace registry.
  * Hot-path accessor lt_handle_for(stream) returns handle for that
    stream; creates on first use.
  * Pre-registers iqn_stream, attn_stream, 4 forward+backward branch
    streams before CUDA Graph capture (avoids mid-capture hashmap insert).
  * Deleted set_stream rebind dance.
  * 11 files migrated; ~250-350 LOC refactor. TF32 preserved everywhere.
  * Option B's DeterministicAlgoSelector unchanged; selector is
    stateless-per-handle and composes cleanly with per-stream handles.

Determinism validation at HEAD (3 runs, RTX 3050):
                            pre-C variance  post-C variance
  c51                       1.7%            0.16%    (10×)
  grad_ratio_mag_dir        1.5%            0.14%    (10×)
  grad_abs[mag]             1e-4 rel        3e-5 rel (bit-identical to 5 sig figs)
  g12_predictive            1e-6 rel        7e-6 rel (bit-identical to 6 sig figs)
  grad_abs[dir]             2.5%            8.7%     (UNCHANGED — residual)

The residual non-determinism at grad_abs[dir] is localized to the
direction-branch backward path. Magnitude-branch is bit-identical across
runs; direction-branch is not. The two branches use different backward
code paths — dir-branch has a non-cuBLAS source (candidate: atomicAdd in
a direction-specific reducer, or branch-stream finish-order dependency
on downstream atomic accumulation). Follow-up task will root-cause and
fix that residual.

Per feedback_fix_aggressively.md: shipping this partial determinism win
now so subsequent investigation has a clean baseline.

Wall-clock delta: <1% (within noise).
2026-04-22 14:44:46 +02:00
..