build.rs compiles every .cu under crates/ml-backtesting/cuda/ to \$OUT_DIR/<name>.cubin via nvcc (no nvrtc per feedback_no_nvrtc.md); pairs every env::var with rerun-if-env-changed per pearl_build_rs_rerun_if_env_changed.md. Default arch sm_86 (RTX 3050 local); production sets FOXHUNT_CUDA_ARCH=sm_89 (L40S) or sm_90 (H100). First kernel: book_update_apply_snapshot — block-per-backtest replace of the 10-level book from a broadcast MBP-10 snapshot. Single-writer per level (thread tid = level idx), no atomics per feedback_no_atomicadd.md. lob_state.cuh defines the canonical per-block shared-mem layout that all subsequent kernels share (Book struct in this commit; Orders, Pos, IsvKellyState[5] added in C5-C7). LobSimCuda host struct (in src/sim.rs) constructed from an &MlDevice; owns per-backtest device book state + mapped-pinned input snapshots. apply_snapshot launches the kernel and synchronises; read_books drains device state for tests. Three Ring 1 fixture tests (book_update_replace, _two_step, _n_backtests=4) — N≤4 bit-exact GPU oracle assertions loaded from JSON. All three pass on RTX 3050 locally. Verifies the build-script → cubin → cudarc.load_cubin → kernel launch → DtoH read pipeline end-to-end. cudarc added as direct path dep (../../vendor/cudarc) since it's not in [workspace.dependencies] — same vendored fork ml-alpha uses. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
33 lines
1.2 KiB
Plaintext
33 lines
1.2 KiB
Plaintext
// book_update.cu — MBP-10 snapshot apply.
|
||
//
|
||
// Replaces the per-block book state with the broadcast snapshot. The
|
||
// full top-10 image overwrites the previous state (MBP-10 semantics).
|
||
// One block per backtest; thread tid handles one of 10 levels per side
|
||
// (10 threads used out of 32 in the warp; remainder idle).
|
||
//
|
||
// Per feedback_no_atomicadd.md: no atomics — single-writer per level.
|
||
// Per spec §2: same snapshot broadcast to every backtest in v1.
|
||
|
||
#include "lob_state.cuh"
|
||
|
||
// Books are laid out [n_backtests, 4 fields × 10 levels].
|
||
// Field order: bid_px, bid_sz, ask_px, ask_sz (one contiguous Book per backtest).
|
||
extern "C" __global__ void book_update_apply_snapshot(
|
||
const float* __restrict__ bid_px_in, // [10] — broadcast
|
||
const float* __restrict__ bid_sz_in, // [10]
|
||
const float* __restrict__ ask_px_in, // [10]
|
||
const float* __restrict__ ask_sz_in, // [10]
|
||
Book* __restrict__ books_out, // [n_backtests]
|
||
int n_backtests
|
||
) {
|
||
int b = blockIdx.x;
|
||
int tid = threadIdx.x;
|
||
if (b >= n_backtests || tid >= 10) return;
|
||
|
||
Book& bk = books_out[b];
|
||
bk.bid_px[tid] = bid_px_in[tid];
|
||
bk.bid_sz[tid] = bid_sz_in[tid];
|
||
bk.ask_px[tid] = ask_px_in[tid];
|
||
bk.ask_sz[tid] = ask_sz_in[tid];
|
||
}
|