#![cfg(test)]
use vyre::DispatchConfig;
use vyre_driver_cuda::CudaBackend;
use weir::loop_sum::loop_summarize_borrowed_via;
use weir::oracle::summary::loop_summarize as loop_summarize_cpu;
fn run_dispatch(
backend: &CudaBackend,
) -> impl Fn(&vyre::ir::Program, &[&[u8]], Option<[u32; 3]>) -> Result<Vec<Vec<u8>>, String> + '_ {
move |program, inputs, grid_override| {
let mut config = DispatchConfig::default();
config.grid_override = grid_override;
backend
.dispatch_borrowed(program, inputs, &config)
.map_err(|err| err.to_string())
}
}
fn live_dispatcher() -> CudaBackend {
CudaBackend::acquire()
.expect("CudaBackend::acquire failed on a host that must have an NVIDIA GPU.")
}
#[test]
fn cuda_loop_summarize_widens_lo_to_neg_inf() {
let backend = live_dispatcher();
let dispatch = run_dispatch(&backend);
let cfg = vec![10u32, 20, 5, 10, 0, 100, 30, 40];
let ranges = vec![9u32, 25, 6, 9, 0, 90, 29, 41];
let cpu = loop_summarize_cpu(&cfg, &ranges, 4);
let gpu = loop_summarize_borrowed_via(&dispatch, &cfg, &ranges, 4).expect("dispatch");
assert_eq!(gpu, cpu);
assert_eq!(gpu, vec![0u32, u32::MAX, 5, 10, 0, 100, 0, u32::MAX]);
}
#[test]
fn cuda_loop_summarize_stable_intervals_kept() {
let backend = live_dispatcher();
let dispatch = run_dispatch(&backend);
let cfg = vec![5u32, 10, 100, 200];
let ranges = vec![5u32, 10, 100, 200];
let cpu = loop_summarize_cpu(&cfg, &ranges, 2);
let gpu = loop_summarize_borrowed_via(&dispatch, &cfg, &ranges, 2).expect("dispatch");
assert_eq!(gpu, cpu);
assert_eq!(gpu, cfg);
}
#[test]
fn cuda_loop_summarize_only_lo_widens() {
let backend = live_dispatcher();
let dispatch = run_dispatch(&backend);
let cfg = vec![10u32, 20];
let ranges = vec![5u32, 20];
let cpu = loop_summarize_cpu(&cfg, &ranges, 1);
let gpu = loop_summarize_borrowed_via(&dispatch, &cfg, &ranges, 1).expect("dispatch");
assert_eq!(gpu, cpu);
assert_eq!(gpu, vec![0u32, 20]);
}
#[test]
fn cuda_loop_summarize_only_hi_widens() {
let backend = live_dispatcher();
let dispatch = run_dispatch(&backend);
let cfg = vec![10u32, 20];
let ranges = vec![10u32, 30];
let cpu = loop_summarize_cpu(&cfg, &ranges, 1);
let gpu = loop_summarize_borrowed_via(&dispatch, &cfg, &ranges, 1).expect("dispatch");
assert_eq!(gpu, cpu);
assert_eq!(gpu, vec![10u32, u32::MAX]);
}