Apache Singa
A General Distributed Deep Learning Library
cuda_utils.h
1 // from caffe include/caffe/util/device_alternative.hpp
2 #ifndef SINGA_UTILS_CUDA_UTILS_H_
3 #define SINGA_UTILS_CUDA_UTILS_H_
4 
5 #include "singa/singa_config.h"
6 #ifdef USE_CUDA
7 #include <cublas_v2.h>
8 #include <cuda.h>
9 #include <cuda_runtime.h>
10 #include <curand.h>
11 
12 inline const char* cublasGetErrorString(cublasStatus_t error) {
13  switch (error) {
14  case CUBLAS_STATUS_SUCCESS:
15  return "CUBLAS_STATUS_SUCCESS";
16  case CUBLAS_STATUS_NOT_INITIALIZED:
17  return "CUBLAS_STATUS_NOT_INITIALIZED";
18  case CUBLAS_STATUS_ALLOC_FAILED:
19  return "CUBLAS_STATUS_ALLOC_FAILED";
20  case CUBLAS_STATUS_INVALID_VALUE:
21  return "CUBLAS_STATUS_INVALID_VALUE";
22  case CUBLAS_STATUS_ARCH_MISMATCH:
23  return "CUBLAS_STATUS_ARCH_MISMATCH";
24  case CUBLAS_STATUS_MAPPING_ERROR:
25  return "CUBLAS_STATUS_MAPPING_ERROR";
26  case CUBLAS_STATUS_EXECUTION_FAILED:
27  return "CUBLAS_STATUS_EXECUTION_FAILED";
28  case CUBLAS_STATUS_INTERNAL_ERROR:
29  return "CUBLAS_STATUS_INTERNAL_ERROR";
30 #if CUDA_VERSION >= 6000
31  case CUBLAS_STATUS_NOT_SUPPORTED:
32  return "CUBLAS_STATUS_NOT_SUPPORTED";
33 #endif
34 #if CUDA_VERSION >= 6050
35  case CUBLAS_STATUS_LICENSE_ERROR:
36  return "CUBLAS_STATUS_LICENSE_ERROR";
37 #endif
38  }
39  return "Unknown cublas status";
40 }
41 
42 inline const char* curandGetErrorString(curandStatus_t error) {
43  switch (error) {
44  case CURAND_STATUS_SUCCESS:
45  return "CURAND_STATUS_SUCCESS";
46  case CURAND_STATUS_VERSION_MISMATCH:
47  return "CURAND_STATUS_VERSION_MISMATCH";
48  case CURAND_STATUS_NOT_INITIALIZED:
49  return "CURAND_STATUS_NOT_INITIALIZED";
50  case CURAND_STATUS_ALLOCATION_FAILED:
51  return "CURAND_STATUS_ALLOCATION_FAILED";
52  case CURAND_STATUS_TYPE_ERROR:
53  return "CURAND_STATUS_TYPE_ERROR";
54  case CURAND_STATUS_OUT_OF_RANGE:
55  return "CURAND_STATUS_OUT_OF_RANGE";
56  case CURAND_STATUS_LENGTH_NOT_MULTIPLE:
57  return "CURAND_STATUS_LENGTH_NOT_MULTIPLE";
58  case CURAND_STATUS_DOUBLE_PRECISION_REQUIRED:
59  return "CURAND_STATUS_DOUBLE_PRECISION_REQUIRED";
60  case CURAND_STATUS_LAUNCH_FAILURE:
61  return "CURAND_STATUS_LAUNCH_FAILURE";
62  case CURAND_STATUS_PREEXISTING_FAILURE:
63  return "CURAND_STATUS_PREEXISTING_FAILURE";
64  case CURAND_STATUS_INITIALIZATION_FAILED:
65  return "CURAND_STATUS_INITIALIZATION_FAILED";
66  case CURAND_STATUS_ARCH_MISMATCH:
67  return "CURAND_STATUS_ARCH_MISMATCH";
68  case CURAND_STATUS_INTERNAL_ERROR:
69  return "CURAND_STATUS_INTERNAL_ERROR";
70  }
71  return "Unknown curand status";
72 }
73 
74 //
75 // CUDA macros
76 //
77 
78 // CUDA: various checks for different function calls.
79 #define CUDA_CHECK(condition) \
80  /* Code block avoids redefinition of cudaError_t error */ \
81  do { \
82  cudaError_t error = condition; \
83  CHECK_EQ(error, cudaSuccess) << " " << cudaGetErrorString(error); \
84  } while (0)
85 
86 #define CUBLAS_CHECK(condition) \
87  do { \
88  cublasStatus_t status = condition; \
89  CHECK_EQ(status, CUBLAS_STATUS_SUCCESS) << " " \
90  << cublasGetErrorString(status); \
91  } while (0)
92 
93 #define CURAND_CHECK(condition) \
94  do { \
95  curandStatus_t status = condition; \
96  CHECK_EQ(status, CURAND_STATUS_SUCCESS) << " " \
97  << curandGetErrorString(status); \
98  } while (0)
99 
100 
101 #endif // USE_CUDA
102 #endif // SINGA_UTILS_CUDA_UTILS_H_