use std::any::Any;
#[cfg(feature = "cuda")]
use crate::frameworks::cuda::DriverError as CudaError;
#[cfg(feature = "native")]
use crate::frameworks::native::Error as NativeError;
use crate::hardware::IHardware;
#[cfg(feature = "opencl")]
use frameworks::opencl::Error as OpenCLError;
use std::{error, fmt};
pub trait IMemory {}
pub trait IDevice
where
Self: Any + Clone + Eq + Any + MemorySync,
{
type H: IHardware;
type M: IMemory + Any;
fn id(&self) -> &isize;
fn hardwares(&self) -> &Vec<Self::H>;
fn alloc_memory(&self, size: usize) -> Result<Self::M, Error>;
}
pub trait MemorySync {
fn sync_in(
&self,
my_memory: &mut dyn Any,
src_device: &dyn Any,
src_memory: &dyn Any,
) -> Result<(), Error>;
fn sync_out(
&self,
my_memory: &dyn Any,
dst_device: &dyn Any,
dst_memory: &mut dyn Any,
) -> Result<(), Error>;
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Error {
NoMemorySyncRoute,
MemorySyncError,
MemoryAllocationError,
#[cfg(feature = "native")]
Native(NativeError),
#[cfg(feature = "opencl")]
OpenCL(OpenCLError),
#[cfg(feature = "cuda")]
Cuda(CudaError),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let msg = match *self {
Error::NoMemorySyncRoute => "No available memory synchronization route".to_string(),
Error::MemorySyncError => "Memory synchronization failed".to_string(),
Error::MemoryAllocationError => "Memory allocation failed".to_string(),
#[cfg(feature = "native")]
Error::Native(ref err) => format!("Native error: {}", err.to_string()),
#[cfg(feature = "opencl")]
Error::OpenCL(ref err) => format!("OpenCL error: {}", err.to_string()),
#[cfg(feature = "cuda")]
Error::Cuda(ref err) => format!("Cuda error: {}", err.to_string()),
};
write!(f, "{}", msg)
}
}
impl error::Error for Error {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match *self {
Error::NoMemorySyncRoute => None,
Error::MemorySyncError => None,
Error::MemoryAllocationError => None,
#[cfg(feature = "native")]
Error::Native(ref err) => Some(err),
#[cfg(feature = "opencl")]
Error::OpenCL(ref err) => Some(err),
#[cfg(feature = "cuda")]
Error::Cuda(ref err) => Some(err),
}
}
}
#[cfg(feature = "native")]
impl From<NativeError> for Error {
fn from(err: NativeError) -> Error {
Error::Native(err)
}
}
#[cfg(feature = "opencl")]
impl From<OpenCLError> for Error {
fn from(err: OpenCLError) -> Error {
Error::OpenCL(err)
}
}
#[cfg(feature = "cuda")]
impl From<CudaError> for Error {
fn from(err: CudaError) -> Error {
Error::Cuda(err)
}
}