17#ifndef GPUTPCGPUTRACKEROPENCLINTERNALS_H
18#define GPUTPCGPUTRACKEROPENCLINTERNALS_H
20#define CL_TARGET_OPENCL_VERSION 220
31static const char* opencl_error_string(int32_t errorcode)
36 case CL_DEVICE_NOT_FOUND:
37 return "Device not found.";
38 case CL_DEVICE_NOT_AVAILABLE:
39 return "Device not available";
40 case CL_COMPILER_NOT_AVAILABLE:
41 return "Compiler not available";
42 case CL_MEM_OBJECT_ALLOCATION_FAILURE:
43 return "Memory object allocation failure";
44 case CL_OUT_OF_RESOURCES:
45 return "Out of resources";
46 case CL_OUT_OF_HOST_MEMORY:
47 return "Out of host memory";
48 case CL_PROFILING_INFO_NOT_AVAILABLE:
49 return "Profiling information not available";
50 case CL_MEM_COPY_OVERLAP:
51 return "Memory copy overlap";
52 case CL_IMAGE_FORMAT_MISMATCH:
53 return "Image format mismatch";
54 case CL_IMAGE_FORMAT_NOT_SUPPORTED:
55 return "Image format not supported";
56 case CL_BUILD_PROGRAM_FAILURE:
57 return "Program build failure";
60 case CL_INVALID_VALUE:
61 return "Invalid value";
62 case CL_INVALID_DEVICE_TYPE:
63 return "Invalid device type";
64 case CL_INVALID_PLATFORM:
65 return "Invalid platform";
66 case CL_INVALID_DEVICE:
67 return "Invalid device";
68 case CL_INVALID_CONTEXT:
69 return "Invalid context";
70 case CL_INVALID_QUEUE_PROPERTIES:
71 return "Invalid queue properties";
72 case CL_INVALID_COMMAND_QUEUE:
73 return "Invalid command queue";
74 case CL_INVALID_HOST_PTR:
75 return "Invalid host pointer";
76 case CL_INVALID_MEM_OBJECT:
77 return "Invalid memory object";
78 case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR:
79 return "Invalid image format descriptor";
80 case CL_INVALID_IMAGE_SIZE:
81 return "Invalid image size";
82 case CL_INVALID_SAMPLER:
83 return "Invalid sampler";
84 case CL_INVALID_BINARY:
85 return "Invalid binary";
86 case CL_INVALID_BUILD_OPTIONS:
87 return "Invalid build options";
88 case CL_INVALID_PROGRAM:
89 return "Invalid program";
90 case CL_INVALID_PROGRAM_EXECUTABLE:
91 return "Invalid program executable";
92 case CL_INVALID_KERNEL_NAME:
93 return "Invalid kernel name";
94 case CL_INVALID_KERNEL_DEFINITION:
95 return "Invalid kernel definition";
96 case CL_INVALID_KERNEL:
97 return "Invalid kernel";
98 case CL_INVALID_ARG_INDEX:
99 return "Invalid argument index";
100 case CL_INVALID_ARG_VALUE:
101 return "Invalid argument value";
102 case CL_INVALID_ARG_SIZE:
103 return "Invalid argument size";
104 case CL_INVALID_KERNEL_ARGS:
105 return "Invalid kernel arguments";
106 case CL_INVALID_WORK_DIMENSION:
107 return "Invalid work dimension";
108 case CL_INVALID_WORK_GROUP_SIZE:
109 return "Invalid work group size";
110 case CL_INVALID_WORK_ITEM_SIZE:
111 return "Invalid work item size";
112 case CL_INVALID_GLOBAL_OFFSET:
113 return "Invalid global offset";
114 case CL_INVALID_EVENT_WAIT_LIST:
115 return "Invalid event wait list";
116 case CL_INVALID_EVENT:
117 return "Invalid event";
118 case CL_INVALID_OPERATION:
119 return "Invalid operation";
120 case CL_INVALID_GL_OBJECT:
121 return "Invalid OpenGL object";
122 case CL_INVALID_BUFFER_SIZE:
123 return "Invalid buffer size";
124 case CL_INVALID_MIP_LEVEL:
125 return "Invalid mip-map level";
127 return "Unknown Errorcode";
131#define GPUFailedMsg(x) GPUFailedMsgA(x, __FILE__, __LINE__)
132#define GPUFailedMsgI(x) GPUFailedMsgAI(x, __FILE__, __LINE__)
134static inline int64_t OCLsetKernelParameters_helper(cl_kernel& k, int32_t
i)
139template <
typename T,
typename... Args>
140static inline int64_t OCLsetKernelParameters_helper(cl_kernel& kernel, int32_t
i,
const T& firstParameter,
const Args&... restOfParameters)
142 int64_t
retVal = clSetKernelArg(kernel,
i,
sizeof(T), &firstParameter);
146 return OCLsetKernelParameters_helper(kernel,
i + 1, restOfParameters...);
149template <
typename... Args>
150static inline int64_t OCLsetKernelParameters(cl_kernel& kernel,
const Args&... args)
152 return OCLsetKernelParameters_helper(kernel, 0, args...);
155static inline int64_t clExecuteKernelA(cl_command_queue queue, cl_kernel krnl,
size_t local_size,
size_t global_size, cl_event* pEvent, cl_event* wait =
nullptr, cl_int nWaitEvents = 1)
157 return clEnqueueNDRangeKernel(queue, krnl, 1,
nullptr, &global_size, &local_size, wait ==
nullptr ? 0 : nWaitEvents, wait, pEvent);
170 std::vector<std::pair<cl_kernel, std::string>>
kernels;
173template <
typename K,
typename... Args>
187 bool tmpEvent =
false;
192 evr = (cl_event*)
z.ev;
196 cl_ulong time_start, time_end;
198 GPUFailedMsg(clGetEventProfilingInfo(*evr, CL_PROFILING_COMMAND_START,
sizeof(time_start), &time_start,
nullptr));
199 GPUFailedMsg(clGetEventProfilingInfo(*evr, CL_PROFILING_COMMAND_END,
sizeof(time_end), &time_end,
nullptr));
200 _xyz.
t = (time_end - time_start) * 1.e-9f;
208template <
class T,
int32_t I>
211 std::string
name(GetKernelName<T, I>());
215 std::string kname(
"krnl_" +
name);
220 GPUError(
"Error creating OPENCL Kernel: %s",
name.c_str());
227template <
class T,
int32_t I>
230 std::string
name(GetKernelName<T, I>());
240 GPUError(
"Could not find OpenCL kernel %s",
name.c_str());
241 throw ::std::runtime_error(
"Requested unsupported OpenCL kernel");
244static_assert(std::is_convertible<cl_event, void*>::value,
"OpenCL event type incompatible to deviceEvent");
#define GPUCA_MAX_STREAMS
int32_t runKernelBackendInternal(const krnlSetupTime &_xyz, K &k, const Args &... args)
GPUReconstructionOCLInternals * mInternals
int32_t AddKernel(bool multi=false)
uint32_t FindKernel(int32_t num)
GPUSettingsProcessing mProcessingSettings
GLuint const GLchar * name
GLdouble GLdouble GLdouble z
cl_command_queue command_queue[GPUCA_MAX_STREAMS]
std::vector< std::pair< cl_kernel, std::string > > kernels