Following the popular gpuErrchk solution what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime-api I have overloaded the function with a cuBLAS alternative to also handle cuBLAS errors. Then you can easily wrap your cuBLAS function calls with gpuErrchk as normal.
Judging from the helper_cuda.h file others have mentioned, it would be easy to keep adding overloaded functions for other cuda libraries (cuFFT, etc.). Hope this helps someone. Please tell me if there is a better way!
inline void error::gpuAssert(cudaError_t code, const char *file, int line, bool abort=true) const
{
if (code != cudaSuccess)
{
fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
if (abort) exit(code);
}
}
inline void error::gpuAssert(cublasStatus_t code, const char *file, int line, bool abort=true) const
{
if (code != CUBLAS_STATUS_SUCCESS)
{
switch (code) {
case CUBLAS_STATUS_NOT_INITIALIZED:
fprintf(stderr, "cuBLAS Error: CUBLAS_STATUS_NOT_INITIALIZED file: %s line: %d ", file, line);
break;
case CUBLAS_STATUS_ALLOC_FAILED:
fprintf(stderr, "cuBLAS Error: CUBLAS_STATUS_ALLOC_FAILED file: %s line: %d ", file, line);
break;
case CUBLAS_STATUS_INVALID_VALUE:
fprintf(stderr, "cuBLAS Error: CUBLAS_STATUS_INVALID_VALUE file: %s line: %d ", file, line);
break;
case CUBLAS_STATUS_ARCH_MISMATCH:
fprintf(stderr, "cuBLAS Error: CUBLAS_STATUS_ARCH_MISMATCH file: %s line: %d ", file, line);
break;
case CUBLAS_STATUS_MAPPING_ERROR:
fprintf(stderr, "cuBLAS Error: CUBLAS_STATUS_MAPPING_ERROR file: %s line: %d ", file, line);
break;
case CUBLAS_STATUS_EXECUTION_FAILED:
fprintf(stderr, "cuBLAS Error: CUBLAS_STATUS_EXECUTION_FAILED file: %s line: %d ", file, line);
break;
case CUBLAS_STATUS_INTERNAL_ERROR:
fprintf(stderr, "cuBLAS Error: CUBLAS_STATUS_INTERNAL_ERROR file: %s line: %d ", file, line);
break;
case CUBLAS_STATUS_NOT_SUPPORTED:
fprintf(stderr, "cuBLAS Error: CUBLAS_STATUS_NOT_SUPPORTED file: %s line: %d ", file, line);
break;
case CUBLAS_STATUS_LICENSE_ERROR:
fprintf(stderr, "cuBLAS Error: CUBLAS_STATUS_LICENSE_ERROR file: %s line: %d ", file, line);
break;
}
if (abort) exit(code);
}
}
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
Example output:
** On entry to SGEMM parameter number 13 had an illegal value
cuBLAS Error: CUBLAS_STATUS_INVALID_VALUE file: ../src/XX.cu line: 323 Segmentation fault (core dumped)