Skip to content

Parallel CPU scan queries

ScanOdometryOptions(query_workers=8) runs independent nearest-neighbor query rows on eight CPU workers. This covers scan correspondence searches and both complete and lazy target-normal neighborhoods. SciPy retains the same query arithmetic, tie ordering and distance gates for each row. Normal estimation, robust systems, motion updates and convergence checks retain their existing implementation. The default is one query worker.

The joint bag CLI records the requested budget in its command provenance and serialized odometry options:

calibrex imu-lidar joint data/public/glim_versatile/livox.bag \
  --lidar-topic /livox/points --imu-topic /livox/imu --acceleration-unit g \
  --dataset-family glim_versatile --dataset-license "upstream AIST GLIM dataset terms" \
  --odometry-backend cpu --odometry-query-workers 8 \
  --max-seconds 6 --max-rounds 4 --output outputs/joint-parallel-cpu.json

Choose a worker budget for the available CPU. Extra threads are most useful for dense scans; small query batches can spend more time starting threads. This option controls native CPU searches and adds no dependency to the default core.

Complete public-data pilot

Scope One CPU query worker Eight CPU query workers Observed ratio
Complete worker 313.401 s 178.759 s 1.753x
Four fits, including covariance 18.110 s 17.913 s 1.011x

One fresh-process pair uses the same frozen sources with one versus eight CPU query workers. This is a preliminary fixed-order observation on an unreserved host. It does not establish a stable ratio or compare CPU threading with GPU execution. CPU fitting is unchanged; its timing variation belongs to whole time. Every initial/gyro/feedback pass and the final odometry segment are included.

The bound archive retains the full results, every fitted trajectory/covariance, original measurements and logs, input hash, both source capsules/manifests and the exact comparison launcher. Its CPU-only audit verifies physical results, decisions, common geometry, declared worker counts, executed source bytes and recomputed medians. The public clip supplies no independent extrinsic truth; its final verdict is INCONCLUSIVE.

Both workers use one BLAS thread, 0.03 m voxels, three local-map scans, a 1 nm coordinate grid and returned-motion grids of 1 micrometre translation and 0.1 microradian rotation-vector components. The coordinate and motion grids are explicit benchmark settings and remain disabled by default.

python -m tools.benchmark_bspline_lidar_imu --comparison cpu-cpu \
  --prior-query-workers 1 --current-query-workers 8 \
  --max-seconds 6 --max-rounds 4 --repeats 1 \
  --odometry-voxel-size-m .03 --odometry-local-map-scans 3 \
  --odometry-geometry-quantum-m 1e-9 \
  --odometry-motion-translation-quantum-m 1e-6 \
  --odometry-motion-rotation-quantum-rad 1e-7 \
  --output outputs/glim-cpu-query-workers
python -m tools.audit_bspline_lidar_imu_benchmark docs/assets/cpu_parallel_scan_queries

Use a new output directory and committed runtime sources. Both worker variants capture the same working-tree bytes, including their original line endings.

A later worker-reuse and parallel-PCA pilot did not demonstrate an additional complete-worker improvement and was rejected.

A later fused CPU covariance experiment retained SciPy neighborhoods and native NumPy eigenspaces, with both query budgets fixed at eight workers and first compilation included. It also failed to demonstrate a complete-worker gain and was rejected.