weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
use super::*;

// ------------------------------------------------------------------
// 10. Sequence dispatch success
// ------------------------------------------------------------------

#[test]
fn ifds_vyre_resident_sequence_zero_steps_zero_ranges() {
    let b = backend();
    let a = adapter(&b);
    a.dispatch_resident_sequence_read_ranges_into(&[], &[], &mut [])
        .unwrap();
    assert_eq!(b.dispatch_count(), 0);
}

#[test]
fn ifds_vyre_resident_sequence_one_step_zero_ranges() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let p = program();
    a.dispatch_resident_sequence_read_ranges_into(&[(&p, &[r], None)], &[], &mut [])
        .unwrap();
    assert_eq!(b.dispatch_count(), 1);
}

#[test]
fn ifds_vyre_resident_sequence_zero_steps_one_range() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let mut out = Vec::new();
    a.dispatch_resident_sequence_read_ranges_into(&[], &[(&r, 0, 8)], &mut [&mut out])
        .unwrap();
    assert_eq!(b.dispatch_count(), 0);
    assert_eq!(out.len(), 8);
}

#[test]
fn ifds_vyre_resident_sequence_one_step_one_range() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let p = program();
    let mut out = Vec::new();
    a.dispatch_resident_sequence_read_ranges_into(
        &[(&p, &[r.clone()], None)],
        &[(&r, 0, 8)],
        &mut [&mut out],
    )
    .unwrap();
    assert_eq!(b.dispatch_count(), 1);
    assert_eq!(out.len(), 8);
}

#[test]
fn ifds_vyre_resident_sequence_three_steps_two_ranges() {
    let b = backend();
    let a = adapter(&b);
    let r1 = a.allocate_resident(64).unwrap();
    let r2 = a.allocate_resident(64).unwrap();
    let p = program();
    let mut out1 = Vec::new();
    let mut out2 = Vec::new();
    a.dispatch_resident_sequence_read_ranges_into(
        &[
            (&p, &[r1.clone()], Some([4, 1, 1])),
            (&p, &[r2.clone()], Some([8, 1, 1])),
            (&p, &[r1.clone(), r2.clone()], None),
        ],
        &[(&r1, 0, 8), (&r2, 16, 8)],
        &mut [&mut out1, &mut out2],
    )
    .unwrap();
    assert_eq!(b.dispatch_count(), 3);
    let dispatches = b.take_dispatches();
    assert_eq!(dispatches[0].grid_override, Some([4, 1, 1]));
    assert_eq!(dispatches[1].grid_override, Some([8, 1, 1]));
    assert_eq!(dispatches[2].grid_override, None);
}

#[test]
fn ifds_vyre_resident_sequence_err_in_step() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let p = program();
    b.inject_next_dispatch(InjectedFailure::DispatchFailed {
        code: None,
        message: "seq step fail".into(),
    });
    let mut out = Vec::new();
    let err = a
        .dispatch_resident_sequence_read_ranges_into(
            &[(&p, &[r.clone()], None)],
            &[(&r, 0, 8)],
            &mut [&mut out],
        )
        .unwrap_err();
    assert!(err.contains("seq step fail"));
}

#[test]
fn ifds_vyre_resident_sequence_err_in_readback() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let p = program();
    b.inject_next_download(InjectedFailure::InvalidProgram {
        fix: "Fix: bad range".into(),
    });
    let mut out = Vec::new();
    let err = a
        .dispatch_resident_sequence_read_ranges_into(
            &[(&p, &[r.clone()], None)],
            &[(&r, 0, 8)],
            &mut [&mut out],
        )
        .unwrap_err();
    assert!(err.contains("Fix: bad range"));
}

#[test]
fn ifds_vyre_resident_sequence_empty_ranges_no_outputs() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let p = program();
    a.dispatch_resident_sequence_read_ranges_into(&[(&p, &[r], None)], &[], &mut [])
        .unwrap();
    assert_eq!(b.dispatch_count(), 1);
}