libmir-cuda 0.3.0

CUDA inference backend for libmir
use mircuda::LaunchConfig;

use super::{DenseGateUpLayout, SelectedDenseMoeSpec};
use crate::{Result, kernels::geometry::narrow};

pub(super) fn gated(spec: SelectedDenseMoeSpec) -> Result<LaunchConfig> {
    let tiled = spec.gate_transposed
        && spec.up_transposed
        && spec.gate_up_layout == DenseGateUpLayout::FusedInterleaved;
    let (rows, block, shared_memory_bytes) = if tiled {
        (32, (32, 2, 1), 4 * 32 * size_of::<f32>())
    } else {
        (8, (32, 8, 1), 0)
    };
    Ok(LaunchConfig {
        grid: (
            narrow(spec.output_features.div_ceil(rows))?,
            narrow(spec.selected_count)?,
            narrow(spec.tokens)?,
        ),
        block,
        shared_memory_bytes: narrow(shared_memory_bytes)?,
    })
}

pub(super) fn reduce(spec: SelectedDenseMoeSpec) -> Result<LaunchConfig> {
    let tiled = spec.down_transposed;
    let (rows, shared_memory_bytes) = if tiled {
        (32, 8 * 32 * size_of::<f32>())
    } else {
        (8, 0)
    };
    Ok(LaunchConfig {
        grid: (narrow(spec.input_features.div_ceil(rows))?, narrow(spec.tokens)?, 1),
        block: (32, 8, 1),
        shared_memory_bytes: narrow(shared_memory_bytes)?,
    })
}

pub(super) fn project(spec: SelectedDenseMoeSpec) -> Result<LaunchConfig> {
    if !spec.down_transposed {
        return Ok(LaunchConfig {
            grid: (
                narrow(spec.input_features.div_ceil(8))?,
                narrow(spec.selected_count)?,
                narrow(spec.tokens)?,
            ),
            block: (32, 8, 1),
            shared_memory_bytes: 0,
        });
    }
    let rows = if spec.input_features.is_multiple_of(2) {
        64
    } else {
        32
    };
    let items = rows / 32;
    Ok(LaunchConfig {
        grid: (
            narrow(spec.input_features.div_ceil(rows))?,
            narrow(spec.selected_count)?,
            narrow(spec.tokens)?,
        ),
        block: (32, 8, 1),
        shared_memory_bytes: narrow(8 * items * 32 * size_of::<f32>())?,
    })
}

pub(super) fn finalize(spec: SelectedDenseMoeSpec) -> Result<LaunchConfig> {
    Ok(LaunchConfig {
        grid: (narrow(spec.input_features.div_ceil(256))?, narrow(spec.tokens)?, 1),
        block: (256, 1, 1),
        shared_memory_bytes: 0,
    })
}