vyre-runtime 0.6.3

Persistent megakernel + io_uring zero-copy streaming runtime for vyre - GPU as VIR0 bytecode interpreter
Documentation
use super::*;

#[test]
fn readback_borrowed_into_decodes_into_caller_storage() {
    let backend = Arc::new(EchoBackend);
    let kernel = Megakernel::bootstrap_sharded(backend, 1, 1, Vec::new())
        .expect("Fix: echo backend must compile megakernel");
    let control = Megakernel::try_encode_control(false, 1, 0).unwrap();
    let ring = Megakernel::try_encode_empty_ring(1).unwrap();
    let debug = Megakernel::try_encode_empty_debug_log(protocol::debug::RECORD_CAPACITY).unwrap();
    let io_queue = io::try_encode_empty_io_queue(io::IO_SLOT_COUNT).unwrap();
    let mut readback = MegakernelReadback::default();
    let mut outputs = Vec::with_capacity(4);

    let stats = kernel
        .dispatch_with_io_queue_readback_borrowed_into(
            &control,
            &ring,
            &debug,
            &io_queue,
            &mut readback,
            &mut outputs,
        )
        .expect("Fix: readback into caller storage must decode echoed ABI buffers");

    assert_eq!(outputs.len(), 4);
    assert!(
        outputs.iter().all(Vec::is_empty),
        "Fix: readback decode must leave reusable output slots empty after swapping bytes into MegakernelReadback."
    );
    assert!(
        outputs.capacity() >= 4,
        "Fix: readback decode must preserve caller output-vector capacity across dispatches."
    );
    assert_eq!(stats.output_buffers, 4);
    assert_eq!(stats.readback_bytes, stats.output_bytes);
    assert_eq!(
        stats.bytes_moved,
        stats.input_bytes.saturating_add(stats.readback_bytes)
    );
    assert_eq!(
        stats.device_allocation_bytes,
        stats.input_bytes.saturating_add(stats.output_bytes)
    );
    assert_eq!(stats.device_allocation_events, 8);
    assert_eq!(stats.kernel_launches, 1);
    assert_eq!(stats.sync_points, 1);
    assert_eq!(readback.control_bytes, control);
    assert_eq!(readback.ring_bytes, ring);
    assert_eq!(readback.debug_log_bytes, debug);
    assert_eq!(readback.io_queue_bytes, io_queue);
}

#[test]
fn readback_owned_into_uses_caller_storage() {
    let backend = Arc::new(EchoBackend);
    let kernel = Megakernel::bootstrap_sharded(backend, 1, 1, Vec::new())
        .expect("Fix: echo backend must compile megakernel");
    let control = Megakernel::try_encode_control(false, 1, 0).unwrap();
    let ring = Megakernel::try_encode_empty_ring(1).unwrap();
    let debug = Megakernel::try_encode_empty_debug_log(protocol::debug::RECORD_CAPACITY).unwrap();
    let io_queue = io::try_encode_empty_io_queue(io::IO_SLOT_COUNT).unwrap();
    let mut readback = MegakernelReadback::default();
    let mut outputs = Vec::with_capacity(4);

    let stats = kernel
        .dispatch_with_io_queue_readback_into(
            control.clone(),
            ring.clone(),
            debug.clone(),
            io_queue.clone(),
            &mut readback,
            &mut outputs,
        )
        .expect("Fix: owned readback-into dispatch must decode echoed ABI buffers");

    assert_eq!(outputs.len(), 4);
    assert!(
        outputs.iter().all(Vec::is_empty),
        "Fix: owned readback-into dispatch must leave caller output slots reusable after decode."
    );
    assert!(
        outputs.capacity() >= 4,
        "Fix: owned readback-into dispatch must preserve caller output-vector capacity."
    );
    assert_eq!(stats.output_buffers, 4);
    assert_eq!(stats.kernel_launches, 1);
    assert_eq!(stats.sync_points, 1);
    assert_eq!(readback.control_bytes, control);
    assert_eq!(readback.ring_bytes, ring);
    assert_eq!(readback.debug_log_bytes, debug);
    assert_eq!(readback.io_queue_bytes, io_queue);
}