Neko 1.99.6
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
math.c
Go to the documentation of this file.
1/*
2 Copyright (c) 2021-2025, The Neko Authors
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions
7 are met:
8
9 * Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11
12 * Redistributions in binary form must reproduce the above
13 copyright notice, this list of conditions and the following
14 disclaimer in the documentation and/or other materials provided
15 with the distribution.
16
17 * Neither the name of the authors nor the names of its
18 contributors may be used to endorse or promote products derived
19 from this software without specific prior written permission.
20
21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 POSSIBILITY OF SUCH DAMAGE.
33*/
34
35#ifdef __APPLE__
36#include <OpenCL/cl.h>
37#else
38#include <CL/cl.h>
39#endif
40
41#include <stdio.h>
42#include <stdlib.h>
43#include <math.h>
45#include <device/opencl/jit.h>
48#include <device/opencl/check.h>
49
50#include "math_kernel.cl.h"
51
55void opencl_copy(void *a, void *b, int *n, cl_command_queue cmd_queue) {
57 b, a, 0, 0, (*n) * sizeof(real),
58 0, NULL, NULL));
59}
60
65void opencl_masked_copy_0(void *a, void *b, void *mask, int *n, int *m,
67 cl_int err;
68
69 if (math_program == NULL)
71
72 cl_kernel kernel = clCreateKernel(math_program, "masked_copy_kernel_0", &err);
74
75 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
76 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
77 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &mask));
78 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
79 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), m));
80
81 const int nb = ((*m) + 256 - 1) / 256;
82 const size_t global_item_size = 256 * nb;
83 const size_t local_item_size = 256;
84
87 0, NULL, NULL));
89
90}
91
95void opencl_masked_copy_aligned(void *a, void *b, void *mask, int *n, int *m,
97 cl_int err;
98
99 if (math_program == NULL)
101
102 cl_kernel kernel = clCreateKernel(math_program, "masked_copy_kernel_aligned", &err);
103 CL_CHECK(err);
104
105 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
106 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
107 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &mask));
108 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
109 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), m));
110
111 const int nb = ((*m) + 256 - 1) / 256;
112 const size_t global_item_size = 256 * nb;
113 const size_t local_item_size = 256;
114
117 0, NULL, NULL));
119
120}
121
125void opencl_masked_gather_copy(void *a, void *b, void *mask, int *n, int *m,
127 cl_int err;
128
129 if (math_program == NULL)
131
132 cl_kernel kernel = clCreateKernel(math_program, "masked_gather_copy_kernel",
133 &err);
134 CL_CHECK(err);
135
136 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
137 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
138 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &mask));
139 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
140 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), m));
141
142 const int nb = ((*n) + 256 - 1) / 256;
143 const size_t global_item_size = 256 * nb;
144 const size_t local_item_size = 256;
145
148 0, NULL, NULL));
150
151}
152
156void opencl_masked_gather_copy_aligned(void *a, void *b, void *mask, int *n,
157 int *m, cl_command_queue cmd_queue) {
158 cl_int err;
159
160 if (math_program == NULL)
162
164 "masked_gather_copy_aligned_kernel", &err);
165 CL_CHECK(err);
166
167 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
168 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
169 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &mask));
170 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
171 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), m));
172
173 const int nb = ((*n) + 256 - 1) / 256;
174 const size_t global_item_size = 256 * nb;
175 const size_t local_item_size = 256;
176
179 0, NULL, NULL));
181
182}
183
187void opencl_face_masked_gather_copy(void *a, void *b, void *mask, void *facet,
188 int *n1, int *n2, int *lx, int *ly,
189 int *lz, int *m,
191 cl_int err;
192
193 if (math_program == NULL)
195
197 "face_masked_gather_copy_kernel", &err);
198 CL_CHECK(err);
199
200 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
201 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
202 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &mask));
203 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &facet));
204 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), n1));
205 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(int), n2));
206 CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), lx));
207 CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), ly));
208 CL_CHECK(clSetKernelArg(kernel, 8, sizeof(int), lz));
209 CL_CHECK(clSetKernelArg(kernel, 9, sizeof(int), m));
210
211 const int nb = ((*m) + 256 - 1) / 256;
212 const size_t global_item_size = 256 * nb;
213 const size_t local_item_size = 256;
214
217 0, NULL, NULL));
219
220}
221
225void opencl_masked_scatter_copy(void *a, void *b, void *mask, int *n, int *m,
227 cl_int err;
228
229 if (math_program == NULL)
231
232 cl_kernel kernel = clCreateKernel(math_program, "masked_scatter_copy_kernel",
233 &err);
234 CL_CHECK(err);
235
236 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
237 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
238 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &mask));
239 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
240 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), m));
241
242 const int nb = ((*n) + 256 - 1) / 256;
243 const size_t global_item_size = 256 * nb;
244 const size_t local_item_size = 256;
245
248 0, NULL, NULL));
250
251}
252
256void opencl_masked_scatter_copy_aligned(void *a, void *b, void *mask, int *n, int *m,
258 cl_int err;
259
260 if (math_program == NULL)
262
263 cl_kernel kernel = clCreateKernel(math_program, "masked_scatter_copy_aligned_kernel",
264 &err);
265 CL_CHECK(err);
266
267 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
268 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
269 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &mask));
270 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
271 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), m));
272
273 const int nb = ((*n) + 256 - 1) / 256;
274 const size_t global_item_size = 256 * nb;
275 const size_t local_item_size = 256;
276
279 0, NULL, NULL));
281
282}
283
287void opencl_cfill_mask(void* a, void* c, int* size, void* mask, int* mask_size,
289 cl_int err;
290
291 if (math_program == NULL)
293
294 cl_kernel kernel = clCreateKernel(math_program, "cfill_mask_kernel", &err);
295 CL_CHECK(err);
296
297 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
298 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(real), c));
299 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), size));
300 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &mask));
301 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), mask_size));
302
303 const int nb = ((*mask_size) + 256 - 1) / 256;
304 const size_t global_item_size = 256 * nb;
305 const size_t local_item_size = 256;
306
309 0, NULL, NULL));
311}
312
318 real zero = 0.0;
319
321 (*n) * sizeof(real), 0, NULL, &wait_kern));
323}
324
330 real one = 1.0;
331
333 (*n) * sizeof(real), 0, NULL, &wait_kern));
335}
336
340void opencl_cmult(void *a, real *c, int *n, cl_command_queue cmd_queue) {
341 cl_int err;
342
343 if (math_program == NULL)
345
346 cl_kernel kernel = clCreateKernel(math_program, "cmult_kernel", &err);
347 CL_CHECK(err);
348
349 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
350 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(real), c));
351 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
352
353 const int nb = ((*n) + 256 - 1) / 256;
354 const size_t global_item_size = 256 * nb;
355 const size_t local_item_size = 256;
356
359 0, NULL, NULL));
361}
362
366void opencl_cmult2(void *a, void *b, real *c, int *n,
368 cl_int err;
369
370 if (math_program == NULL)
372
373 cl_kernel kernel = clCreateKernel(math_program, "cmult2_kernel", &err);
374 CL_CHECK(err);
375
376 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
377 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
378 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(real), c));
379 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
380
381 const int nb = ((*n) + 256 - 1) / 256;
382 const size_t global_item_size = 256 * nb;
383 const size_t local_item_size = 256;
384
387 0, NULL, NULL));
389}
390
394void opencl_cdiv(void *a, real *c, int *n, cl_command_queue cmd_queue) {
395 cl_int err;
396
397 if (math_program == NULL)
399
400 cl_kernel kernel = clCreateKernel(math_program, "cdiv_kernel", &err);
401 CL_CHECK(err);
402
403 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
404 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(real), c));
405 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
406
407 const int nb = ((*n) + 256 - 1) / 256;
408 const size_t global_item_size = 256 * nb;
409 const size_t local_item_size = 256;
410
413 0, NULL, NULL));
415}
416
420void opencl_cdiv2(void *a, void *b, real *c, int *n,
422 cl_int err;
423
424 if (math_program == NULL)
426
427 cl_kernel kernel = clCreateKernel(math_program, "cdiv2_kernel", &err);
428 CL_CHECK(err);
429
430 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
431 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
432 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(real), c));
433 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
434
435 const int nb = ((*n) + 256 - 1) / 256;
436 const size_t global_item_size = 256 * nb;
437 const size_t local_item_size = 256;
438
441 0, NULL, NULL));
443}
444
448void opencl_radd(void *a, real *c, int *n, cl_command_queue cmd_queue) {
449 cl_int err;
450
451 if (math_program == NULL)
453
454 cl_kernel kernel = clCreateKernel(math_program, "radd_kernel", &err);
455 CL_CHECK(err);
456
457 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
458 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(real), c));
459 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
460
461 const int nb = ((*n) + 256 - 1) / 256;
462 const size_t global_item_size = 256 * nb;
463 const size_t local_item_size = 256;
464
467 0, NULL, NULL));
469}
470
474void opencl_cadd2(void *a, void *b, real *c, int *n,
476 cl_int err;
477
478 if (math_program == NULL)
480
481 cl_kernel kernel = clCreateKernel(math_program, "cadd2_kernel", &err);
482 CL_CHECK(err);
483
484 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
485 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
486 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(real), c));
487 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
488
489 const int nb = ((*n) + 256 - 1) / 256;
490 const size_t global_item_size = 256 * nb;
491 const size_t local_item_size = 256;
492
495 0, NULL, NULL));
497}
498
502void opencl_cwrap(void *a, real *min_val, real *max_val, int *n,
504 cl_int err;
505
506 if (math_program == NULL)
508
509 cl_kernel kernel = clCreateKernel(math_program, "cwrap_kernel", &err);
510 CL_CHECK(err);
511
512 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
515 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
516
517 const int nb = ((*n) + 256 - 1) / 256;
518 const size_t global_item_size = 256 * nb;
519 const size_t local_item_size = 256;
520
523 0, NULL, NULL));
525}
526
531 cl_int err;
532
533 if (math_program == NULL)
535
536 cl_kernel kernel = clCreateKernel(math_program, "sqrt_inplace_kernel", &err);
537 CL_CHECK(err);
538
539 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
540 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(int), n));
541
542 const int nb = ((*n) + 256 - 1) / 256;
543 const size_t global_item_size = 256 * nb;
544 const size_t local_item_size = 256;
545
548 0, NULL, NULL));
550}
551
555void opencl_power(void *ap, void *a, real *p, int *n,
557 cl_int err;
558
559 if (math_program == NULL)
561
562 cl_kernel kernel = clCreateKernel(math_program, "power_kernel", &err);
563 CL_CHECK(err);
564
565 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &ap));
566 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &a));
567 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(real), p));
568 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
569
570 const int nb = ((*n) + 256 - 1) / 256;
571 const size_t global_item_size = 256 * nb;
572 const size_t local_item_size = 256;
573
576 0, NULL, NULL));
578}
579
583void opencl_cfill(void *a, real *c, int *n, cl_command_queue cmd_queue) {
584 cl_int err;
585
586 if (math_program == NULL)
588
589 cl_kernel kernel = clCreateKernel(math_program, "cfill_kernel", &err);
590 CL_CHECK(err);
591
592 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
593 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(real), c));
594 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
595
596 const int nb = ((*n) + 256 - 1) / 256;
597 const size_t global_item_size = 256 * nb;
598 const size_t local_item_size = 256;
599
602 0, NULL, NULL));
604}
605
610void opencl_add2(void *a, void *b, int *n, cl_command_queue cmd_queue) {
611 cl_int err;
612
613 if (math_program == NULL)
615
616 cl_kernel kernel = clCreateKernel(math_program, "add2_kernel", &err);
617 CL_CHECK(err);
618
619 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
620 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
621 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
622
623 const int nb = ((*n) + 256 - 1) / 256;
624 const size_t global_item_size = 256 * nb;
625 const size_t local_item_size = 256;
626
629 0, NULL, NULL));
631}
632
637void opencl_add3(void *a, void *b, void *c, int *n,
639 cl_int err;
640
641 if (math_program == NULL)
643
644 cl_kernel kernel = clCreateKernel(math_program, "add3_kernel", &err);
645 CL_CHECK(err);
646
647 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
648 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
649 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
650 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
651
652 const int nb = ((*n) + 256 - 1) / 256;
653 const size_t global_item_size = 256 * nb;
654 const size_t local_item_size = 256;
655
658 0, NULL, NULL));
660}
661
666void opencl_add4(void *a, void *b, void *c, void *d, int *n,
668 cl_int err;
669
670 if (math_program == NULL)
672
673 cl_kernel kernel = clCreateKernel(math_program, "add4_kernel", &err);
674 CL_CHECK(err);
675
676 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
677 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
678 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
679 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &d));
680 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), n));
681
682 const int nb = ((*n) + 256 - 1) / 256;
683 const size_t global_item_size = 256 * nb;
684 const size_t local_item_size = 256;
685
688 0, NULL, NULL));
690}
691
697void opencl_add2s1(void *a, void *b, real *c1, int *n,
699 cl_int err;
700
701 if (math_program == NULL)
703
704 cl_kernel kernel = clCreateKernel(math_program, "add2s1_kernel", &err);
705 CL_CHECK(err);
706
707 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
708 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
709 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(real), c1));
710 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
711
712 const int nb = ((*n) + 256 - 1) / 256;
713 const size_t global_item_size = 256 * nb;
714 const size_t local_item_size = 256;
715
718 0, NULL, NULL));
720}
721
727void opencl_add2s2(void *a, void *b, real *c1, int *n,
729 cl_int err;
730
731 if (math_program == NULL)
733
734 cl_kernel kernel = clCreateKernel(math_program, "add2s2_kernel", &err);
735 CL_CHECK(err);
736
737 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
738 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
739 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(real), c1));
740 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
741
742 const int nb = ((*n) + 256 - 1) / 256;
743 const size_t global_item_size = 256 * nb;
744 const size_t local_item_size = 256;
745
748 0, NULL, NULL));
750}
751
758void opencl_add2s2_many(void *x, void *p, void *alpha, int *j, int *n,
760 cl_int err;
761
762 if (math_program == NULL)
764
765 cl_kernel kernel = clCreateKernel(math_program, "add2s2_many_kernel", &err);
766 CL_CHECK(err);
767
768 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &x));
769 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &p));
770 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &alpha));
771 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), j));
772 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), n));
773
774 const int nb = ((*n) + 256 - 1) / 256;
775 const size_t global_item_size = 256 * nb;
776 const size_t local_item_size = 256;
777
780 0, NULL, NULL));
782
783}
784
790void opencl_addsqr2s2(void *a, void *b, real *c1, int *n,
792 cl_int err;
793
794 if (math_program == NULL)
796
797 cl_kernel kernel = clCreateKernel(math_program, "addsqr2s2_kernel", &err);
798 CL_CHECK(err);
799
800 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
801 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
802 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(real), c1));
803 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
804
805 const int nb = ((*n) + 256 - 1) / 256;
806 const size_t global_item_size = 256 * nb;
807 const size_t local_item_size = 256;
808
811 0, NULL, NULL));
813}
814
819void opencl_add3s2(void *a, void *b, void * c, real *c1, real *c2, int *n,
821 cl_int err;
822
823 if (math_program == NULL)
825
826 cl_kernel kernel = clCreateKernel(math_program, "add3s2_kernel", &err);
827 CL_CHECK(err);
828
829 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
830 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
831 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
832 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(real), c1));
833 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(real), c2));
834 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(int), n));
835
836 const int nb = ((*n) + 256 - 1) / 256;
837 const size_t global_item_size = 256 * nb;
838 const size_t local_item_size = 256;
839
842 0, NULL, NULL));
844}
845
850void opencl_add4s3(void *a, void *b, void * c, void * d, real *c1, real *c2,
851 real *c3, int *n, cl_command_queue cmd_queue) {
852 cl_int err;
853
854 if (math_program == NULL)
856
857 cl_kernel kernel = clCreateKernel(math_program, "add4s3_kernel", &err);
858 CL_CHECK(err);
859
860 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
861 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
862 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
863 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &d));
864 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(real), c1));
865 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(real), c2));
866 CL_CHECK(clSetKernelArg(kernel, 6, sizeof(real), c3));
867 CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), n));
868
869 const int nb = ((*n) + 256 - 1) / 256;
870 const size_t global_item_size = 256 * nb;
871 const size_t local_item_size = 256;
872
875 0, NULL, NULL));
877}
878
883void opencl_add5s4(void *a, void *b, void * c, void * d, void * e, real *c1,
884 real *c2, real *c3, real * c4, int *n,
886 cl_int err;
887
888 if (math_program == NULL)
890
891 cl_kernel kernel = clCreateKernel(math_program, "add5s4_kernel", &err);
892 CL_CHECK(err);
893
894 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
895 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
896 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
897 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &d));
898 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *) &e));
899 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(real), c1));
900 CL_CHECK(clSetKernelArg(kernel, 6, sizeof(real), c2));
901 CL_CHECK(clSetKernelArg(kernel, 7, sizeof(real), c3));
902 CL_CHECK(clSetKernelArg(kernel, 8, sizeof(real), c4));
903 CL_CHECK(clSetKernelArg(kernel, 9, sizeof(int), n));
904
905 const int nb = ((*n) + 256 - 1) / 256;
906 const size_t global_item_size = 256 * nb;
907 const size_t local_item_size = 256;
908
911 0, NULL, NULL));
913}
914
920 cl_int err;
921
922 if (math_program == NULL)
924
925 cl_kernel kernel = clCreateKernel(math_program, "invcol1_kernel", &err);
926 CL_CHECK(err);
927
928 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
929 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(int), n));
930
931 const int nb = ((*n) + 256 - 1) / 256;
932 const size_t global_item_size = 256 * nb;
933 const size_t local_item_size = 256;
934
937 0, NULL, NULL));
939}
940
945void opencl_invcol2(void *a, void *b, int *n, cl_command_queue cmd_queue) {
946 cl_int err;
947
948 if (math_program == NULL)
950
951 cl_kernel kernel = clCreateKernel(math_program, "invcol2_kernel", &err);
952 CL_CHECK(err);
953
954 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
955 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
956 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
957
958 const int nb = ((*n) + 256 - 1) / 256;
959 const size_t global_item_size = 256 * nb;
960 const size_t local_item_size = 256;
961
964 0, NULL, NULL));
966}
967
972void opencl_invcol3(void *a, void *b, void *c, int *n,
974 cl_int err;
975
976 if (math_program == NULL)
978
979 cl_kernel kernel = clCreateKernel(math_program, "invcol3_kernel", &err);
980 CL_CHECK(err);
981
982 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
983 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
984 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
985 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
986
987 const int nb = ((*n) + 256 - 1) / 256;
988 const size_t global_item_size = 256 * nb;
989 const size_t local_item_size = 256;
990
993 0, NULL, NULL));
995}
996
1001void opencl_col2(void *a, void *b, int *n, cl_command_queue cmd_queue) {
1002 cl_int err;
1003
1004 if (math_program == NULL)
1006
1007 cl_kernel kernel = clCreateKernel(math_program, "col2_kernel", &err);
1008 CL_CHECK(err);
1009
1010 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1011 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1012 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
1013
1014 const int nb = ((*n) + 256 - 1) / 256;
1015 const size_t global_item_size = 256 * nb;
1016 const size_t local_item_size = 256;
1017
1020 0, NULL, NULL));
1022}
1023
1028void opencl_col3(void *a, void *b, void *c, int *n,
1030 cl_int err;
1031
1032 if (math_program == NULL)
1034
1035 cl_kernel kernel = clCreateKernel(math_program, "col3_kernel", &err);
1036 CL_CHECK(err);
1037
1038 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1039 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1040 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
1041 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
1042
1043 const int nb = ((*n) + 256 - 1) / 256;
1044 const size_t global_item_size = 256 * nb;
1045 const size_t local_item_size = 256;
1046
1049 0, NULL, NULL));
1051}
1052
1057void opencl_subcol3(void *a, void *b, void *c, int *n,
1059 cl_int err;
1060
1061 if (math_program == NULL)
1063
1064 cl_kernel kernel = clCreateKernel(math_program, "subcol3_kernel", &err);
1065 CL_CHECK(err);
1066
1067 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1068 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1069 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
1070 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
1071
1072 const int nb = ((*n) + 256 - 1) / 256;
1073 const size_t global_item_size = 256 * nb;
1074 const size_t local_item_size = 256;
1075
1078 0, NULL, NULL));
1080}
1081
1086void opencl_sub2(void *a, void *b, int *n, cl_command_queue cmd_queue) {
1087 cl_int err;
1088
1089 if (math_program == NULL)
1091
1092 cl_kernel kernel = clCreateKernel(math_program, "sub2_kernel", &err);
1093 CL_CHECK(err);
1094
1095 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1096 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1097 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
1098
1099 const int nb = ((*n) + 256 - 1) / 256;
1100 const size_t global_item_size = 256 * nb;
1101 const size_t local_item_size = 256;
1102
1105 0, NULL, NULL));
1107}
1108
1113void opencl_sub3(void *a, void *b, void *c, int *n,
1115 cl_int err;
1116
1117 if (math_program == NULL)
1119
1120 cl_kernel kernel = clCreateKernel(math_program, "sub3_kernel", &err);
1121 CL_CHECK(err);
1122
1123 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1124 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1125 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
1126 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
1127
1128 const int nb = ((*n) + 256 - 1) / 256;
1129 const size_t global_item_size = 256 * nb;
1130 const size_t local_item_size = 256;
1131
1134 0, NULL, NULL));
1136}
1137
1142void opencl_addcol3(void *a, void *b, void *c, int *n,
1144 cl_int err;
1145
1146 if (math_program == NULL)
1148
1149 cl_kernel kernel = clCreateKernel(math_program, "addcol3_kernel", &err);
1150 CL_CHECK(err);
1151
1152 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1153 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1154 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
1155 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
1156
1157 const int nb = ((*n) + 256 - 1) / 256;
1158 const size_t global_item_size = 256 * nb;
1159 const size_t local_item_size = 256;
1160
1163 0, NULL, NULL));
1165}
1166
1171void opencl_addcol4(void *a, void *b, void *c, void *d, int *n,
1173 cl_int err;
1174
1175 if (math_program == NULL)
1177
1178 cl_kernel kernel = clCreateKernel(math_program, "addcol4_kernel", &err);
1179 CL_CHECK(err);
1180
1181 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1182 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1183 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
1184 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &d));
1185 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), n));
1186
1187 const int nb = ((*n) + 256 - 1) / 256;
1188 const size_t global_item_size = 256 * nb;
1189 const size_t local_item_size = 256;
1190
1193 0, NULL, NULL));
1195}
1196
1201void opencl_addcol3s2(void *a, void *b, void *c, real *s, int *n,
1203 cl_int err;
1204
1205 if (math_program == NULL)
1207
1208 cl_kernel kernel = clCreateKernel(math_program, "addcol3s2_kernel", &err);
1209 CL_CHECK(err);
1210
1211 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1212 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1213 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
1214 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(real), s));
1215 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), n));
1216
1217 const int nb = ((*n) + 256 - 1) / 256;
1218 const size_t global_item_size = 256 * nb;
1219 const size_t local_item_size = 256;
1220
1223 0, NULL, NULL));
1225}
1226
1232void opencl_vdot3(void *dot, void *u1, void *u2, void *u3,
1233 void *v1, void *v2, void *v3, int *n,
1235 cl_int err;
1236
1237 if (math_program == NULL)
1239
1240 cl_kernel kernel = clCreateKernel(math_program, "vdot3_kernel", &err);
1241 CL_CHECK(err);
1242
1243 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &dot));
1244 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &u1));
1245 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &u2));
1246 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &u3));
1247 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *) &v1));
1248 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_mem), (void *) &v2));
1249 CL_CHECK(clSetKernelArg(kernel, 6, sizeof(cl_mem), (void *) &v3));
1250 CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), n));
1251
1252 const int nb = ((*n) + 256 - 1) / 256;
1253 const size_t global_item_size = 256 * nb;
1254 const size_t local_item_size = 256;
1255
1258 0, NULL, NULL));
1260}
1261
1267void opencl_vcross(void *u1, void *u2, void *u3,
1268 void *v1, void *v2, void *v3,
1269 void *w1, void *w2, void *w3,
1270 int *n, cl_command_queue cmd_queue) {
1271
1272 cl_int err;
1273
1274 if (math_program == NULL)
1276
1277 cl_kernel kernel = clCreateKernel(math_program, "vcross_kernel", &err);
1278 CL_CHECK(err);
1279
1280 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &u1));
1281 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &u2));
1282 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &u3));
1283 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &v1));
1284 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *) &v2));
1285 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_mem), (void *) &v3));
1286 CL_CHECK(clSetKernelArg(kernel, 6, sizeof(cl_mem), (void *) &w1));
1287 CL_CHECK(clSetKernelArg(kernel, 7, sizeof(cl_mem), (void *) &w2));
1288 CL_CHECK(clSetKernelArg(kernel, 8, sizeof(cl_mem), (void *) &w3));
1289 CL_CHECK(clSetKernelArg(kernel, 9, sizeof(int), n));
1290
1291 const int nb = ((*n) + 256 - 1) / 256;
1292 const size_t global_item_size = 256 * nb;
1293 const size_t local_item_size = 256;
1294
1297 0, NULL, NULL));
1299
1300}
1301
1302/*
1303 * Reduction buffer, owned by the device layer and released
1304 * on device teardown (opencl_buffer_free_all in opencl_finalize)
1305 */
1307
1312real_xp opencl_glsc3(void *a, void *b, void *c, int *n,
1314 cl_int err;
1316 int i;
1317
1318 if (*n <= 0) {
1319 return 0.0;
1320 }
1321
1322 if (math_program == NULL)
1324
1325 const int nb = ((*n) + 256 - 1) / 256;
1326 const size_t global_item_size = 256 * nb;
1327 const size_t local_item_size = 256;
1328
1330
1331 cl_kernel kernel = clCreateKernel(math_program, "glsc3_kernel", &err);
1332 CL_CHECK(err);
1333
1334 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1335 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1336 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
1337 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &redbuf_xp.dev));
1338 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), n));
1339
1342 0, NULL, &kern_wait));
1343
1345 nb * sizeof(real_xp), ((real_xp *) redbuf_xp.host), 1,
1346 &kern_wait, NULL));
1347
1348 real_xp res = 0.0;
1349 for (i = 0; i < nb; i++) {
1350 res += ((real_xp *) redbuf_xp.host)[i];
1351 }
1352
1355
1356 return res;
1357}
1358
1363void opencl_glsc3_many(real_xp *h, void * w, void *v, void *mult, int *j,
1364 int *n, cl_command_queue cmd_queue){
1365 int i, k;
1366 cl_int err;
1368
1369 if (*n <= 0) {
1370 for (k = 0; k < (*j); k++) {
1371 h[k] = 0.0;
1372 }
1373 return;
1374 }
1375
1376 if (math_program == NULL)
1378
1379 int pow2 = 1;
1380 while(pow2 < (*j)){
1381 pow2 = 2*pow2;
1382 }
1383
1384 const int nt = 256 / pow2;
1385 const int nb = ((*n) + nt - 1) / nt;
1386 const size_t local_item_size[2] = {nt, pow2};
1387 const size_t global_item_size[2] = {nb * nt, pow2};
1388
1389 opencl_buffer_reserve(&redbuf_xp, (*j) * nb * sizeof(real_xp));
1390
1391 cl_kernel kernel = clCreateKernel(math_program, "glsc3_many_kernel", &err);
1392 CL_CHECK(err);
1393
1394 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &w));
1395 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &v));
1396 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &mult));
1397 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &redbuf_xp.dev));
1398 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), j));
1399 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(int), n));
1400
1403 0, NULL, &kern_wait));
1404
1406 (*j) * nb * sizeof(real_xp),
1407 ((real_xp *) redbuf_xp.host), 1, &kern_wait, NULL));
1408
1409 for (k = 0; k < (*j); k++) {
1410 h[k] = 0.0;
1411 }
1412
1413 for (i = 0; i < nb; i++) {
1414 for (k = 0; k < (*j); k++) {
1415 h[k] += ((real_xp *) redbuf_xp.host)[i*(*j)+k];
1416 }
1417 }
1418
1421}
1422
1428 cl_int err;
1430 int i;
1431
1432 if (*n <= 0) {
1433 return 0.0;
1434 }
1435
1436 if (math_program == NULL)
1438
1439 const int nb = ((*n) + 256 - 1) / 256;
1440 const size_t global_item_size = 256 * nb;
1441 const size_t local_item_size = 256;
1442
1444
1445 cl_kernel kernel = clCreateKernel(math_program, "glsc2_kernel", &err);
1446 CL_CHECK(err);
1447
1448 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1449 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1450 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &redbuf_xp.dev));
1451 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
1452
1455 0, NULL, &kern_wait));
1456
1458 nb * sizeof(real_xp), ((real_xp *) redbuf_xp.host), 1,
1459 &kern_wait, NULL));
1460
1461 real_xp res = 0.0;
1462 for (i = 0; i < nb; i++) {
1463 res += ((real_xp *) redbuf_xp.host)[i];
1464 }
1465
1468
1469 return res;
1470}
1471
1477 cl_int err;
1479 int i;
1480
1481 if (*n <= 0) {
1482 return 0.0;
1483 }
1484
1485 if (math_program == NULL)
1487
1488 const int nb = ((*n) + 256 - 1) / 256;
1489 const size_t global_item_size = 256 * nb;
1490 const size_t local_item_size = 256;
1491
1493
1494 cl_kernel kernel = clCreateKernel(math_program, "glsubnorm2_kernel", &err);
1495 CL_CHECK(err);
1496
1497 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1498 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1499 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &redbuf_xp.dev));
1500 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
1501
1504 0, NULL, &kern_wait));
1505
1507 nb * sizeof(real_xp), ((real_xp *) redbuf_xp.host), 1,
1508 &kern_wait, NULL));
1509
1510 real_xp res = 0.0;
1511 for (i = 0; i < nb; i++) {
1512 res += ((real_xp *) redbuf_xp.host)[i];
1513 }
1514
1517
1518 return res;
1519}
1520
1526 cl_int err;
1528 int i;
1529
1530 if (*n <= 0) {
1531 return 0.0;
1532 }
1533
1534 if (math_program == NULL)
1536
1537 const int nb = ((*n) + 256 - 1) / 256;
1538 const size_t global_item_size = 256 * nb;
1539 const size_t local_item_size = 256;
1540
1542
1543 cl_kernel kernel = clCreateKernel(math_program, "glsum_kernel", &err);
1544 CL_CHECK(err);
1545
1546 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1547 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &redbuf_xp.dev));
1548 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
1549
1552 0, NULL, &kern_wait));
1553
1555 nb * sizeof(real_xp), ((real_xp *) redbuf_xp.host), 1, &kern_wait, NULL));
1556
1557 real_xp res = 0.0;
1558 for (i = 0; i < nb; i++) {
1559 res += ((real_xp *) redbuf_xp.host)[i];
1560 }
1561
1564
1565 return res;
1566}
1567
1569 cl_int err;
1571 int i;
1572
1573 if (*n <= 0) {
1574 return -((real) HUGE_VAL);
1575 }
1576
1577 if (math_program == NULL)
1579
1580 const int nb = ((*n) + 256 - 1) / 256;
1581 const size_t global_item_size = 256 * nb;
1582 const size_t local_item_size = 256;
1583
1584 real * buf = (real *) malloc(nb * sizeof(real));
1585
1586 cl_kernel kernel = clCreateKernel(math_program, "glmax_kernel", &err);
1587 CL_CHECK(err);
1588
1590 nb * sizeof(real), NULL, &err);
1591 CL_CHECK(err);
1592
1593 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1594 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &buf_d));
1595 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
1596
1599 0, NULL, &kern_wait));
1600
1602 nb * sizeof(real), buf, 1, &kern_wait, NULL));
1603
1604 real res = buf[0];
1605 for (i = 1; i < nb; i++) {
1606 res = fmax(res, buf[i]);
1607 }
1608
1609 free(buf);
1613
1614 return res;
1615}
1616
1618 cl_int err;
1620 int i;
1621
1622 if (*n <= 0) {
1623 return (real) HUGE_VAL;
1624 }
1625
1626 if (math_program == NULL)
1628
1629 const int nb = ((*n) + 256 - 1) / 256;
1630 const size_t global_item_size = 256 * nb;
1631 const size_t local_item_size = 256;
1632
1633 real * buf = (real *) malloc(nb * sizeof(real));
1634
1635 cl_kernel kernel = clCreateKernel(math_program, "glmin_kernel", &err);
1636 CL_CHECK(err);
1637
1639 nb * sizeof(real), NULL, &err);
1640 CL_CHECK(err);
1641
1642 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1643 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &buf_d));
1644 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
1645
1648 0, NULL, &kern_wait));
1649
1651 nb * sizeof(real), buf, 1, &kern_wait, NULL));
1652
1653 real res = buf[0];
1654 for (i = 1; i < nb; i++) {
1655 res = fmin(res, buf[i]);
1656 }
1657
1658 free(buf);
1662
1663 return res;
1664}
1665
1666
1671 cl_int err;
1672
1673 if (math_program == NULL)
1675
1676 cl_kernel kernel = clCreateKernel(math_program, "absval_kernel", &err);
1677 CL_CHECK(err);
1678
1679 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1680 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(int), n));
1681
1682 const int nb = ((*n) + 256 - 1) / 256;
1683 const size_t global_item_size = 256 * nb;
1684 const size_t local_item_size = 256;
1685
1688 0, NULL, NULL));
1690}
1691
1695void opencl_iadd(void *a, int *c, int *n, cl_command_queue cmd_queue) {
1696 cl_int err;
1697
1698 if (math_program == NULL)
1700
1701 cl_kernel kernel = clCreateKernel(math_program, "iadd_kernel", &err);
1702 CL_CHECK(err);
1703
1704 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1705 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(int), c));
1706 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
1707
1708 const int nb = ((*n) + 256 - 1) / 256;
1709 const size_t global_item_size = 256 * nb;
1710 const size_t local_item_size = 256;
1711
1714 0, NULL, NULL));
1716}
1717
1722void opencl_pwmax_vec2(void *a, void *b, int *n, cl_command_queue cmd_queue) {
1723 cl_int err;
1724
1725 if (math_program == NULL)
1727
1728 cl_kernel kernel = clCreateKernel(math_program, "pwmax_vec2_kernel", &err);
1729 CL_CHECK(err);
1730
1731 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1732 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1733 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
1734
1735 const int nb = ((*n) + 256 - 1) / 256;
1736 const size_t global_item_size = 256 * nb;
1737 const size_t local_item_size = 256;
1738
1741 0, NULL, NULL));
1743}
1744
1749void opencl_pwmax_vec3(void *a, void *b, void *c,
1750 int *n, cl_command_queue cmd_queue) {
1751 cl_int err;
1752
1753 if (math_program == NULL)
1755
1756 cl_kernel kernel = clCreateKernel(math_program, "pwmax_vec3_kernel", &err);
1757 CL_CHECK(err);
1758
1759 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1760 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1761 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
1762 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
1763
1764 const int nb = ((*n) + 256 - 1) / 256;
1765 const size_t global_item_size = 256 * nb;
1766 const size_t local_item_size = 256;
1767
1770 0, NULL, NULL));
1772}
1773
1779 cl_int err;
1780
1781 if (math_program == NULL)
1783
1784 cl_kernel kernel = clCreateKernel(math_program, "pwmax_sca2_kernel", &err);
1785 CL_CHECK(err);
1786
1787 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1788 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(real), c));
1789 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
1790
1791 const int nb = ((*n) + 256 - 1) / 256;
1792 const size_t global_item_size = 256 * nb;
1793 const size_t local_item_size = 256;
1794
1797 0, NULL, NULL));
1799}
1800
1805void opencl_pwmax_sca3(void *a, void *b, real *c,
1806 int *n, cl_command_queue cmd_queue) {
1807 cl_int err;
1808
1809 if (math_program == NULL)
1811
1812 cl_kernel kernel = clCreateKernel(math_program, "pwmax_sca3_kernel", &err);
1813 CL_CHECK(err);
1814
1815 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1816 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1817 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(real), c));
1818 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
1819
1820 const int nb = ((*n) + 256 - 1) / 256;
1821 const size_t global_item_size = 256 * nb;
1822 const size_t local_item_size = 256;
1823
1826 0, NULL, NULL));
1828}
1829
1834void opencl_pwmin_vec2(void *a, void *b, int *n, cl_command_queue cmd_queue) {
1835 cl_int err;
1836
1837 if (math_program == NULL)
1839
1840 cl_kernel kernel = clCreateKernel(math_program, "pwmin_vec2_kernel", &err);
1841 CL_CHECK(err);
1842
1843 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1844 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1845 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
1846
1847 const int nb = ((*n) + 256 - 1) / 256;
1848 const size_t global_item_size = 256 * nb;
1849 const size_t local_item_size = 256;
1850
1853 0, NULL, NULL));
1855}
1856
1861void opencl_pwmin_vec3(void *a, void *b, void *c,
1862 int *n, cl_command_queue cmd_queue) {
1863 cl_int err;
1864
1865 if (math_program == NULL)
1867
1868 cl_kernel kernel = clCreateKernel(math_program, "pwmin_vec3_kernel", &err);
1869 CL_CHECK(err);
1870
1871 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1872 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1873 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &c));
1874 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
1875
1876 const int nb = ((*n) + 256 - 1) / 256;
1877 const size_t global_item_size = 256 * nb;
1878 const size_t local_item_size = 256;
1879
1882 0, NULL, NULL));
1884}
1885
1891 cl_int err;
1892
1893 if (math_program == NULL)
1895
1896 cl_kernel kernel = clCreateKernel(math_program, "pwmin_sca2_kernel", &err);
1897 CL_CHECK(err);
1898
1899 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1900 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(real), c));
1901 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), n));
1902
1903 const int nb = ((*n) + 256 - 1) / 256;
1904 const size_t global_item_size = 256 * nb;
1905 const size_t local_item_size = 256;
1906
1909 0, NULL, NULL));
1911}
1912
1917void opencl_pwmin_sca3(void *a, void *b, real *c,
1918 int *n, cl_command_queue cmd_queue) {
1919 cl_int err;
1920
1921 if (math_program == NULL)
1923
1924 cl_kernel kernel = clCreateKernel(math_program, "pwmin_sca3_kernel", &err);
1925 CL_CHECK(err);
1926
1927 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
1928 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
1929 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(real), c));
1930 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), n));
1931
1932 const int nb = ((*n) + 256 - 1) / 256;
1933 const size_t global_item_size = 256 * nb;
1934 const size_t local_item_size = 256;
1935
1938 0, NULL, NULL));
1940}
void opencl_buffer_reserve(opencl_buffer_t *buf, size_t size)
Definition buffer.c:46
__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 T *__restrict__ T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ w
const int i
const int e
__global__ void T *__restrict__ T *__restrict__ const T *__restrict__ const T *__restrict__ v
const int j
__global__ void const T *__restrict__ x
__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__ w3
double real
void * glb_ctx
double real_xp
void opencl_kernel_jit(const char *kernel, cl_program *program)
Definition jit.c:50
void opencl_iadd(void *a, int *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1695
void opencl_col3(void *a, void *b, void *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1028
void opencl_cdiv(void *a, real *c, int *n, cl_command_queue cmd_queue)
Definition math.c:394
void opencl_masked_scatter_copy(void *a, void *b, void *mask, int *n, int *m, cl_command_queue cmd_queue)
Definition math.c:225
void opencl_pwmax_sca2(void *a, real *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1778
void opencl_vcross(void *u1, void *u2, void *u3, void *v1, void *v2, void *v3, void *w1, void *w2, void *w3, int *n, cl_command_queue cmd_queue)
Definition math.c:1267
void opencl_masked_gather_copy(void *a, void *b, void *mask, int *n, int *m, cl_command_queue cmd_queue)
Definition math.c:125
void opencl_sub2(void *a, void *b, int *n, cl_command_queue cmd_queue)
Definition math.c:1086
void opencl_face_masked_gather_copy(void *a, void *b, void *mask, void *facet, int *n1, int *n2, int *lx, int *ly, int *lz, int *m, cl_command_queue cmd_queue)
Definition math.c:187
void opencl_power(void *ap, void *a, real *p, int *n, cl_command_queue cmd_queue)
Definition math.c:555
void opencl_col2(void *a, void *b, int *n, cl_command_queue cmd_queue)
Definition math.c:1001
void opencl_add2s2_many(void *x, void *p, void *alpha, int *j, int *n, cl_command_queue cmd_queue)
Definition math.c:758
void opencl_sub3(void *a, void *b, void *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1113
void opencl_add2s1(void *a, void *b, real *c1, int *n, cl_command_queue cmd_queue)
Definition math.c:697
void opencl_addcol3s2(void *a, void *b, void *c, real *s, int *n, cl_command_queue cmd_queue)
Definition math.c:1201
void opencl_invcol1(void *a, int *n, cl_command_queue cmd_queue)
Definition math.c:919
void opencl_add3(void *a, void *b, void *c, int *n, cl_command_queue cmd_queue)
Definition math.c:637
void opencl_rone(void *a, int *n, cl_command_queue cmd_queue)
Definition math.c:328
void opencl_invcol3(void *a, void *b, void *c, int *n, cl_command_queue cmd_queue)
Definition math.c:972
void opencl_add5s4(void *a, void *b, void *c, void *d, void *e, real *c1, real *c2, real *c3, real *c4, int *n, cl_command_queue cmd_queue)
Definition math.c:883
void opencl_add4s3(void *a, void *b, void *c, void *d, real *c1, real *c2, real *c3, int *n, cl_command_queue cmd_queue)
Definition math.c:850
void opencl_cmult(void *a, real *c, int *n, cl_command_queue cmd_queue)
Definition math.c:340
void opencl_cfill_mask(void *a, void *c, int *size, void *mask, int *mask_size, cl_command_queue cmd_queue)
Definition math.c:287
void opencl_cadd2(void *a, void *b, real *c, int *n, cl_command_queue cmd_queue)
Definition math.c:474
void opencl_masked_scatter_copy_aligned(void *a, void *b, void *mask, int *n, int *m, cl_command_queue cmd_queue)
Definition math.c:256
void opencl_pwmin_sca3(void *a, void *b, real *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1917
void opencl_pwmax_vec3(void *a, void *b, void *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1749
opencl_buffer_t redbuf_xp
Definition math.c:1306
real_xp opencl_glsc3(void *a, void *b, void *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1312
void opencl_add4(void *a, void *b, void *c, void *d, int *n, cl_command_queue cmd_queue)
Definition math.c:666
real_xp opencl_glsubnorm2(void *a, void *b, int *n, cl_command_queue cmd_queue)
Definition math.c:1476
void opencl_pwmin_vec3(void *a, void *b, void *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1861
void opencl_radd(void *a, real *c, int *n, cl_command_queue cmd_queue)
Definition math.c:448
void opencl_add2s2(void *a, void *b, real *c1, int *n, cl_command_queue cmd_queue)
Definition math.c:727
void opencl_vdot3(void *dot, void *u1, void *u2, void *u3, void *v1, void *v2, void *v3, int *n, cl_command_queue cmd_queue)
Definition math.c:1232
void opencl_pwmin_vec2(void *a, void *b, int *n, cl_command_queue cmd_queue)
Definition math.c:1834
void opencl_add3s2(void *a, void *b, void *c, real *c1, real *c2, int *n, cl_command_queue cmd_queue)
Definition math.c:819
void opencl_masked_copy_aligned(void *a, void *b, void *mask, int *n, int *m, cl_command_queue cmd_queue)
Definition math.c:95
void opencl_addsqr2s2(void *a, void *b, real *c1, int *n, cl_command_queue cmd_queue)
Definition math.c:790
void opencl_absval(void *a, int *n, cl_command_queue cmd_queue)
Definition math.c:1670
void opencl_cwrap(void *a, real *min_val, real *max_val, int *n, cl_command_queue cmd_queue)
Definition math.c:502
real_xp opencl_glsc2(void *a, void *b, int *n, cl_command_queue cmd_queue)
Definition math.c:1427
void opencl_addcol3(void *a, void *b, void *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1142
real opencl_glmin(void *a, int *n, cl_command_queue cmd_queue)
Definition math.c:1617
void opencl_pwmax_vec2(void *a, void *b, int *n, cl_command_queue cmd_queue)
Definition math.c:1722
void opencl_sqrt_inplace(void *a, int *n, cl_command_queue cmd_queue)
Definition math.c:530
void opencl_rzero(void *a, int *n, cl_command_queue cmd_queue)
Definition math.c:316
void opencl_copy(void *a, void *b, int *n, cl_command_queue cmd_queue)
Definition math.c:55
void opencl_subcol3(void *a, void *b, void *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1057
void opencl_add2(void *a, void *b, int *n, cl_command_queue cmd_queue)
Definition math.c:610
void opencl_addcol4(void *a, void *b, void *c, void *d, int *n, cl_command_queue cmd_queue)
Definition math.c:1171
void opencl_pwmin_sca2(void *a, real *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1890
void opencl_pwmax_sca3(void *a, void *b, real *c, int *n, cl_command_queue cmd_queue)
Definition math.c:1805
void opencl_invcol2(void *a, void *b, int *n, cl_command_queue cmd_queue)
Definition math.c:945
void opencl_glsc3_many(real_xp *h, void *w, void *v, void *mult, int *j, int *n, cl_command_queue cmd_queue)
Definition math.c:1363
void opencl_cdiv2(void *a, void *b, real *c, int *n, cl_command_queue cmd_queue)
Definition math.c:420
void opencl_masked_copy_0(void *a, void *b, void *mask, int *n, int *m, cl_command_queue cmd_queue)
Definition math.c:65
void opencl_cfill(void *a, real *c, int *n, cl_command_queue cmd_queue)
Definition math.c:583
real_xp opencl_glsum(void *a, int *n, cl_command_queue cmd_queue)
Definition math.c:1525
void opencl_masked_gather_copy_aligned(void *a, void *b, void *mask, int *n, int *m, cl_command_queue cmd_queue)
Definition math.c:156
real opencl_glmax(void *a, int *n, cl_command_queue cmd_queue)
Definition math.c:1568
void opencl_cmult2(void *a, void *b, real *c, int *n, cl_command_queue cmd_queue)
Definition math.c:366
Object for handling masks in Neko.
Definition mask.f90:34
#define OPENCL_BUFFER_INIT
Definition buffer.h:63
#define CL_CHECK(err)
Definition check.h:12
void * math_program
void * host
Definition buffer.h:55
cl_mem dev
Definition buffer.h:56