#![cfg(test)]
use vyre::DispatchConfig;
use vyre_driver_cuda::CudaBackend;
use weir::oracle::summary::summarize_function as summarize_function_cpu;
use weir::summary::summarize_function_borrowed_via;
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_summary_three_way_or() {
let backend = live_dispatcher();
let dispatch = run_dispatch(&backend);
let ast = vec![0b0001u32, 0];
let cg = vec![0b0010u32, 0b0100];
let cached = vec![0b1000u32, 0b1_0000];
let cpu = summarize_function_cpu(&ast, &cg, &cached, 64);
let gpu = summarize_function_borrowed_via(&dispatch, &ast, &cg, &cached, 64).expect("dispatch");
assert_eq!(gpu, cpu);
assert_eq!(gpu, vec![0b1011u32, 0b1_0100]);
}
#[test]
fn cuda_summary_all_zero_yields_zero() {
let backend = live_dispatcher();
let dispatch = run_dispatch(&backend);
let ast = vec![0u32];
let cg = vec![0u32];
let cached = vec![0u32];
let cpu = summarize_function_cpu(&ast, &cg, &cached, 32);
let gpu = summarize_function_borrowed_via(&dispatch, &ast, &cg, &cached, 32).expect("dispatch");
assert_eq!(gpu, cpu);
assert_eq!(gpu, vec![0u32]);
}
#[test]
fn cuda_summary_only_cached_propagates() {
let backend = live_dispatcher();
let dispatch = run_dispatch(&backend);
let ast = vec![0u32];
let cg = vec![0u32];
let cached = vec![0xDEADu32];
let cpu = summarize_function_cpu(&ast, &cg, &cached, 32);
let gpu = summarize_function_borrowed_via(&dispatch, &ast, &cg, &cached, 32).expect("dispatch");
assert_eq!(gpu, cpu);
assert_eq!(gpu, vec![0xDEADu32]);
}
#[test]
fn cuda_summary_full_overlap_idempotent() {
let backend = live_dispatcher();
let dispatch = run_dispatch(&backend);
let v = vec![0xFFFF_FFFFu32, 0xFFFF_FFFF];
let cpu = summarize_function_cpu(&v, &v, &v, 64);
let gpu = summarize_function_borrowed_via(&dispatch, &v, &v, &v, 64).expect("dispatch");
assert_eq!(gpu, cpu);
assert_eq!(gpu, vec![0xFFFF_FFFFu32, 0xFFFF_FFFF]);
}