libmir-cuda 0.3.0

CUDA inference backend for libmir
use super::*;

#[test]
fn attention_policy_selects_tuned_sm12_split_kv() -> Result<()> {
    let request = AttentionPlanRequest {
        max_context_tokens: 4_096,
        query_heads: 32,
        kv_heads: 8,
        head_dim: 128,
        value_head_dim: 128,
    };
    let tuned = planner(12)?.plan_attention(request)?;
    assert_eq!(
        tuned.execution(),
        AttentionExecution::SplitKv {
            partition_tokens: 256,
            threshold_tokens: 65
        }
    );
    assert_eq!(tuned.source(), PlanSource::Heuristic);
    let tensor = AttentionPlanRequest {
        head_dim: 64,
        value_head_dim: 64,
        ..request
    };
    assert_eq!(
        planner(12)?.plan_attention(tensor)?.execution(),
        AttentionExecution::SplitKv {
            partition_tokens: 384,
            threshold_tokens: 65
        }
    );
    let mha = AttentionPlanRequest { kv_heads: request.query_heads, ..request };
    assert_eq!(
        planner(12)?.plan_attention(mha)?.execution(),
        AttentionExecution::SplitKv {
            partition_tokens: 64,
            threshold_tokens: 65
        }
    );
    assert_eq!(planner(11)?.plan_attention(request)?.execution(), AttentionExecution::Direct);
    let wide = AttentionPlanRequest {
        head_dim: 256,
        value_head_dim: 256,
        ..request
    };
    assert_eq!(
        planner(12)?.plan_attention(wide)?.execution(),
        AttentionExecution::SplitKv {
            partition_tokens: 256,
            threshold_tokens: 512
        }
    );
    let direct = planner_with_policy(
        12,
        CudaPlanningPolicy {
            attention: CudaAttentionPolicy::Direct,
            ..CudaPlanningPolicy::default()
        },
    )?;
    assert_eq!(direct.plan_attention(request)?.execution(), AttentionExecution::Direct);
    let explicit = planner_with_policy(
        11,
        CudaPlanningPolicy {
            attention: CudaAttentionPolicy::SplitKv {
                partition_tokens: 128,
                threshold_tokens: 384,
            },
            ..CudaPlanningPolicy::default()
        },
    )?;
    assert_eq!(
        explicit.plan_attention(request)?.execution(),
        AttentionExecution::SplitKv {
            partition_tokens: 128,
            threshold_tokens: 384
        }
    );
    Ok(())
}