NForge
Tensor library
Loading...
Searching...
No Matches
cuda_error.h
1#ifndef CUDA_ERROR_H
2#define CUDA_ERROR_H
3
4#include <cuda_runtime.h>
5#include <curand.h>
6
7#define CUDA_CHECK(call) \
8 do { \
9 cudaError_t err = (call); \
10 if (err != cudaSuccess) \
11 throw std::runtime_error(std::string("CUDA error: ") + cudaGetErrorString(err) + \
12 " at " + __FILE__ + ":" + std::to_string(__LINE__)); \
13 } while (0)
14
15#define CURAND_CHECK(call) \
16 do { \
17 curandStatus_t err = (call); \
18 if (err != CURAND_STATUS_SUCCESS) \
19 throw std::runtime_error(std::string("cuRAND error: ") + curandGetErrorString(err) + \
20 " at " + __FILE__ + ":" + std::to_string(__LINE__)); \
21 } while (0)
22
23inline const char* curandGetErrorString(curandStatus_t status) {
24 switch (status) {
25 case CURAND_STATUS_SUCCESS:
26 return "CURAND_STATUS_SUCCESS";
27 case CURAND_STATUS_VERSION_MISMATCH:
28 return "CURAND_STATUS_VERSION_MISMATCH";
29 case CURAND_STATUS_NOT_INITIALIZED:
30 return "CURAND_STATUS_NOT_INITIALIZED";
31 case CURAND_STATUS_ALLOCATION_FAILED:
32 return "CURAND_STATUS_ALLOCATION_FAILED";
33 case CURAND_STATUS_TYPE_ERROR:
34 return "CURAND_STATUS_TYPE_ERROR";
35 case CURAND_STATUS_OUT_OF_RANGE:
36 return "CURAND_STATUS_OUT_OF_RANGE";
37 case CURAND_STATUS_LENGTH_NOT_MULTIPLE:
38 return "CURAND_STATUS_LENGTH_NOT_MULTIPLE";
39 case CURAND_STATUS_DOUBLE_PRECISION_REQUIRED:
40 return "CURAND_STATUS_DOUBLE_PRECISION_REQUIRED";
41 case CURAND_STATUS_LAUNCH_FAILURE:
42 return "CURAND_STATUS_LAUNCH_FAILURE";
43 case CURAND_STATUS_PREEXISTING_FAILURE:
44 return "CURAND_STATUS_PREEXISTING_FAILURE";
45 case CURAND_STATUS_INITIALIZATION_FAILED:
46 return "CURAND_STATUS_INITIALIZATION_FAILED";
47 case CURAND_STATUS_ARCH_MISMATCH:
48 return "CURAND_STATUS_ARCH_MISMATCH";
49 case CURAND_STATUS_INTERNAL_ERROR:
50 return "CURAND_STATUS_INTERNAL_ERROR";
51 default:
52 return "CURAND_STATUS_UNKNOWN";
53 }
54}
55
56#endif // CUDA_ERROR_H