diff --git a/include/isaac/driver/common.h b/include/isaac/driver/common.h index 29e7a174f..5bcda3320 100644 --- a/include/isaac/driver/common.h +++ b/include/isaac/driver/common.h @@ -118,6 +118,7 @@ namespace cuda } void check(CUresult); +void check_destruction(CUresult); } diff --git a/include/isaac/driver/device.h b/include/isaac/driver/device.h index 0e990771b..fdccc8191 100644 --- a/include/isaac/driver/device.h +++ b/include/isaac/driver/device.h @@ -47,7 +47,6 @@ private: int cuGetInfo() const; public: -// Device(int ordinal); explicit Device(CUdevice const & device, bool take_ownership = true); explicit Device(cl_device_id const & device, bool take_ownership = true); diff --git a/lib/driver/check.cpp b/lib/driver/check.cpp index 42180bf15..4399968c8 100644 --- a/lib/driver/check.cpp +++ b/lib/driver/check.cpp @@ -97,6 +97,13 @@ void check(CUresult err) default : throw unknown(); } } + +void check_destruction(CUresult result) +{ + if(result!=CUDA_ERROR_DEINITIALIZED) + cuda::check(result); +} + } namespace ocl diff --git a/lib/driver/device.cpp b/lib/driver/device.cpp index 9ed9f9cb4..cba31f896 100644 --- a/lib/driver/device.cpp +++ b/lib/driver/device.cpp @@ -21,11 +21,6 @@ int Device::cuGetInfo() const return res; } -//Device::Device(int ordinal): backend_(CUDA), h_(backend_, true) -//{ -// cuda::check(dispatch::cuDeviceGet(&h_.cu(), ordinal)); -//} - Device::Device(CUdevice const & device, bool take_ownership): backend_(CUDA), h_(backend_, take_ownership) { h_.cu() = device; diff --git a/lib/driver/handle.cpp b/lib/driver/handle.cpp index 82304db7f..baa94fd08 100644 --- a/lib/driver/handle.cpp +++ b/lib/driver/handle.cpp @@ -9,27 +9,29 @@ namespace isaac namespace driver { + + //CUDA template -void Handle::_delete(CUcontext x) { cuda::check(dispatch::cuCtxDestroy(x)); } +void Handle::_delete(CUcontext x) { cuda::check_destruction(dispatch::cuCtxDestroy(x)); } template -void Handle::_delete(CUdeviceptr x) { cuda::check(dispatch::dispatch::cuMemFree(x)); } +void Handle::_delete(CUdeviceptr x) { cuda::check_destruction(dispatch::dispatch::cuMemFree(x)); } template -void Handle::_delete(CUstream x) { cuda::check(dispatch::cuStreamDestroy(x)); } +void Handle::_delete(CUstream x) { cuda::check_destruction(dispatch::cuStreamDestroy(x)); } template void Handle::_delete(CUdevice) { } template -void Handle::_delete(CUevent x) { cuda::check(dispatch::dispatch::cuEventDestroy(x)); } +void Handle::_delete(CUevent x) { cuda::check_destruction(dispatch::dispatch::cuEventDestroy(x)); } template void Handle::_delete(CUfunction) { } template -void Handle::_delete(CUmodule x) { cuda::check(dispatch::dispatch::cuModuleUnload(x)); } +void Handle::_delete(CUmodule x) { cuda::check_destruction(dispatch::dispatch::cuModuleUnload(x)); } template void Handle::_delete(cu_event_t x) { _delete(x.first); _delete(x.second); } diff --git a/lib/wrap/cublas.cpp b/lib/wrap/cublas.cpp index 3d2b20c7f..649b83234 100644 --- a/lib/wrap/cublas.cpp +++ b/lib/wrap/cublas.cpp @@ -30,8 +30,7 @@ extern "C" cublasStatus_t cublasDestroy_v2 (cublasHandle_t handle) { delete handle; - cublasShutdown(); - return CUBLAS_STATUS_SUCCESS; + return cublasShutdown(); } cublasStatus cublasInit()