singe-kernel 0.1.0-alpha.4

Reusable CPU and GPU kernels.
Documentation
use std::{
    ffi::{c_int, c_void},
    sync::Arc,
};

use cutile::{
    cuda_async::device_buffer::DevicePointer,
    cuda_core::{Device, Stream as CutileStream},
};
use singe_cuda::{
    stream::Stream,
    view::{DeviceRepr, DeviceSlice, DeviceSliceMut},
};

use crate::error::Result;

#[allow(dead_code)]
pub fn borrowed_stream(stream: &Stream) -> Result<Arc<CutileStream>> {
    let context = stream.context();
    context.bind()?;
    let device = context.device();
    let cutile_device = unsafe {
        Device::borrow_raw(
            context.as_raw().cast::<c_void>(),
            device.id() as c_int,
            device.id() as usize,
        )
    };
    Ok(unsafe { CutileStream::borrow_raw(stream.as_raw().cast::<c_void>(), &cutile_device) })
}

#[allow(dead_code)]
pub fn input_pointer<T, S>(input: &S) -> DevicePointer<T>
where
    T: DeviceRepr,
    S: DeviceSlice<T> + ?Sized,
{
    unsafe { DevicePointer::from_cu_deviceptr(input.as_device_ptr() as _) }
}

#[allow(dead_code)]
pub fn output_pointer<T>(output: &mut impl DeviceSliceMut<T>) -> DevicePointer<T>
where
    T: DeviceRepr,
{
    unsafe { DevicePointer::from_cu_deviceptr(output.as_device_mut_ptr() as _) }
}