weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
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]
    );
}