use super::*;
#[test]
fn cuda_ifds_resident_parallel_batch_solve_matches_cpu() {
let backend = live_dispatcher();
let borrowed = run_dispatch(&backend);
let resident = CudaResidentIfds { backend: &backend };
let intra = vec![(0u32, 0u32, 1u32), (0, 1, 2), (0, 2, 3)];
let seed_a = vec![(0u32, 0u32, 0u32)];
let seed_b = vec![(0u32, 1u32, 0u32)];
let seed_c = vec![(0u32, 2u32, 0u32)];
let cpu_a = solve_cpu(1, 4, 1, &intra, &[], &[], &[], &seed_a);
let cpu_b = solve_cpu(1, 4, 1, &intra, &[], &[], &[], &seed_b);
let cpu_c = solve_cpu(1, 4, 1, &intra, &[], &[], &[], &seed_c);
let prepared =
prepare_ifds_csr_resident_via(&borrowed, &resident, 1, 4, 1, &intra, &[], &[], &[])
.expect("resident IFDS CSR prepare");
let gpu = solve_resident_prepared_many_parallel_via(
&resident,
&prepared,
&[&seed_a[..], &seed_b[..], &seed_c[..]],
32,
);
free_resident_prepared_ifds_csr(&resident, prepared).expect("resident IFDS CSR free");
assert_eq!(
gpu.expect("parallel resident IFDS batch solve"),
vec![cpu_a, cpu_b, cpu_c]
);
}
#[test]
fn cuda_ifds_resident_parallel_batch_reusable_scratch_matches_cpu() {
let backend = live_dispatcher();
let borrowed = run_dispatch(&backend);
let resident = CudaResidentIfds { backend: &backend };
let intra = vec![(0u32, 0u32, 1u32), (0, 1, 2), (0, 2, 3)];
let seed_a = vec![(0u32, 0u32, 0u32)];
let seed_b = vec![(0u32, 1u32, 0u32)];
let seed_c = vec![(0u32, 2u32, 0u32)];
let cpu_a = solve_cpu(1, 4, 1, &intra, &[], &[], &[], &seed_a);
let cpu_b = solve_cpu(1, 4, 1, &intra, &[], &[], &[], &seed_b);
let cpu_c = solve_cpu(1, 4, 1, &intra, &[], &[], &[], &seed_c);
let prepared =
prepare_ifds_csr_resident_via(&borrowed, &resident, 1, 4, 1, &intra, &[], &[], &[])
.expect("resident IFDS CSR prepare");
let scratch = allocate_resident_ifds_parallel_scratch(&resident, &prepared, 3)
.expect("parallel resident IFDS scratch allocation");
let first = solve_resident_prepared_many_parallel_with_scratch_via(
&resident,
&prepared,
&scratch,
&[&seed_a[..], &seed_b[..]],
32,
);
let second = solve_resident_prepared_many_parallel_with_scratch_via(
&resident,
&prepared,
&scratch,
&[&seed_c[..]],
32,
);
free_resident_ifds_parallel_scratch(&resident, scratch)
.expect("parallel resident IFDS scratch free");
free_resident_prepared_ifds_csr(&resident, prepared).expect("resident IFDS CSR free");
assert_eq!(
first.expect("first reusable parallel resident IFDS batch solve"),
vec![cpu_a, cpu_b]
);
assert_eq!(
second.expect("second reusable parallel resident IFDS batch solve"),
vec![cpu_c]
);
}