Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
bicgstab.c
Go to the documentation of this file.
1/*
2 Copyright (c) 2026, 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
44#ifdef __APPLE__
45#include <OpenCL/cl.h>
46#else
47#include <CL/cl.h>
48#endif
49
50#include <stdio.h>
51#include <stdlib.h>
53#include <device/opencl/jit.h>
55#include <device/opencl/check.h>
57
58#include "bicgstab_kernel.cl.h"
59
62
67void opencl_bicgstab_update_p(void *p, void *r, void *v, real *beta,
68 real *omega, int *n,
70 cl_int err;
71
72 if (*n <= 0) {
73 return;
74 }
75
78
80 "bicgstab_update_p_kernel", &err);
82
83 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &p));
84 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &r));
85 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &v));
86 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(real), beta));
87 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(real), omega));
88 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(int), n));
89
90 const int nb = ((*n) + 256 - 1) / 256;
91 const size_t global_item_size = 256 * nb;
92 const size_t local_item_size = 256;
93
96 0, NULL, NULL));
98}
99
104void opencl_bicgstab_product_and_norm(void *a, void *b, void *mult,
105 real_xp *res, int *n,
107 cl_int err;
109 int i;
110
111 res[0] = 0.0;
112 res[1] = 0.0;
113 if (*n <= 0) {
114 return;
115 }
116
117 if (bicgstab_program == NULL)
119
120 const int nb = ((*n) + 256 - 1) / 256;
121 const size_t global_item_size = 256 * nb;
122 const size_t local_item_size = 256;
123
124 opencl_buffer_reserve(&redbuf, 2 * nb * sizeof(real_xp));
125
127 "bicgstab_product_and_norm_kernel",
128 &err);
129 CL_CHECK(err);
130
131 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &a));
132 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &b));
133 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &mult));
134 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &redbuf.dev));
135 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), n));
136 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(int), &nb));
137
140 0, NULL, &kern_wait));
141
143 2 * nb * sizeof(real_xp),
144 ((real_xp *) redbuf.host), 1,
145 &kern_wait, NULL));
146
147 for (i = 0; i < nb; i++) {
148 res[0] += ((real_xp *) redbuf.host)[i];
149 res[1] += ((real_xp *) redbuf.host)[nb + i];
150 }
151
154}
155
160real_xp opencl_bicgstab_part1(void *s, void *r, void *v, void *mult,
161 real *alpha, int *n,
163 cl_int err;
165 int i;
166
167 if (*n <= 0) {
168 return 0.0;
169 }
170
171 if (bicgstab_program == NULL)
173
174 const int nb = ((*n) + 256 - 1) / 256;
175 const size_t global_item_size = 256 * nb;
176 const size_t local_item_size = 256;
177
179
181 "bicgstab_part1_kernel", &err);
182 CL_CHECK(err);
183
184 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &s));
185 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &r));
186 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &v));
187 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &mult));
188 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *) &redbuf.dev));
189 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(real), alpha));
190 CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), n));
191
194 0, NULL, &kern_wait));
195
197 nb * sizeof(real_xp),
198 ((real_xp *) redbuf.host), 1,
199 &kern_wait, NULL));
200
201 real_xp res = 0.0;
202 for (i = 0; i < nb; i++) {
203 res += ((real_xp *) redbuf.host)[i];
204 }
205
208
209 return res;
210}
211
218void opencl_bicgstab_part2(void *x, void *r, void *p_hat, void *s_hat,
219 void *s, void *t, void *f, void *mult,
220 real *alpha, real *omega, real_xp *res, int *n,
222 cl_int err;
224 int i;
225
226 res[0] = 0.0;
227 res[1] = 0.0;
228 if (*n <= 0) {
229 return;
230 }
231
232 if (bicgstab_program == NULL)
234
235 const int nb = ((*n) + 256 - 1) / 256;
236 const size_t global_item_size = 256 * nb;
237 const size_t local_item_size = 256;
238
239 opencl_buffer_reserve(&redbuf, 2 * nb * sizeof(real_xp));
240
242 "bicgstab_part2_kernel", &err);
243 CL_CHECK(err);
244
245 CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &x));
246 CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *) &r));
247 CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *) &p_hat));
248 CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *) &s_hat));
249 CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *) &s));
250 CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_mem), (void *) &t));
251 CL_CHECK(clSetKernelArg(kernel, 6, sizeof(cl_mem), (void *) &f));
252 CL_CHECK(clSetKernelArg(kernel, 7, sizeof(cl_mem), (void *) &mult));
253 CL_CHECK(clSetKernelArg(kernel, 8, sizeof(cl_mem), (void *) &redbuf.dev));
254 CL_CHECK(clSetKernelArg(kernel, 9, sizeof(real), alpha));
255 CL_CHECK(clSetKernelArg(kernel, 10, sizeof(real), omega));
256 CL_CHECK(clSetKernelArg(kernel, 11, sizeof(int), n));
257 CL_CHECK(clSetKernelArg(kernel, 12, sizeof(int), &nb));
258
261 0, NULL, &kern_wait));
262
264 2 * nb * sizeof(real_xp),
265 ((real_xp *) redbuf.host), 1,
266 &kern_wait, NULL));
267
268 for (i = 0; i < nb; i++) {
269 res[0] += ((real_xp *) redbuf.host)[i];
270 res[1] += ((real_xp *) redbuf.host)[nb + i];
271 }
272
275}
real_xp opencl_bicgstab_part1(void *s, void *r, void *v, void *mult, real *alpha, int *n, cl_command_queue cmd_queue)
Definition bicgstab.c:160
void opencl_bicgstab_part2(void *x, void *r, void *p_hat, void *s_hat, void *s, void *t, void *f, void *mult, real *alpha, real *omega, real_xp *res, int *n, cl_command_queue cmd_queue)
Definition bicgstab.c:218
void opencl_bicgstab_product_and_norm(void *a, void *b, void *mult, real_xp *res, int *n, cl_command_queue cmd_queue)
Definition bicgstab.c:104
static opencl_buffer_t redbuf
Definition bicgstab.c:61
void opencl_bicgstab_update_p(void *p, void *r, void *v, real *beta, real *omega, int *n, cl_command_queue cmd_queue)
Definition bicgstab.c:67
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)
const int i
__global__ void T *__restrict__ T *__restrict__ const T *__restrict__ const T *__restrict__ v
__global__ void const T *__restrict__ x
double real
double real_xp
void opencl_kernel_jit(const char *kernel, cl_program *program)
Definition jit.c:50
#define OPENCL_BUFFER_INIT
Definition buffer.h:63
#define CL_CHECK(err)
Definition check.h:12
void * bicgstab_program
void * host
Definition buffer.h:55
cl_mem dev
Definition buffer.h:56