use cudarc::driver::CudaSlice;
use crate::device::KaioDevice;
use crate::error::Result;
pub struct GpuBuffer<T> {
inner: CudaSlice<T>,
}
impl<T> GpuBuffer<T> {
pub(crate) fn from_raw(inner: CudaSlice<T>) -> Self {
Self { inner }
}
pub fn len(&self) -> usize {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.len() == 0
}
pub fn inner(&self) -> &CudaSlice<T> {
&self.inner
}
pub fn inner_mut(&mut self) -> &mut CudaSlice<T> {
&mut self.inner
}
}
impl<T: cudarc::driver::DeviceRepr + Default + Clone + Unpin> GpuBuffer<T> {
pub fn to_host(&self, device: &KaioDevice) -> Result<Vec<T>> {
Ok(device.stream().clone_dtoh(&self.inner)?)
}
}