use hardware::IHardware;
use memory::{IMemory, MemoryType};
#[cfg(feature = "native")]
use frameworks::native::device::Cpu;
#[cfg(feature = "native")]
use frameworks::native::Error as NativeError;
#[cfg(feature = "opencl")]
use frameworks::opencl::Context as OpenCLContext;
#[cfg(feature = "opencl")]
use frameworks::opencl::Error as OpenCLError;
#[cfg(feature = "cuda")]
use frameworks::cuda::Context as CudaContext;
#[cfg(feature = "cuda")]
use frameworks::cuda::DriverError as CudaError;
use std::{fmt, error};
pub trait IDevice {
type H: IHardware;
type M: IMemory;
fn id(&self) -> &isize;
fn hardwares(&self) -> &Vec<Self::H>;
fn alloc_memory(&self, size: usize) -> Result<Self::M, Error>;
fn sync_in(&self, source: &DeviceType, source_data: &MemoryType, dest_data: &mut Self::M) -> Result<(), Error>;
}
pub trait IDeviceSyncOut<T: IMemory> {
type M: IMemory;
fn sync_out(&self, source_data: &Self::M, dest_data: &mut T) -> Result<(), Error>;
}
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
pub enum DeviceType {
#[cfg(feature = "native")]
Native(Cpu),
#[cfg(feature = "opencl")]
OpenCL(OpenCLContext),
#[cfg(feature = "cuda")]
Cuda(CudaContext),
}
#[derive(Debug, Copy, Clone)]
pub enum Error {
#[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 {
match *self {
#[cfg(feature = "native")]
Error::Native(ref err) => write!(f, "Native error: {}", err),
#[cfg(feature = "opencl")]
Error::OpenCL(ref err) => write!(f, "OpenCL error: {}", err),
#[cfg(feature = "cuda")]
Error::Cuda(ref err) => write!(f, "Cuda error: {}", err),
}
}
}
impl error::Error for Error {
fn description(&self) -> &str {
match *self {
#[cfg(feature = "native")]
Error::Native(ref err) => err.description(),
#[cfg(feature = "opencl")]
Error::OpenCL(ref err) => err.description(),
#[cfg(feature = "cuda")]
Error::Cuda(ref err) => err.description(),
}
}
fn cause(&self) -> Option<&error::Error> {
match *self {
#[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)
}
}
impl From<Error> for ::tensor::Error {
fn from(err: Error) -> ::tensor::Error {
::tensor::Error::MemoryAllocationError(err)
}
}