use crate::error::Result;
use crate::types::{DataType, IoVec, ReduceOp};
pub trait DeviceAdapter: Send + Sync {
fn supports_host_offload(&self) -> bool {
false
}
unsafe fn stage_for_send(&self, ptr: u64, size_bytes: usize) -> Result<Vec<u8>>;
unsafe fn receive_to_device(&self, data: &[u8], dst_ptr: u64) -> Result<()>;
unsafe fn reduce_inplace(
&self,
dst_ptr: u64,
src: &[u8],
count: usize,
dtype: DataType,
op: ReduceOp,
) -> Result<()>;
unsafe fn stage_for_send_iov(&self, regions: &[IoVec]) -> Result<Vec<u8>> {
let total: usize = regions.iter().map(|r| r.len).sum();
let mut buf = Vec::with_capacity(total);
for region in regions {
let chunk = unsafe { self.stage_for_send(region.ptr, region.len)? };
buf.extend_from_slice(&chunk);
}
Ok(buf)
}
unsafe fn stage_for_send_on_stream(
&self,
ptr: u64,
size_bytes: usize,
_stream: u64,
) -> Result<Vec<u8>> {
unsafe { self.stage_for_send(ptr, size_bytes) }
}
unsafe fn receive_to_device_on_stream(
&self,
data: &[u8],
dst_ptr: u64,
_stream: u64,
) -> Result<()> {
unsafe { self.receive_to_device(data, dst_ptr) }
}
unsafe fn receive_to_device_iov(&self, data: &[u8], regions: &[IoVec]) -> Result<()> {
let mut offset = 0;
for region in regions {
unsafe {
self.receive_to_device(&data[offset..offset + region.len], region.ptr)?;
}
offset += region.len;
}
Ok(())
}
}