libmir-cuda 0.1.0

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

use super::CudaBackend;
use crate::Result;

impl CudaBackend {
    pub(crate) fn read_token(&self, token: &DeviceBuffer<u32>) -> Result<u32> {
        let mut host = self.inner.context.allocate_pinned::<u32>(1)?;
        self.inner.stream.copy_to_host(token, &mut host)?;
        Ok(host.to_vec()?[0])
    }

    pub(crate) fn read_tokens(&self, tokens: &DeviceBuffer<u32>) -> Result<Vec<u32>> {
        let mut host = self.inner.context.allocate_pinned::<u32>(tokens.len())?;
        self.inner.stream.copy_to_host(tokens, &mut host)?;
        Ok(host.to_vec()?)
    }

    pub(crate) fn read_logits(&self, logits: &DeviceBuffer<bf16>) -> Result<Vec<f32>> {
        let mut host = self.inner.context.allocate_pinned::<bf16>(logits.len())?;
        self.inner.stream.copy_to_host(logits, &mut host)?;
        Ok(host.to_vec()?.into_iter().map(bf16::to_f32).collect())
    }
}