diff --git a/bioem_cuda.cu b/bioem_cuda.cu index e2be9e5c3bee492a6e4fc5f778bfcf3d815bf552..b00c0b5b00b3ae559413d0a1880398006b4f7c70 100644 --- a/bioem_cuda.cu +++ b/bioem_cuda.cu @@ -67,6 +67,75 @@ static const char *cufftGetErrorStrung(cufftResult error) return "UNKNOWN"; } +/* Handing CUDA Driver errors */ + +// Expand and stringify argument +#define STRINGx(x) #x +#define STRING(x) STRINGx(x) + +#define CU_ERROR_CHECK(call) \ + do { \ + CUresult __error__; \ + if ((__error__ = (call)) != CUDA_SUCCESS) { \ + printf(STRING(call), __func__, __FILE__, __LINE__, __error__, \ + (const char * (*)(int))cuGetError); \ + return __error__; \ + } \ + } while (false) + +static const char * cuGetError(CUresult result) { + switch (result) { + case CUDA_SUCCESS: return "No errors"; + case CUDA_ERROR_INVALID_VALUE: return "Invalid value"; + case CUDA_ERROR_OUT_OF_MEMORY: return "Out of memory"; + case CUDA_ERROR_NOT_INITIALIZED: return "Driver not initialized"; + case CUDA_ERROR_DEINITIALIZED: return "Driver deinitialized"; + case CUDA_ERROR_PROFILER_DISABLED: return "Profiler disabled"; + case CUDA_ERROR_PROFILER_NOT_INITIALIZED: return "Profiler not initialized"; + case CUDA_ERROR_PROFILER_ALREADY_STARTED: return "Profiler already started"; + case CUDA_ERROR_PROFILER_ALREADY_STOPPED: return "Profiler already stopped"; + case CUDA_ERROR_NO_DEVICE: return "No CUDA-capable device available"; + case CUDA_ERROR_INVALID_DEVICE: return "Invalid device"; + case CUDA_ERROR_INVALID_IMAGE: return "Invalid kernel image"; + case CUDA_ERROR_INVALID_CONTEXT: return "Invalid context"; + case CUDA_ERROR_CONTEXT_ALREADY_CURRENT: return "Context already current"; + case CUDA_ERROR_MAP_FAILED: return "Map failed"; + case CUDA_ERROR_UNMAP_FAILED: return "Unmap failed"; + case CUDA_ERROR_ARRAY_IS_MAPPED: return "Array is mapped"; + case CUDA_ERROR_ALREADY_MAPPED: return "Already mapped"; + case CUDA_ERROR_NO_BINARY_FOR_GPU: return "No binary for GPU"; + case CUDA_ERROR_ALREADY_ACQUIRED: return "Already acquired"; + case CUDA_ERROR_NOT_MAPPED: return "Not mapped"; + case CUDA_ERROR_NOT_MAPPED_AS_ARRAY: return "Not mapped as array"; + case CUDA_ERROR_NOT_MAPPED_AS_POINTER: return "Not mapped as pointer"; + case CUDA_ERROR_ECC_UNCORRECTABLE: return "Uncorrectable ECC error"; + case CUDA_ERROR_UNSUPPORTED_LIMIT: return "Unsupported CUlimit"; + case CUDA_ERROR_CONTEXT_ALREADY_IN_USE: return "Context already in use"; + case CUDA_ERROR_INVALID_SOURCE: return "Invalid source"; + case CUDA_ERROR_FILE_NOT_FOUND: return "File not found"; + case CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND: return "Shared object symbol not found"; + case CUDA_ERROR_SHARED_OBJECT_INIT_FAILED: return "Shared object initialization failed"; + case CUDA_ERROR_OPERATING_SYSTEM: return "Operating System call failed"; + case CUDA_ERROR_INVALID_HANDLE: return "Invalid handle"; + case CUDA_ERROR_NOT_FOUND: return "Not found"; + case CUDA_ERROR_NOT_READY: return "CUDA not ready"; + case CUDA_ERROR_LAUNCH_FAILED: return "Launch failed"; + case CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES: return "Launch exceeded resources"; + case CUDA_ERROR_LAUNCH_TIMEOUT: return "Launch exceeded timeout"; + case CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING: return "Launch with incompatible texturing"; + case CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED: return "Peer access already enabled"; + case CUDA_ERROR_PEER_ACCESS_NOT_ENABLED: return "Peer access not enabled"; + case CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE: return "Primary context active"; + case CUDA_ERROR_CONTEXT_IS_DESTROYED: return "Context is destroyed"; + case CUDA_ERROR_ASSERT: return "Device assert failed"; + case CUDA_ERROR_TOO_MANY_PEERS: return "Too many peers"; + case CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED: return "Host memory already registered"; + case CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED: return "Host memory not registered"; + case CUDA_ERROR_UNKNOWN: return "Unknown error"; + default: return "Unknown error code"; + } +} + bioem_cuda::bioem_cuda() { deviceInitialized = 0; diff --git a/include/bioem_cuda_internal.h b/include/bioem_cuda_internal.h index 4d792f66b43ba0a0fb3011baa5d6ac42ff8a4680..736b0b31f8c4d90e82d4d731a655425820d2cde8 100644 --- a/include/bioem_cuda_internal.h +++ b/include/bioem_cuda_internal.h @@ -73,76 +73,5 @@ private: int maxRef; }; -/* Handing CUDA Driver errors */ -/* Inspired from: https://github.com/garymacindoe/cuda-cholesky */ - -// Expand and stringify argument -#define STRINGx(x) #x -#define STRING(x) STRINGx(x) - -const char * cuGetError(CUresult result) { - switch (result) { - case CUDA_SUCCESS: return "No errors"; - case CUDA_ERROR_INVALID_VALUE: return "Invalid value"; - case CUDA_ERROR_OUT_OF_MEMORY: return "Out of memory"; - case CUDA_ERROR_NOT_INITIALIZED: return "Driver not initialized"; - case CUDA_ERROR_DEINITIALIZED: return "Driver deinitialized"; - case CUDA_ERROR_PROFILER_DISABLED: return "Profiler disabled"; - case CUDA_ERROR_PROFILER_NOT_INITIALIZED: return "Profiler not initialized"; - case CUDA_ERROR_PROFILER_ALREADY_STARTED: return "Profiler already started"; - case CUDA_ERROR_PROFILER_ALREADY_STOPPED: return "Profiler already stopped"; - case CUDA_ERROR_NO_DEVICE: return "No CUDA-capable device available"; - case CUDA_ERROR_INVALID_DEVICE: return "Invalid device"; - case CUDA_ERROR_INVALID_IMAGE: return "Invalid kernel image"; - case CUDA_ERROR_INVALID_CONTEXT: return "Invalid context"; - case CUDA_ERROR_CONTEXT_ALREADY_CURRENT: return "Context already current"; - case CUDA_ERROR_MAP_FAILED: return "Map failed"; - case CUDA_ERROR_UNMAP_FAILED: return "Unmap failed"; - case CUDA_ERROR_ARRAY_IS_MAPPED: return "Array is mapped"; - case CUDA_ERROR_ALREADY_MAPPED: return "Already mapped"; - case CUDA_ERROR_NO_BINARY_FOR_GPU: return "No binary for GPU"; - case CUDA_ERROR_ALREADY_ACQUIRED: return "Already acquired"; - case CUDA_ERROR_NOT_MAPPED: return "Not mapped"; - case CUDA_ERROR_NOT_MAPPED_AS_ARRAY: return "Not mapped as array"; - case CUDA_ERROR_NOT_MAPPED_AS_POINTER: return "Not mapped as pointer"; - case CUDA_ERROR_ECC_UNCORRECTABLE: return "Uncorrectable ECC error"; - case CUDA_ERROR_UNSUPPORTED_LIMIT: return "Unsupported CUlimit"; - case CUDA_ERROR_CONTEXT_ALREADY_IN_USE: return "Context already in use"; - case CUDA_ERROR_INVALID_SOURCE: return "Invalid source"; - case CUDA_ERROR_FILE_NOT_FOUND: return "File not found"; - case CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND: return "Shared object symbol not found"; - case CUDA_ERROR_SHARED_OBJECT_INIT_FAILED: return "Shared object initialization failed"; - case CUDA_ERROR_OPERATING_SYSTEM: return "Operating System call failed"; - case CUDA_ERROR_INVALID_HANDLE: return "Invalid handle"; - case CUDA_ERROR_NOT_FOUND: return "Not found"; - case CUDA_ERROR_NOT_READY: return "CUDA not ready"; - case CUDA_ERROR_LAUNCH_FAILED: return "Launch failed"; - case CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES: return "Launch exceeded resources"; - case CUDA_ERROR_LAUNCH_TIMEOUT: return "Launch exceeded timeout"; - case CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING: return "Launch with incompatible texturing"; - case CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED: return "Peer access already enabled"; - case CUDA_ERROR_PEER_ACCESS_NOT_ENABLED: return "Peer access not enabled"; - case CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE: return "Primary context active"; - case CUDA_ERROR_CONTEXT_IS_DESTROYED: return "Context is destroyed"; - case CUDA_ERROR_ASSERT: return "Device assert failed"; - case CUDA_ERROR_TOO_MANY_PEERS: return "Too many peers"; - case CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED: return "Host memory already registered"; - case CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED: return "Host memory not registered"; - case CUDA_ERROR_UNKNOWN: return "Unknown error"; - default: return "Unknown error code"; - } -} - -#define CU_ERROR_CHECK(call) \ - do { \ - CUresult __error__; \ - if ((__error__ = (call)) != CUDA_SUCCESS) { \ - printf(STRING(call), __func__, __FILE__, __LINE__, __error__, \ - (const char * (*)(int))cuGetError); \ - return __error__; \ - } \ - } while (false) - - #endif