GeNN  4.9.0
GPU enhanced Neuronal Networks (GeNN)
opencl/utils.h
Go to the documentation of this file.
1 #pragma once
2 
3 // Standard C++ includes
4 #include <iostream>
5 
6 // OpenCL includes
7 #include "../../../../share/genn/backends/opencl/cl2.hpp"
8 
9 // PLOG includes
10 #include <plog/Log.h>
11 
12 // Check Compile-time errors (driver independent)
13 #define CHECK_OPENCL_ERRORS(call) \
14 { \
15  cl_int error = call; \
16  if (error != CL_SUCCESS) { \
17  LOGE_BACKEND << __FILE__ << ": " << __LINE__ << ": opencl error " << error << ": " << clGetErrorString(error); \
18  exit(EXIT_FAILURE); \
19  } \
20 }
21 
22 //--------------------------------------------------------------------------
23 // CodeGenerator::OpenCL::Utils
24 //--------------------------------------------------------------------------
25 namespace CodeGenerator
26 {
27 namespace OpenCL
28 {
29 namespace Utils
30 {
31 // OpenCL error string
32 const char *clGetErrorString(cl_int error)
33 {
34  #define GEN_CL_ERROR_CASE(ERR) case ERR: return #ERR
35  switch(error) {
36  // run-time and JIT compiler errors
37  GEN_CL_ERROR_CASE(CL_SUCCESS);
38  GEN_CL_ERROR_CASE(CL_DEVICE_NOT_FOUND);
39  GEN_CL_ERROR_CASE(CL_DEVICE_NOT_AVAILABLE);
40  GEN_CL_ERROR_CASE(CL_COMPILER_NOT_AVAILABLE);
41  GEN_CL_ERROR_CASE(CL_MEM_OBJECT_ALLOCATION_FAILURE);
42  GEN_CL_ERROR_CASE(CL_OUT_OF_RESOURCES);
43  GEN_CL_ERROR_CASE(CL_OUT_OF_HOST_MEMORY);
44  GEN_CL_ERROR_CASE(CL_PROFILING_INFO_NOT_AVAILABLE);
45  GEN_CL_ERROR_CASE(CL_MEM_COPY_OVERLAP);
46  GEN_CL_ERROR_CASE(CL_IMAGE_FORMAT_MISMATCH);
47  GEN_CL_ERROR_CASE(CL_IMAGE_FORMAT_NOT_SUPPORTED);
48  GEN_CL_ERROR_CASE(CL_BUILD_PROGRAM_FAILURE);
49  GEN_CL_ERROR_CASE(CL_MAP_FAILURE);
50  GEN_CL_ERROR_CASE(CL_MISALIGNED_SUB_BUFFER_OFFSET);
51  GEN_CL_ERROR_CASE(CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST);
52  GEN_CL_ERROR_CASE(CL_COMPILE_PROGRAM_FAILURE);
53  GEN_CL_ERROR_CASE(CL_LINKER_NOT_AVAILABLE);
54  GEN_CL_ERROR_CASE(CL_LINK_PROGRAM_FAILURE);
55  GEN_CL_ERROR_CASE(CL_DEVICE_PARTITION_FAILED);
56  GEN_CL_ERROR_CASE(CL_KERNEL_ARG_INFO_NOT_AVAILABLE);
57 
58  // compile-time errors
59  GEN_CL_ERROR_CASE(CL_INVALID_VALUE);
60  GEN_CL_ERROR_CASE(CL_INVALID_DEVICE_TYPE);
61  GEN_CL_ERROR_CASE(CL_INVALID_PLATFORM);
62  GEN_CL_ERROR_CASE(CL_INVALID_DEVICE);
63  GEN_CL_ERROR_CASE(CL_INVALID_CONTEXT);
64  GEN_CL_ERROR_CASE(CL_INVALID_QUEUE_PROPERTIES);
65  GEN_CL_ERROR_CASE(CL_INVALID_COMMAND_QUEUE);
66  GEN_CL_ERROR_CASE(CL_INVALID_HOST_PTR);
67  GEN_CL_ERROR_CASE(CL_INVALID_MEM_OBJECT);
68  GEN_CL_ERROR_CASE(CL_INVALID_IMAGE_FORMAT_DESCRIPTOR);
69  GEN_CL_ERROR_CASE(CL_INVALID_IMAGE_SIZE);
70  GEN_CL_ERROR_CASE(CL_INVALID_SAMPLER);
71  GEN_CL_ERROR_CASE(CL_INVALID_BINARY);
72  GEN_CL_ERROR_CASE(CL_INVALID_BUILD_OPTIONS);
73  GEN_CL_ERROR_CASE(CL_INVALID_PROGRAM);
74  GEN_CL_ERROR_CASE(CL_INVALID_PROGRAM_EXECUTABLE);
75  GEN_CL_ERROR_CASE(CL_INVALID_KERNEL_NAME);
76  GEN_CL_ERROR_CASE(CL_INVALID_KERNEL_DEFINITION);
77  GEN_CL_ERROR_CASE(CL_INVALID_KERNEL);
78  GEN_CL_ERROR_CASE(CL_INVALID_ARG_INDEX);
79  GEN_CL_ERROR_CASE(CL_INVALID_ARG_VALUE);
80  GEN_CL_ERROR_CASE(CL_INVALID_ARG_SIZE);
81  GEN_CL_ERROR_CASE(CL_INVALID_KERNEL_ARGS);
82  GEN_CL_ERROR_CASE(CL_INVALID_WORK_DIMENSION);
83  GEN_CL_ERROR_CASE(CL_INVALID_WORK_GROUP_SIZE);
84  GEN_CL_ERROR_CASE(CL_INVALID_WORK_ITEM_SIZE);
85  GEN_CL_ERROR_CASE(CL_INVALID_GLOBAL_OFFSET);
86  GEN_CL_ERROR_CASE(CL_INVALID_EVENT_WAIT_LIST);
87  GEN_CL_ERROR_CASE(CL_INVALID_EVENT);
88  GEN_CL_ERROR_CASE(CL_INVALID_OPERATION);
89  GEN_CL_ERROR_CASE(CL_INVALID_GL_OBJECT);
90  GEN_CL_ERROR_CASE(CL_INVALID_BUFFER_SIZE);
91  GEN_CL_ERROR_CASE(CL_INVALID_MIP_LEVEL);
92  GEN_CL_ERROR_CASE(CL_INVALID_GLOBAL_WORK_SIZE);
93  GEN_CL_ERROR_CASE(CL_INVALID_PROPERTY);
94  GEN_CL_ERROR_CASE(CL_INVALID_IMAGE_DESCRIPTOR);
95  GEN_CL_ERROR_CASE(CL_INVALID_COMPILER_OPTIONS);
96  GEN_CL_ERROR_CASE(CL_INVALID_LINKER_OPTIONS);
97  GEN_CL_ERROR_CASE(CL_INVALID_DEVICE_PARTITION_COUNT);
98 
99  default: return "Unknown OpenCL error";
100  }
101 #undef GEN_CL_ERROR_CASE
102 }
103 } // namespace Utils
104 } // namespace OpenCL
105 } // namespace CodeGenerator
Helper class for generating code - automatically inserts brackets, indents etc.
Definition: backendBase.h:30
const char * clGetErrorString(cl_int error)
Definition: opencl/utils.h:32
Definition: gennUtils.h:30
#define GEN_CL_ERROR_CASE(ERR)