50#include "ax_helm_compr_kernel.cl.h"
91#define CASE_1D(LX, QUEUE, EVENT) \
93 cl_kernel kernel = clCreateKernel(ax_helm_compr_program, \
94 STR(ax_helm_compr_lx##LX), &err); \
97 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &w)); \
98 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &u)); \
99 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &dx)); \
100 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &dy)); \
101 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *) &dz)); \
102 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_mem), (void *) &dxt)); \
103 CL_CHECK(clSetKernelArg(kernel, 6, sizeof(cl_mem), (void *) &dyt)); \
104 CL_CHECK(clSetKernelArg(kernel, 7, sizeof(cl_mem), (void *) &dzt)); \
105 CL_CHECK(clSetKernelArg(kernel, 8, sizeof(cl_mem), (void *) &h1)); \
106 CL_CHECK(clSetKernelArg(kernel, 9, sizeof(cl_mem), (void *) &g11)); \
107 CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_mem), (void *) &g22)); \
108 CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_mem), (void *) &g33)); \
109 CL_CHECK(clSetKernelArg(kernel, 12, sizeof(cl_mem), (void *) &g12)); \
110 CL_CHECK(clSetKernelArg(kernel, 13, sizeof(cl_mem), (void *) &g13)); \
111 CL_CHECK(clSetKernelArg(kernel, 14, sizeof(cl_mem), (void *) &g23)); \
112 CL_CHECK(clSetKernelArg(kernel, 15, sizeof(cl_mem), (void *) &ind)); \
114 CL_CHECK(clEnqueueNDRangeKernel((cl_command_queue) QUEUE, \
115 kernel, 1, NULL, &global_item_size, \
116 &local_item_size, 0, NULL, EVENT)); \
117 CL_CHECK(clReleaseKernel(kernel)); \
121#define CASE_KSTEP(LX, QUEUE, EVENT) \
123 cl_kernel kernel = clCreateKernel(ax_helm_compr_program, \
124 STR(ax_helm_compr_kstep_lx##LX), &err); \
127 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &w)); \
128 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &u)); \
129 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &dx)); \
130 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &dy)); \
131 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *) &dz)); \
132 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_mem), (void *) &h1)); \
133 CL_CHECK(clSetKernelArg(kernel, 6, sizeof(cl_mem), (void *) &g11)); \
134 CL_CHECK(clSetKernelArg(kernel, 7, sizeof(cl_mem), (void *) &g22)); \
135 CL_CHECK(clSetKernelArg(kernel, 8, sizeof(cl_mem), (void *) &g33)); \
136 CL_CHECK(clSetKernelArg(kernel, 9, sizeof(cl_mem), (void *) &g12)); \
137 CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_mem), (void *) &g13)); \
138 CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_mem), (void *) &g23)); \
139 CL_CHECK(clSetKernelArg(kernel, 12, sizeof(cl_mem), (void *) &ind)); \
141 CL_CHECK(clEnqueueNDRangeKernel((cl_command_queue) QUEUE, \
142 kernel, 2, NULL, global_kstep, \
143 local_kstep, 0, NULL, EVENT)); \
144 CL_CHECK(clReleaseKernel(kernel)); \
150 if(autotune_ax_helm_compr[LX] == 0 ) { \
151 char *env_value = NULL; \
152 char neko_log_buf[80]; \
153 env_value = getenv("NEKO_AUTOTUNE"); \
155 sprintf(neko_log_buf, "Autotune Ax compr (lx: %d)", *lx); \
156 log_section(neko_log_buf); \
158 if( !strcmp(env_value,"1D") ) { \
159 CASE_1D(LX, glb_cmd_queue, NULL); \
160 sprintf(neko_log_buf,"Set by env : 1 (1D)"); \
161 log_message(neko_log_buf); \
162 autotune_ax_helm_compr[LX] = 1; \
163 } else if( !strcmp(env_value,"KSTEP") ) { \
164 CASE_KSTEP(LX, glb_cmd_queue, NULL); \
165 sprintf(neko_log_buf,"Set by env : 2 (KSTEP)"); \
166 log_message(neko_log_buf); \
167 autotune_ax_helm_compr[LX] = 2; \
169 sprintf(neko_log_buf, "Invalid value set for NEKO_AUTOTUNE"); \
170 log_error(neko_log_buf); \
174 CL_CHECK(clFinish(glb_cmd_queue)); \
175 cl_event perf_event, sync_event; \
176 cl_ulong start, end; \
177 CL_CHECK(clEnqueueMarker(glb_cmd_queue, &sync_event)); \
178 CL_CHECK(clEnqueueBarrier(prf_cmd_queue)); \
179 CL_CHECK(clEnqueueWaitForEvents(prf_cmd_queue, 1, &sync_event)); \
181 double elapsed1 = 0.0; \
182 for(int i = 0; i < 100; i++) { \
183 CASE_1D(LX, prf_cmd_queue, &perf_event); \
184 CL_CHECK(clWaitForEvents(1, &perf_event)); \
185 CL_CHECK(clGetEventProfilingInfo(perf_event, \
186 CL_PROFILING_COMMAND_START, \
187 sizeof(cl_ulong), &start, NULL)); \
188 CL_CHECK(clGetEventProfilingInfo(perf_event, \
189 CL_PROFILING_COMMAND_END, \
190 sizeof(cl_ulong), &end, NULL)); \
191 elapsed1 += (end - start)*1.0e-6; \
194 double elapsed2 = 0.0; \
195 for(int i = 0; i < 100; i++) { \
196 CASE_KSTEP(LX, prf_cmd_queue, &perf_event); \
197 CL_CHECK(clWaitForEvents(1, &perf_event)); \
198 CL_CHECK(clGetEventProfilingInfo(perf_event, \
199 CL_PROFILING_COMMAND_START, \
200 sizeof(cl_ulong), &start, NULL)); \
201 CL_CHECK(clGetEventProfilingInfo(perf_event, \
202 CL_PROFILING_COMMAND_END, \
203 sizeof(cl_ulong), &end, NULL)); \
204 elapsed2 += (end - start)*1.0e-6; \
207 CL_CHECK(clFinish(prf_cmd_queue)); \
208 CL_CHECK(clEnqueueMarker(prf_cmd_queue, &sync_event)); \
209 int krnl_strtgy = (elapsed1 < elapsed2 ? 1 : 2); \
210 sprintf(neko_log_buf, "Chose : %d (%s)", krnl_strtgy, \
211 (krnl_strtgy > 1 ? "KSTEP" : "1D")); \
212 autotune_ax_helm_compr[LX] = krnl_strtgy; \
213 log_message(neko_log_buf); \
214 clEnqueueBarrier(glb_cmd_queue); \
215 clEnqueueWaitForEvents(glb_cmd_queue, 1, &sync_event) ; \
218 } else if (autotune_ax_helm_compr[LX] == 1 ) { \
219 CASE_1D(LX, glb_cmd_queue, NULL); \
220 } else if (autotune_ax_helm_compr[LX] == 2 ) { \
221 CASE_KSTEP(LX, glb_cmd_queue, NULL); \
225#define CASE_LARGE(LX) \
227 CASE_KSTEP(LX, glb_cmd_queue, NULL); \
270 void *
u,
void *
v,
void *
w,
271 void *
dx,
void *
dy,
void *
dz,
275 int *
nelv,
int *lx) {
292#define CASE_VECTOR(LX) \
296 clCreateKernel(ax_helm_compr_program, \
297 STR(ax_helm_compr_vector_kstep_lx##LX), &err); \
300 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &au)); \
301 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &av)); \
302 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &aw)); \
303 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &u)); \
304 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *) &v)); \
305 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_mem), (void *) &w)); \
306 CL_CHECK(clSetKernelArg(kernel, 6, sizeof(cl_mem), (void *) &dx)); \
307 CL_CHECK(clSetKernelArg(kernel, 7, sizeof(cl_mem), (void *) &dy)); \
308 CL_CHECK(clSetKernelArg(kernel, 8, sizeof(cl_mem), (void *) &dz)); \
309 CL_CHECK(clSetKernelArg(kernel, 9, sizeof(cl_mem), (void *) &h1)); \
310 CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_mem), (void *) &g11)); \
311 CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_mem), (void *) &g22)); \
312 CL_CHECK(clSetKernelArg(kernel, 12, sizeof(cl_mem), (void *) &g33)); \
313 CL_CHECK(clSetKernelArg(kernel, 13, sizeof(cl_mem), (void *) &g12)); \
314 CL_CHECK(clSetKernelArg(kernel, 14, sizeof(cl_mem), (void *) &g13)); \
315 CL_CHECK(clSetKernelArg(kernel, 15, sizeof(cl_mem), (void *) &g23)); \
316 CL_CHECK(clSetKernelArg(kernel, 16, sizeof(cl_mem), (void *) &ind)); \
318 CL_CHECK(clEnqueueNDRangeKernel((cl_command_queue) glb_cmd_queue, \
319 kernel, 2, NULL, global_kstep, \
320 local_kstep, 0, NULL, NULL)); \
321 CL_CHECK(clReleaseKernel(kernel)); \
static int * autotune_ax_helm_compr
void opencl_ax_helm_compr(void *w, void *u, void *dx, void *dy, void *dz, void *dxt, void *dyt, void *dzt, void *h1, void *g11, void *g22, void *g33, void *g12, void *g13, void *g23, void *ind, int *nelv, int *lx)
void opencl_ax_helm_compr_vector(void *au, void *av, void *aw, void *u, void *v, void *w, void *dx, void *dy, void *dz, void *dxt, void *dyt, void *dzt, void *h1, void *g11, void *g22, void *g33, void *g12, void *g13, void *g23, void *ind, int *nelv, int *lx)
__global__ void ale_add_kinematics_kernel(const int n, T *__restrict__ wx, T *__restrict__ wy, T *__restrict__ wz, const T *__restrict__ x_ref, const T *__restrict__ y_ref, const T *__restrict__ z_ref, const T *__restrict__ phi, const T *__restrict__ x, const T *__restrict__ y, const T *__restrict__ z, const kinematics_params_t kin_params)
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ g23
__global__ void T *__restrict__ T *__restrict__ aw
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ g22
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const int *__restrict__ ind
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ g13
__global__ void T *__restrict__ T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ w
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const int *__restrict__ const int nelv
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ g12
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ dz
__global__ void const T *__restrict__ const T *__restrict__ dx
__global__ void const T *__restrict__ u
__global__ void T *__restrict__ av
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ dy
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ g33
__global__ void T *__restrict__ T *__restrict__ const T *__restrict__ const T *__restrict__ v
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ g11
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ h1
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ dyt
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ dzt
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ dxt
void opencl_kernel_jit(const char *kernel, cl_program *program)
void * ax_helm_compr_program