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