Atomic refactor wiring the GPU log ring's first producer end-to-end: - cuda/gpu_log_helpers.cuh (new): extract LogHeader/LogRecord/LogRing struct definitions + the log_record() device __forceinline__ helper into a shared header. Single source of truth — other kernels include this rather than redefining the structs. - cuda/gpu_log_ring.cu: refactor to include gpu_log_helpers.cuh; retain only the gpu_log_tick kernel. - cuda/smoothness_lambda_controller.cu: include gpu_log_helpers.cuh, add trailing (LogRing*, const int*) args, capture pre-EMA jitter + post-EMA jitter + target + excess_ratio into shared mem, and emit three records per call (RT_INPUT, RT_STATE, RT_OUTPUT) gated on non-null ring pointer. - trainer/perception.rs: feature-gated (cuda-diag-log) ring allocation + step counter (mapped-pinned host shadow), gpu_log_tick launch FIRST inside the captured graph, two new pointer args on the smoothness controller launch (null when feature off), step-counter DtoD shadow alongside the other telemetry shadows, drain task spawn (skipped when no tokio runtime — sync tests still construct the trainer), and a feature-gated Drop impl that aborts the drain task on shutdown. - tests/smoothness_lambda_controller_invariants.rs: pass null pointers for the two new kernel args; the kernel's nullptr guard preserves pre-existing behaviour. - build.rs: rerun-if-changed on cuda/gpu_log_ids.h and cuda/gpu_log_helpers.cuh so header edits trigger cubin rebuilds. Verified: cargo build / check --all-targets clean both with and without the cuda-diag-log feature; 4/4 smoothness controller invariant tests pass; 9/9 perception_overfit integration tests pass under the feature. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
27 lines
1.1 KiB
Plaintext
27 lines
1.1 KiB
Plaintext
// gpu_log_ring.cu — unified GPU diagnostic log ring (tick kernel).
|
|
//
|
|
// Provides the `gpu_log_tick` kernel that increments the step counter
|
|
// once per captured-graph step.
|
|
//
|
|
// Struct definitions (`LogHeader`, `LogRecord`, `LogRing`) and the
|
|
// `log_record` device helper live in `gpu_log_helpers.cuh` so other
|
|
// kernels can include the helpers without re-compiling them as
|
|
// separate symbols. Single source of truth — see
|
|
// `feedback_single_source_of_truth_no_duplicates`.
|
|
//
|
|
// Constraints (still apply to anything including the helper header):
|
|
// - No atomicAdd (slot reservation by deterministic step/kid/rt math).
|
|
// - No host branches; thread-id gating only.
|
|
// - Header-last commit (magic field written after payload + other header).
|
|
// - Mapped-pinned ring; host reads via volatile, no DtoH memcpy.
|
|
|
|
#include "gpu_log_helpers.cuh"
|
|
|
|
// Tick kernel — 1 thread, 1 block. Increments step counter; runs FIRST in
|
|
// every captured-graph replay so all subsequent kernels see the new step.
|
|
extern "C" __global__ void gpu_log_tick(int* step_counter) {
|
|
if (threadIdx.x == 0 && blockIdx.x == 0) {
|
|
step_counter[0] = step_counter[0] + 1;
|
|
}
|
|
}
|