cu-embed 0.1.1

Compile CUDA kernels with nvcc, embed cubin/PTX artifacts, and load the best module at runtime.
use serde::{Deserialize, Serialize};

pub const ASSET_ENV_VAR: &str = "CU_EMBED_ASSET_DIR";
pub const ARCH_ENV_VAR: &str = "CU_EMBED_CUDA_ARCHES";
pub const PTX_ARCH_ENV_VAR: &str = "CU_EMBED_PTX_ARCH";
pub const MANIFEST_FILE_NAME: &str = "cu-embed-manifest.json";

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Manifest {
    pub version: u32,
    pub kernels: Vec<KernelManifest>,
}

impl Manifest {
    pub fn kernel(&self, name: &str) -> Option<&KernelManifest> {
        self.kernels.iter().find(|kernel| kernel.name == name)
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KernelManifest {
    pub name: String,
    pub source: String,
    pub ptx: String,
    pub cubins: Vec<CubinManifest>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CubinManifest {
    pub arch: String,
    pub file: String,
}