libmir-cuda 0.3.0

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

use super::ClampedRoutedLayerExecution;
use crate::{PagedKvCache, Result, kernels::ClampedRoutedSplitDecode};

impl ClampedRoutedLayerExecution {
    #[allow(clippy::too_many_arguments)]
    pub(super) fn attend(
        &self,
        cache: &PagedKvCache,
        current_keys: &DeviceBuffer<bf16>,
        current_values: &DeviceBuffer<bf16>,
        table: &BlockTable,
        table_device: &DeviceBuffer<u32>,
        sinks: &DeviceBuffer<bf16>,
        start: usize,
        query: &DeviceBuffer<bf16>,
        attended: &mut DeviceBuffer<bf16>,
        split_decode: &mut Option<ClampedRoutedSplitDecode>,
    ) -> Result<()> {
        let blocks = table.blocks().len();
        if self.tokens == 1 {
            if !cache.is_windowed()
                && let Some(split) = split_decode.as_mut()
            {
                split.ensure_tuned(
                    &self.attention,
                    &self.stream,
                    query,
                    cache.key_pages(),
                    cache.value_pages(),
                    table_device,
                    sinks,
                    attended,
                    table.token_len(),
                    blocks,
                    self.window,
                    self.config.scale,
                );
                if split.execute(
                    &self.stream,
                    query,
                    cache.key_pages(),
                    cache.value_pages(),
                    table_device,
                    sinks,
                    attended,
                    table.token_len(),
                    blocks,
                    self.window,
                    self.config.scale,
                )? {
                    return Ok(());
                }
            }
            self.attention.execute(
                &self.stream,
                query,
                current_keys,
                current_values,
                cache.key_pages(),
                cache.value_pages(),
                table_device,
                sinks,
                attended,
                table.token_len(),
                blocks,
                self.window,
                self.config.scale,
            )
        } else {
            self.attention.execute_prefill(
                &self.stream,
                query,
                current_keys,
                current_values,
                cache.key_pages(),
                cache.value_pages(),
                table_device,
                sinks,
                attended,
                self.tokens,
                start,
                blocks,
                self.window,
                self.config.scale,
            )
        }
    }
}