#include "isaac/driver/handle.h" #include namespace isaac { namespace driver { #ifdef ISAAC_WITH_CUDA template void Handle::_delete(CUcontext x) { cuCtxDestroy(x); } template void Handle::_delete(CUdeviceptr x) { cuMemFree(x); } template void Handle::_delete(CUstream x) { cuStreamDestroy(x); } template void Handle::_delete(CUdevice) { } template void Handle::_delete(CUevent x) { cuEventDestroy(x); } template void Handle::_delete(CUfunction) { } template void Handle::_delete(CUmodule x) { cuModuleUnload(x); } template void Handle::_delete(std::pair x) { _delete(x.first); _delete(x.second); } #endif template Handle::Handle(backend_type backend): backend_(backend) { switch(backend_) { #ifdef ISAAC_WITH_CUDA case CUDA: cu.reset(new CUType()); #endif case OPENCL: cl.reset(new CLType()); } } template bool Handle::operator==(Handle const & other) const { #ifdef ISAAC_WITH_CUDA if(backend_==CUDA && other.backend_==CUDA) return (*cu)==(*other.cu); #endif if(backend_==OPENCL && other.backend_==OPENCL) return (*cl)()==(*other.cl)(); return false; } template bool Handle::operator<(Handle const & other) const { #ifdef ISAAC_WITH_CUDA if(backend_==CUDA && other.backend_==CUDA) return (*cu)<(*other.cu); #endif if(backend_==OPENCL && other.backend_==OPENCL) return (*cl)()<(*other.cl)(); #ifdef ISAAC_WITH_CUDA if(backend_==CUDA && other.backend_==OPENCL) return true; #endif return false; } template Handle::~Handle() { if(cu && cu.unique()) { switch(backend_) { #ifdef ISAAC_WITH_CUDA case CUDA: _delete(*cu); break; #endif default: break; } } } #ifdef ISAAC_WITH_CUDA template class Handle; template class Handle; template class Handle; template class Handle; template class Handle >; template class Handle; template class Handle; #else template class Handle; template class Handle; template class Handle; template class Handle; template class Handle; template class Handle; template class Handle; #endif } }