libmir-cuda 0.3.0

CUDA inference backend for libmir
use mircuda::{DeviceBuffer, bf16};

use self::candidate::Candidate;
use super::{AffineQuantizedConfig, AffineQuantizedWeight, CudaBackend};
use crate::{Result, backend::tuning::QuantizedProfileRequest};

mod candidate;
mod tuning;

#[derive(Debug)]
pub(in crate::backend) struct AffineProjection {
    operation: Candidate,
}

impl AffineProjection {
    #[allow(clippy::too_many_arguments)]
    pub(in crate::backend) fn new(
        backend: &CudaBackend,
        tokens: usize,
        input: usize,
        output: usize,
        group_size: usize,
        bits: usize,
        weights: &AffineQuantizedWeight,
    ) -> Result<Self> {
        weights.validate(1, input, output, group_size, bits)?;
        let config = AffineQuantizedConfig::new(input, output, group_size, bits);
        let request = QuantizedProfileRequest::affine(tokens, input, output, group_size, bits);
        let operation = tuning::prepare(backend, request, tokens, config, weights)?;
        Ok(Self { operation })
    }

    pub(in crate::backend) fn execute(
        &self,
        input: &DeviceBuffer<bf16>,
        weights: &AffineQuantizedWeight,
        output: &mut DeviceBuffer<bf16>,
    ) -> Result<()> {
        self.operation.execute(input, weights, output)
    }
}