use std::time::Duration;
use oxiphysics_gpu::{
compute::cuda_backend::CudaBackend,
gpu_bench::{GpuBenchHarness, compute_cuda_speedup},
};
#[test]
fn cuda_stub_roundtrip() {
let _ = CudaBackend::try_new(0);
let mut h = GpuBenchHarness {
warmup: 0,
iterations: 1,
reports: Vec::new(),
};
let reports = h.cpu_vs_cuda_sph(512);
assert!(
!reports.is_empty(),
"cpu_vs_cuda_sph must return at least one report"
);
assert!(
reports[0].name.contains("sph_density"),
"report name should contain 'sph_density', got: {}",
reports[0].name
);
assert!(
reports[0].mean > Duration::ZERO,
"CPU mean time must be positive, got {:?}",
reports[0].mean
);
let sr = compute_cuda_speedup(&reports);
assert!(
sr.cpu_mean > Duration::ZERO,
"cpu_mean should be positive in the speedup report"
);
assert!(
sr.cuda_mean.is_none() || sr.cuda_mean.unwrap() > Duration::ZERO,
"cuda_mean, if present, must be positive"
);
}
#[test]
fn cuda_sph_speedup_at_100k() {
if std::env::var("OXIPHYSICS_CUDA_BENCH").as_deref() != Ok("1") {
return;
}
let mut h = GpuBenchHarness {
warmup: 2,
iterations: 5,
reports: Vec::new(),
};
let reports = h.cpu_vs_cuda_sph(100_000);
assert!(
reports.len() >= 2,
"expected CPU + CUDA reports, got {} (is CUDA hardware present?)",
reports.len()
);
let sr = compute_cuda_speedup(&reports);
let speedup = sr
.speedup
.expect("CUDA report present but no speedup computed");
assert!(
speedup >= 5.0,
"expected ≥ 5× CUDA speedup over CPU at N=100k, got {speedup:.2}×"
);
}