sim-lib-compute-wgpu 0.2.0

Evidence-based wgpu tensor compute site discovery for SIM.
Documentation
use super::*;

#[test]
fn adapter_evidence_records_requested_granted_and_failed_allocation_ceiling() {
    let mut probe = adapter_with_limits("alpha", "Vulkan", true, limits(8192));
    probe.probe.allocation_attempts.push(AllocationAttempt {
        bytes: probe.adapter.granted_limits.max_buffer_size + 1,
        success: false,
    });

    assert_eq!(probe.adapter.requested.limits.max_buffer_size, 4096);
    assert_eq!(probe.adapter.granted_limits.max_buffer_size, 8192);
    assert!(
        probe
            .probe
            .allocation_attempts
            .iter()
            .any(|attempt| attempt.success && attempt.bytes <= 8192)
    );
    assert!(
        probe
            .probe
            .allocation_attempts
            .iter()
            .any(|attempt| !attempt.success && attempt.bytes > 8192)
    );
}

#[test]
fn physical_submission_evidence_defaults_to_queue_observed_zeroes() {
    let executor = WgpuTensorExecutor::new(adapter("alpha", "Vulkan", true));
    let evidence = executor.physical_evidence();

    assert_eq!(evidence.submissions, 0);
    assert_eq!(evidence.uploaded_bytes, 0);
    assert_eq!(evidence.full_readbacks, 0);
    assert_eq!(evidence.scalar_syncs, 0);
    assert!(evidence.segments_touched.is_empty());
}

#[test]
fn physical_chained_pointwise_records_only_terminal_materialization() {
    if std::env::var_os("SIM_COMPUTE_WGPU_PHYSICAL").is_none() {
        return;
    }
    let mut cx = test_cx();
    let mut runtimes = discover_wgpu_adapter_runtimes(&Default::default()).unwrap();
    let runtime = runtimes
        .pop()
        .expect("SIM_COMPUTE_WGPU_PHYSICAL requires a probe-backed adapter");
    assert!(verify_physical(&runtime.probe).is_ok());
    let mut probe = runtime.probe;
    probe.adapter.granted_limits.max_storage_buffer_binding_size = 8;
    let executor = WgpuTensorExecutor::from_parts(
        probe,
        Some(WgpuExecutionContext {
            device: Arc::new(runtime.device),
            queue: Arc::new(runtime.queue),
        }),
    );
    let dtype = Symbol::qualified("numbers", "f32");
    let left = tensor(&mut cx, vec![4], &["1", "2", "3", "4"]);
    let right = tensor(&mut cx, vec![4], &["10", "20", "30", "40"]);
    let first = execute_wgpu(
        &mut cx,
        &executor,
        add_op_symbol(),
        vec![left, right],
        vec![4],
        dtype.clone(),
    );
    let before = executor.physical_evidence();
    let second = execute_wgpu(
        &mut cx,
        &executor,
        neg_op_symbol(),
        vec![first],
        vec![4],
        dtype,
    );
    let chained = executor.physical_evidence();
    assert_eq!(chained.full_readbacks, before.full_readbacks);
    assert!(chained.submissions > before.submissions);
    assert!(
        chained
            .segments_touched
            .iter()
            .filter(|range| range.bytes == 8)
            .count()
            >= 4
    );

    assert_eq!(f32_cells(&second), vec![-11.0, -22.0, -33.0, -44.0]);
    let terminal = executor.physical_evidence();
    assert_eq!(terminal.full_readbacks, chained.full_readbacks + 1);
}