From 910f4bdee39e902b6ca6a6d3aa8ce461d74f1b3b Mon Sep 17 00:00:00 2001 From: jgrusewski Date: Sun, 15 Mar 2026 13:05:43 +0100 Subject: [PATCH] fix(cuda): dim_overrides before common header in backtest kernel, cap n_episodes at 4096 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - backtest_forward_kernel: dim_overrides must precede common_device_functions.cuh which has #error guards requiring STATE_DIM/MARKET_DIM/PORTFOLIO_DIM to be defined before inclusion. Experience collector already had correct ordering. - Cap MAX_EPISODES from 8192→4096 (diminishing returns above 4096, wastes walltime) - Cap trainer .min() from 0x8000 (32768) → 4096 to match Co-Authored-By: Claude Opus 4.6 --- .../ml-core/src/memory_optimization/auto_batch_size.rs | 2 +- crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs | 9 +++++---- crates/ml/src/trainers/dqn/trainer.rs | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/crates/ml-core/src/memory_optimization/auto_batch_size.rs b/crates/ml-core/src/memory_optimization/auto_batch_size.rs index e9d38c981..e598ec429 100644 --- a/crates/ml-core/src/memory_optimization/auto_batch_size.rs +++ b/crates/ml-core/src/memory_optimization/auto_batch_size.rs @@ -466,7 +466,7 @@ impl GpuHardwareInfo { const WARPS_PER_SM: usize = 2; // conservative for high-register kernels const THREADS_PER_WARP: usize = 32; const MIN_EPISODES: usize = 128; - const MAX_EPISODES: usize = 8192; + const MAX_EPISODES: usize = 4096; // Per-episode output buffer: states + actions + rewards + done + target_q + td_error // Plus per-episode state: portfolio(6) + barrier(10) + diversity(30+2) + rng(1) ≈ 50 floats diff --git a/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs b/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs index 4f537042c..74444ba42 100644 --- a/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs +++ b/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs @@ -1305,8 +1305,8 @@ impl GpuBacktestEvaluator { let common_src = include_str!("common_device_functions.cuh"); let kernel_src = include_str!("backtest_forward_kernel.cu"); - // Inject actual dimensions before kernel source (#ifndef guards in kernel - // let these override the defaults). + // Inject actual dimensions — must precede common_src which has + // #error guards requiring these defines. let dim_overrides = format!( "#define STATE_DIM {state_dim}\n\ #define MARKET_DIM {market_dim}\n\ @@ -1320,7 +1320,8 @@ impl GpuBacktestEvaluator { market_dim = self.feature_dim - self.config.ofi_dim, ); - let full_source = format!("{common_src}\n{dim_overrides}\n{kernel_src}"); + // dim_overrides BEFORE common_src so #error guards in .cuh see the defines + let full_source = format!("{dim_overrides}\n{common_src}\n{kernel_src}"); info!( "GpuBacktestEvaluator: compiling forward kernel with dims state={state_dim} \ shared=[{shared_h1},{shared_h2}] value={value_h} adv={adv_h} \ @@ -1663,7 +1664,7 @@ mod tests { #define ADV_H 128\n\ #define SHMEM_MAX_IN_DIM 256\n\ #define SHMEM_TILE_ROWS 32\n"; - let full_source = format!("{common_src}\n{dim_overrides}\n{kernel_src}"); + let full_source = format!("{dim_overrides}\n{common_src}\n{kernel_src}"); let result = crate::cuda_pipeline::compile_ptx_for_device(&full_source, &context); if let Err(ref e) = result { panic!("backtest_forward_kernel PTX compilation failed: {e}"); diff --git a/crates/ml/src/trainers/dqn/trainer.rs b/crates/ml/src/trainers/dqn/trainer.rs index 1ce788d31..0640974d9 100644 --- a/crates/ml/src/trainers/dqn/trainer.rs +++ b/crates/ml/src/trainers/dqn/trainer.rs @@ -2493,7 +2493,7 @@ impl DQNTrainer { aligned_sd, self.hyperparams.gpu_timesteps_per_episode, ); - let chosen = configured.max(optimal).min(0x8000); + let chosen = configured.max(optimal).min(4096); if chosen != configured { info!( "GPU auto-scaled n_episodes: {} → {} (SMs={}, VRAM={:.0}MB)",