weirflow 0.1.0

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

// ------------------------------------------------------------------
// 11. Repeated sequence dispatch success
// ------------------------------------------------------------------

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

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

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

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

#[test]
fn ifds_vyre_resident_repeated_one_prefix_one_repeated_repeat_2() {
    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_repeated_sequence_read_ranges_into(
        &[(&p, &[r.clone()], Some([2, 1, 1]))],
        &[(&p, &[r.clone()], Some([4, 1, 1]))],
        2,
        &[(&r, 0, 8)],
        &mut [&mut out],
    )
    .unwrap();
    assert_eq!(b.dispatch_count(), 3);
    let d = b.take_dispatches();
    assert_eq!(d[0].grid_override, Some([2, 1, 1]));
    assert_eq!(d[1].grid_override, Some([4, 1, 1]));
    assert_eq!(d[2].grid_override, Some([4, 1, 1]));
}

#[test]
fn ifds_vyre_resident_repeated_err_in_prefix() {
    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: "prefix fail".into(),
    });
    let mut out = Vec::new();
    let err = a
        .dispatch_resident_repeated_sequence_read_ranges_into(
            &[(&p, &[r.clone()], None)],
            &[],
            0,
            &[(&r, 0, 8)],
            &mut [&mut out],
        )
        .unwrap_err();
    assert!(err.contains("prefix fail"));
}

#[test]
fn ifds_vyre_resident_repeated_err_in_repeated() {
    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: "repeat fail".into(),
    });
    let mut out = Vec::new();
    let err = a
        .dispatch_resident_repeated_sequence_read_ranges_into(
            &[],
            &[(&p, &[r.clone()], None)],
            1,
            &[(&r, 0, 8)],
            &mut [&mut out],
        )
        .unwrap_err();
    assert!(err.contains("repeat fail"));
}

#[test]
fn ifds_vyre_resident_repeated_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::UnsupportedFeature {
        name: "ranges".into(),
    });
    let mut out = Vec::new();
    let err = a
        .dispatch_resident_repeated_sequence_read_ranges_into(
            &[],
            &[(&p, &[r.clone()], None)],
            1,
            &[(&r, 0, 8)],
            &mut [&mut out],
        )
        .unwrap_err();
    assert!(err.contains("ranges"));
}

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