Neko 1.99.7
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
conv1_kernel.h
Go to the documentation of this file.
1#ifndef __MATH_CONV1_KERNEL_H__
2#define __MATH_CONV1_KERNEL_H__
3
4/*
5 Copyright (c) 2021-2023, The Neko Authors
6 All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions
10 are met:
11
12 * Redistributions of source code must retain the above copyright
13 notice, this list of conditions and the following disclaimer.
14
15 * Redistributions in binary form must reproduce the above
16 copyright notice, this list of conditions and the following
17 disclaimer in the documentation and/or other materials provided
18 with the distribution.
19
20 * Neither the name of the authors nor the names of its
21 contributors may be used to endorse or promote products derived
22 from this software without specific prior written permission.
23
24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28 COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 POSSIBILITY OF SUCH DAMAGE.
36*/
37
38#include "elem_block.h"
39
44template< typename T, const int LX, const int CHUNKS >
46 const T * __restrict__ u,
47 const T * __restrict__ vx,
48 const T * __restrict__ vy,
49 const T * __restrict__ vz,
50 const T * __restrict__ dx,
51 const T * __restrict__ dy,
52 const T * __restrict__ dz,
53 const T * __restrict__ drdx,
54 const T * __restrict__ dsdx,
55 const T * __restrict__ dtdx,
56 const T * __restrict__ drdy,
57 const T * __restrict__ dsdy,
58 const T * __restrict__ dtdy,
59 const T * __restrict__ drdz,
60 const T * __restrict__ dsdz,
61 const T * __restrict__ dtdz,
62 const T * __restrict__ jacinv) {
63
64 __shared__ T shu[LX * LX * LX];
65
66 __shared__ T shvx[LX * LX * LX];
67 __shared__ T shvy[LX * LX * LX];
68 __shared__ T shvz[LX * LX * LX];
69
73
75
76 const int e = blockIdx.x;
77 const int iii = threadIdx.x;
78 const int nchunks = (LX * LX * LX - 1) / CHUNKS + 1;
79 const int ele = e*LX*LX*LX;
80
81 if (iii < (LX * LX)) {
82 shdx[iii] = dx[iii];
83 shdy[iii] = dy[iii];
84 shdz[iii] = dz[iii];
85 }
86
87 int l = iii;
88 while(l < (LX * LX * LX)) {
89 shu[l] = u[l + ele];
90
91 shvx[l] = vx[l + ele];
92 shvy[l] = vy[l + ele];
93 shvz[l] = vz[l + ele];
94
95 shjacinv[l] = jacinv[l + ele];
96
97 l = l + CHUNKS;
98 }
99
101
102 for (int n = 0; n < nchunks; n++) {
103 const int ijk = iii + n * CHUNKS;
104 const int jk = ijk / LX;
105 const int i = ijk - jk * LX;
106 const int k = jk / LX;
107 const int j = jk - k * LX;
108 if ( i < LX && j < LX && k < LX) {
109 T rtmp = 0.0;
110 T stmp = 0.0;
111 T ttmp = 0.0;
112 for (int l = 0; l < LX; l++) {
113 rtmp += shdx[i + l * LX] * shu[l + j * LX + k * LX * LX];
114 stmp += shdy[j + l * LX] * shu[i + l * LX + k * LX * LX];
115 ttmp += shdz[k + l * LX] * shu[i + j * LX + l * LX * LX];
116 }
117
118 du[ijk + e * LX * LX * LX] = shjacinv[ijk] *
119 (shvx[ijk] * (drdx[ijk + ele] * rtmp
120 + dsdx[ijk + ele] * stmp
121 + dtdx[ijk + ele] * ttmp)
122 + shvy[ijk] * (drdy[ijk + ele] * rtmp
123 + dsdy[ijk + ele] * stmp
124 + dtdy[ijk + ele] * ttmp)
125 + shvz[ijk] * (drdz[ijk + ele] * rtmp
126 + dsdz[ijk + ele] * stmp
127 + dtdz[ijk + ele] * ttmp));
128 }
129 }
130}
131
132template< typename T, const int LX, const int EB >
135 const T * __restrict__ u,
152 const int nelv) {
153
154 __shared__ T shu[EB * LX * LX];
155
159
160 static_assert(sizeof(shu) +
161 sizeof(shdx) +
162 sizeof(shdy) +
163 sizeof(shdz)
165 "kstep block exceeds the LDS budget");
166
167 const int eb = (EB == 1) ? 0 : threadIdx.z;
168 const int e_blk = blockIdx.x * EB + eb;
169 /* Threads past the last element still have to reach the barriers in
170 the k loop, so clamp their reads and drop their stores rather than
171 returning early. At EB == 1 this all constant folds away */
172 const bool active = (EB == 1) ? true : (e_blk < nelv);
173 const int e = active ? e_blk : (nelv - 1);
174 const int sh = eb * LX * LX;
175 const int j = threadIdx.y;
176 const int i = threadIdx.x;
177 const int ij = i + j * LX;
178 const int ele = e*LX*LX*LX;
179
180 if (eb == 0) {
181 shdx[ij] = dx[ij];
182 shdy[ij] = dy[ij];
183 shdz[ij] = dz[ij];
184 }
185
191
192#pragma unroll LX
193 for (int k = 0; k < LX; ++k) {
194 ru[k] = u[ij + k*LX*LX + ele];
195 rvx[k] = vx[ij + k*LX*LX + ele];
196 rvy[k] = vy[ij + k*LX*LX + ele];
197 rvz[k] = vz[ij + k*LX*LX + ele];
198 rjacinv[k] = jacinv[ij + k*LX*LX + ele];
199 }
200
202
203#pragma unroll
204 for (int k = 0; k < LX; ++k) {
205 const int ijk = ij + k*LX*LX;
206 T ttmp = 0.0;
207 shu[sh + ij] = ru[k];
208#pragma unroll
209 for (int l = 0; l < LX; l++) {
210 ttmp += shdz[k+l*LX] * ru[l];
211 }
213
214 T rtmp = 0.0;
215 T stmp = 0.0;
216#pragma unroll
217 for (int l = 0; l < LX; l++) {
218 rtmp += shdx[i+l*LX] * shu[sh + l+j*LX];
219 stmp += shdy[j+l*LX] * shu[sh + i+l*LX];
220 }
221
222 if (active) {
223 du[ijk + ele] = rjacinv[k] *
224 (rvx[k] * (drdx[ijk + ele] * rtmp
225 + dsdx[ijk + ele] * stmp
226 + dtdx[ijk + ele] * ttmp)
227 + rvy[k] * (drdy[ijk + ele] * rtmp
228 + dsdy[ijk + ele] * stmp
229 + dtdy[ijk + ele] * ttmp)
230 + rvz[k] * (drdz[ijk + ele] * rtmp
231 + dsdz[ijk + ele] * stmp
232 + dtdz[ijk + ele] * ttmp));
233 }
235 }
236}
237
238
239#endif // __MATH_CONV1_KERNEL_H__
__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)
__shared__ T shu[LX *LX]
const bool active
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ dz
T rvy[LX]
const int sh
__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 T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ jacinv
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ dy
T ru[LX]
const int eb
__shared__ T shdy[LX *LX]
__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__ drdx
const int i
T rvx[LX]
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ dx
const int ij
__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 T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__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__ const T *__restrict__ dtdx
T rvz[LX]
T rjacinv[LX]
__shared__ T shdx[LX *LX]
__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 T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ dtdz
const int e
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ vz
__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__ dsdx
__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 T *__restrict__ const T *__restrict__ dtdy
__shared__ T shdz[LX *LX]
__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 T *__restrict__ const T *__restrict__ const T *__restrict__ const T *__restrict__ dsdz
const int e_blk
__global__ void const T *__restrict__ const T *__restrict__ vx
__global__ void conv1_kernel_1d(T *__restrict__ du, const T *__restrict__ u, const T *__restrict__ vx, const T *__restrict__ vy, const T *__restrict__ vz, const T *__restrict__ dx, const T *__restrict__ dy, const T *__restrict__ dz, const T *__restrict__ drdx, const T *__restrict__ dsdx, const T *__restrict__ dtdx, const T *__restrict__ drdy, const T *__restrict__ dsdy, const T *__restrict__ dtdy, const T *__restrict__ drdz, const T *__restrict__ dsdz, const T *__restrict__ dtdz, const T *__restrict__ jacinv)
__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 T *__restrict__ dsdy
__global__ void const T *__restrict__ const T *__restrict__ const T *__restrict__ vy
const int ele
__global__ void const T *__restrict__ u
const int j
__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__ drdy
__syncthreads()
__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 T *__restrict__ const T *__restrict__ const T *__restrict__ drdz
#define NEKO_EB_BOUNDS(NT)
Definition elem_block.h:95
#define NEKO_EB_MAX_LDS
Definition elem_block.h:62