libmir-cuda 0.3.0

CUDA inference backend for libmir
use super::*;

#[test]
fn automatic_prefill_keeps_safe_fallback_for_runtime_tuning() -> Result<()> {
    let request = DensePlanRequest {
        phase: ExecutionPhase::Prefill,
        role: DenseRole::AttentionQkv,
        tokens: 256,
        input_features: 3_072,
        output_features: 7_168,
    };
    for major in [11, 12] {
        let plan = planner(major)?.plan_dense(request)?;
        assert_eq!(plan.execution(), DenseExecution::Matrix);
        assert_eq!(plan.source(), PlanSource::Fallback);
    }
    Ok(())
}

#[test]
fn sm12_decode_heuristic_depends_on_operation_geometry() -> Result<()> {
    let sm12 = planner(12)?;
    let request = DensePlanRequest {
        phase: ExecutionPhase::Decode,
        role: DenseRole::AttentionQkv,
        tokens: 1,
        input_features: 3_072,
        output_features: 7_168,
    };
    for role in [
        DenseRole::AttentionQkv,
        DenseRole::AttentionOutput,
        DenseRole::Router,
        DenseRole::OutputHead,
    ] {
        let plan = sm12.plan_dense(DensePlanRequest { role, ..request })?;
        assert_eq!(plan.execution(), DenseExecution::Vector);
        assert_eq!(plan.source(), PlanSource::Heuristic);
    }
    assert_eq!(
        sm12.plan_dense(DensePlanRequest { role: DenseRole::DenseGateUp, ..request })?
            .execution(),
        DenseExecution::Matrix
    );
    assert_eq!(
        sm12.plan_dense(DensePlanRequest { tokens: 2, ..request })?.execution(),
        DenseExecution::Matrix
    );
    assert_eq!(planner(11)?.plan_dense(request)?.execution(), DenseExecution::Matrix);
    Ok(())
}

#[test]
fn explicit_vendor_policy_accepts_generic_aligned_geometry() -> Result<()> {
    let planner = planner_with_policy(
        12,
        CudaPlanningPolicy {
            numerical: CudaNumericalPolicy::Throughput,
            admission: CudaKernelAdmission::Experimental,
            dense_vendor: CudaDenseVendorPolicy::Tuned,
            ..CudaPlanningPolicy::default()
        },
    )?;
    let request = DensePlanRequest {
        phase: ExecutionPhase::Decode,
        role: DenseRole::DenseDown,
        tokens: 1,
        input_features: 3_072,
        output_features: 4_096,
    };
    for candidate in [
        request,
        DensePlanRequest {
            phase: ExecutionPhase::Prefill,
            tokens: 384,
            ..request
        },
        DensePlanRequest {
            role: DenseRole::Router,
            output_features: 64,
            ..request
        },
    ] {
        let plan = planner.plan_dense(candidate)?;
        assert_eq!(plan.execution(), DenseExecution::CublasLt);
        assert_eq!(plan.source(), PlanSource::ExplicitPolicy);
    }
    assert_eq!(
        planner
            .plan_dense(DensePlanRequest { input_features: 3_073, ..request })?
            .execution(),
        DenseExecution::Matrix
    );
    Ok(())
}