singe-kernel 0.1.0-alpha.4

Reusable CPU and GPU kernels.
Documentation
#![allow(dead_code)]

use cutile::tile_kernel::DevicePointer;

use crate::{
    error::{Error, Result},
    utility::checked_i32_value,
};

const RAW_VECTOR_TILE_SIZE: usize = 128;

pub fn checked_device_pointer<T>(pointer: DevicePointer<T>) -> Result<()> {
    if pointer.cu_deviceptr() == 0 {
        Err(Error::NullPointer)
    } else {
        Ok(())
    }
}

pub fn vector_tile_size(len: usize) -> usize {
    match len {
        0..=32 => 32,
        33..=64 => 64,
        65..=128 => 128,
        _ => 256,
    }
}

pub fn raw_vector_grid(len: usize) -> Result<(u32, u32, u32)> {
    let blocks = len.div_ceil(RAW_VECTOR_TILE_SIZE);
    let blocks = u32::try_from(blocks).map_err(|_| Error::SizeOverflow)?;
    Ok((blocks, 1, 1))
}

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct VectorLaunch {
    pub len: usize,
    pub len_i32: i32,
    pub grid: (u32, u32, u32),
}

impl VectorLaunch {
    pub fn create(len: usize) -> Result<Self> {
        Ok(Self {
            len,
            len_i32: checked_i32_value(len)?,
            grid: raw_vector_grid(len)?,
        })
    }
}