libmir-cuda 0.3.0

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

use crate::{CudaBackend, Result};

#[derive(Debug)]
pub(super) struct Metadata {
    pub(super) host: Vec<u32>,
    staging: PinnedBuffer<u32>,
    pub(super) device: DeviceBuffer<u32>,
}

impl Metadata {
    pub(super) fn new(backend: &CudaBackend, len: usize, fill: u32) -> Result<Self> {
        Ok(Self {
            host: vec![fill; len],
            staging: backend.inner.context.allocate_pinned(len)?,
            device: backend.inner.pool.allocate(&backend.inner.stream, len)?,
        })
    }

    pub(super) fn upload(&mut self, stream: &Stream) -> Result<()> {
        self.staging.copy_from_slice(&self.host)?;
        Ok(stream.copy_to_device(&mut self.staging, &mut self.device)?)
    }
}