Skip to content

CUDA D2D profiling evidence

This is a diagnostic of the existing CUDA v0.3 backend, not a new speedup. No projection kernels, solver settings, thresholds or calibration results change. The measured tool commit is 36dedc3; follow-up commits publish this evidence.

The public KITTI raw drive 0018 problem is the same digest-bound input used by the verified snapshot experiment. Exclude the five frozen holdout frame IDs to profile 20 fit frames, 2,503,637 points, and 1226 x 370 pinhole images at the declared initial pose. Resolved histogram settings are unchanged. This does not measure recovery or held-out accuracy; the benchmark schema's holdout anchor is the NumPy evaluation of the same pose, not an independent accuracy split.

python tools/profile_d2d_cuda.py `
  --problem outputs/public-kitti-six-dof-fused-cpu-v1/demo.problem.json `
  --output-dir outputs/public-kitti-cuda-stage-profile-v1 `
  --exclude-frame-id 0000000460 --exclude-frame-id 0000001035 `
  --exclude-frame-id 0000001611 --exclude-frame-id 0000002186 `
  --exclude-frame-id 0000002761 --repeats 10 --poses-per-repeat 20

Ten repetitions alternate ordinary/instrumented order. Each mode evaluates 20 poses per repetition, after three ordinary warmups. All 403 evaluations exactly match one native NumPy evaluation, including frame records, visibility and projected counts, skip records, MI and NMI. Every instrumented repetition records 400 calls per kernel stage; stage means are retained in trial provenance. This is one repeatedly evaluated pose, not 403 independent calibration trials.

On this shared i7-9750H / NVIDIA CUDA GPU 6 GiB Windows host, the median per-pose ordinary wall time is 5.558 ms, versus 6.527 ms with event instrumentation. The median stage spans are:

CUDA event stream span Median per pose
Initialization 0.647 ms
Projection 1.772 ms
Visibility selection 0.297 ms
Histogram 1.162 ms

Events bracket launches in the current stream. Their spans include scheduling and possible host enqueue gaps, and instrumentation changes latency. These are not pure kernel execution times. Do not subtract them from ordinary wall time or use them as an Amdahl speedup ceiling. The current evidence prioritizes further investigation of projection and histogram work; it does not establish that either proposed optimization will improve full pipeline latency.

Verification/loading (2.396 s), CUDA preparation (0.229 s), and warmups are excluded from samples and recorded separately. The prepared cache holds 152,695,584 bytes and uploads no input arrays during evaluation. Working memory and allocator pools are additional. Background user CPU work remains active; all raw timings are retained, without a confidence or portability claim.

The uncached smoke run uses the same command with --cuda-cache-mib 0, --repeats 1 --poses-per-repeat 1 --warmup-poses 0 and a different output directory. Both evaluations match NumPy. It validates instrumentation with per-call uploads; its cold, single-sample timings are not a cache speed comparison.

Both definitions and aggregates validate against the existing benchmark schemas. The aggregates are recomputed from their definitions before publication. Source hashes bind actual measured worktree bytes (some existing sources have CRLF); the tool's measured Git LF bytes match the worktree bytes. Publication replaces the absolute workspace prefix in commands with <workspace> only.

Original report SHA-256 before path normalization:

Published file Original SHA-256
cached.definition.json 146e5e63ec1250a482dd53b5d9ac516cf95587617c0a97f7b2f347e4e4235c69
cached.benchmark.json eab6827a807508c99695f2c93af1e7e5ea56389ff028e3a0a2fc63f1fa2648b0
uncached-smoke.definition.json d458472dc91cd920c27539d854e6467c2780e15b8e82b4af480a5797ec82e2a1
uncached-smoke.benchmark.json 2607ceea0d8aca16f42482fc851c9cc40a11ecff5fed25bc1a1eaee22c73084e