4#include <cuda_runtime.h>
7#define CUDA_CHECK(call) \
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__)); \
15#define CURAND_CHECK(call) \
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__)); \
23inline const char* curandGetErrorString(curandStatus_t 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";
52 return "CURAND_STATUS_UNKNOWN";