@@ -84,21 +84,26 @@ void Naive::run(Dim N, Dim saveInterval) {
84
84
}
85
85
86
86
hyper = HyperCoefficients::calculate (dt, g);
87
- exp_nu.update (hyper, dt);
88
- exp_nu_g.update (hyper, dt);
89
- exp_eta.update (hyper, dt);
90
- exp_gm.update (hyper, dt);
87
+ cilk_scope {
88
+ cilk_spawn exp_nu.update (hyper, dt);
89
+ cilk_spawn exp_nu_g.update (hyper, dt);
90
+ cilk_spawn exp_eta.update (hyper, dt);
91
+ exp_gm.update (hyper, dt);
92
+ }
91
93
92
94
spdlog::debug (" dt: {}" , dt);
93
95
94
96
// store results of nonlinear operators, as well as results of predictor step
95
97
auto GM_K_Star = g.cBufMXY (), GM_Nonlinear_K = g.cBufMXY ();
96
98
99
+ // spawn a bunch of stuff here
97
100
// Compute N
98
- auto bracketPhiNE_K = br.halfBracket (dPhi, Grid::sliceXY (dGM, N_E));
99
- auto bracketAParUEKPar_K = br.halfBracket (Grid::sliceXY (dGM, A_PAR), dUEKPar);
101
+ auto bracketPhiNE_K = cilk_spawn br.halfBracket (dPhi, Grid::sliceXY (dGM, N_E));
102
+ auto bracketAParUEKPar_K = cilk_spawn br.halfBracket (Grid::sliceXY (dGM, A_PAR), dUEKPar);
100
103
101
104
// Compute A
105
+ auto bracketUEParPhi_K = cilk_spawn br.halfBracket (dUEKPar, dPhi);
106
+
102
107
auto dPhiNeG2 = g.dBufXY ();
103
108
if (g.M > 2 ) {
104
109
g.for_each_xy ([&](Dim x, Dim y) {
@@ -115,7 +120,7 @@ void Naive::run(Dim N, Dim saveInterval) {
115
120
}
116
121
117
122
auto bracketAParPhiG2Ne_K = br.halfBracket (Grid::sliceXY (dGM, A_PAR), dPhiNeG2);
118
- auto bracketUEParPhi_K = br. halfBracket (dUEKPar, dPhi) ;
123
+ cilk_sync ;
119
124
120
125
g.for_each_kxky ([&](Dim kx, Dim ky) {
121
126
GM_Nonlinear_K (kx, ky, N_E) =
@@ -132,12 +137,12 @@ void Naive::run(Dim N, Dim saveInterval) {
132
137
133
138
if (g.M > 2 ) {
134
139
// Compute G2
135
- auto bracketPhiG2_K = br.halfBracket (dPhi, Grid::sliceXY (dGM, G_MIN));
140
+ auto bracketPhiG2_K = cilk_spawn br.halfBracket (dPhi, Grid::sliceXY (dGM, G_MIN));
136
141
auto bracketAParG3_K =
137
- br.halfBracket (Grid::sliceXY (dGM, A_PAR), Grid::sliceXY (dGM, G_MIN + 1 ));
142
+ cilk_spawn br.halfBracket (Grid::sliceXY (dGM, A_PAR), Grid::sliceXY (dGM, G_MIN + 1 ));
138
143
139
144
// Compute G_{M-1}
140
- auto bracketPhiGLast_K = br.halfBracket (dPhi, Grid::sliceXY (dGM, LAST));
145
+ auto bracketPhiGLast_K = cilk_spawn br.halfBracket (dPhi, Grid::sliceXY (dGM, LAST));
141
146
auto bracketAParGLast_K = br.halfBracket (Grid::sliceXY (dGM, A_PAR), Grid::sliceXY (dGM, LAST));
142
147
g.for_each_kxky ([&](Dim kx, Dim ky) {
143
148
bracketAParGLast_K (kx, ky) *= nonlinear::GLastBracketFactor (g.M , g.kPerp2 (kx, ky), hyper);
@@ -148,6 +153,7 @@ void Naive::run(Dim N, Dim saveInterval) {
148
153
auto dBrLast = g.dBufXY ();
149
154
br.derivatives (bracketAParGLast_K, dBrLast);
150
155
auto bracketTotalGLast_K = br.halfBracket (Grid::sliceXY (dGM, A_PAR), dBrLast);
156
+ cilk_sync;
151
157
152
158
g.for_each_kxky ([&](Dim kx, Dim ky) {
153
159
GM_Nonlinear_K (kx, ky, G_MIN) = nonlinear::G2 (
@@ -162,17 +168,19 @@ void Naive::run(Dim N, Dim saveInterval) {
162
168
dt / 2.0 * (1 + exp_gm (LAST) * exp_nu_g (kx, ky)) * GM_Nonlinear_K (kx, ky, LAST);
163
169
});
164
170
165
- auto dGMinusPlus = g. dBufXY ();
166
- for (Dim m = G_MIN + 1 ; m < LAST; ++m) {
171
+ cilk_for (Dim m = G_MIN + 1 ; m < LAST; ++m) {
172
+ auto dGMinusPlus = g. dBufXY ();
167
173
g.for_each_xy ([&](Dim x, Dim y) {
168
174
dGMinusPlus.DX (x, y) =
169
175
std::sqrt (m) * dGM.DX (x, y, m - 1 ) + std::sqrt (m + 1 ) * dGM.DX (x, y, m + 1 );
170
176
dGMinusPlus.DY (x, y) =
171
177
std::sqrt (m) * dGM.DY (x, y, m - 1 ) + std::sqrt (m + 1 ) * dGM.DY (x, y, m + 1 );
172
178
});
173
179
174
- auto bracketAParGMMinusPlus_K = br.halfBracket (Grid::sliceXY (dGM, A_PAR), dGMinusPlus);
180
+ auto bracketAParGMMinusPlus_K =
181
+ cilk_spawn br.halfBracket (Grid::sliceXY (dGM, A_PAR), dGMinusPlus);
175
182
auto bracketPhiGM_K = br.halfBracket (dPhi, Grid::sliceXY (dGM, m));
183
+ cilk_sync;
176
184
177
185
g.for_each_kxky ([&](Dim kx, Dim ky) {
178
186
GM_Nonlinear_K (kx, ky, m) =
@@ -196,13 +204,14 @@ void Naive::run(Dim N, Dim saveInterval) {
196
204
197
205
auto dPhi_Loop = g.dBufXY (), dUEKPar_Loop = g.dBufXY ();
198
206
auto dGM_Loop = g.dBufMXY ();
199
- br.derivatives (phi_K_New, dPhi_Loop);
200
- br.derivatives (ueKPar_K_New, dUEKPar_Loop);
207
+ cilk_spawn br.derivatives (phi_K_New, dPhi_Loop);
208
+ cilk_spawn br.derivatives (ueKPar_K_New, dUEKPar_Loop);
201
209
202
- for (int m = 0 ; m < g.M ; ++m) {
210
+ cilk_for (int m = 0 ; m < g.M ; ++m) {
203
211
// TODO(OPT) not necessary if we bail (only up to G_MIN)
204
212
br.derivatives (Grid::sliceXY (GM_K_Star, m), Grid::sliceXY (dGM_Loop, m));
205
213
}
214
+ cilk_sync;
206
215
207
216
// Corrector loop
208
217
// TODO confirm that only m derivatives are needed at a time
@@ -239,8 +248,9 @@ void Naive::run(Dim N, Dim saveInterval) {
239
248
});
240
249
241
250
auto bracketAParPhiG2Ne_K_Loop =
242
- br.halfBracket (Grid::sliceXY (dGM_Loop, A_PAR), dPhiNeG2_Loop);
251
+ cilk_spawn br.halfBracket (Grid::sliceXY (dGM_Loop, A_PAR), dPhiNeG2_Loop);
243
252
auto bracketUEParPhi_K_Loop = br.halfBracket (dUEKPar_Loop, dPhi_Loop);
253
+ cilk_sync;
244
254
245
255
// / f_pred from Viriato
246
256
auto GM_Nonlinear_K_Loop = g.cBufMXY ();
@@ -272,11 +282,14 @@ void Naive::run(Dim N, Dim saveInterval) {
272
282
spdlog::debug (" sumAParRelError: {}, relative_error: {}" , sumAParRelError, relative_error);
273
283
// TODO(OPT) bail if relative error is large
274
284
275
- DerivateNewMoment (A_PAR);
276
- br.derivatives (ueKPar_K_New, dUEKPar_Loop);
285
+ auto bracketPhiNE_K_Loop = cilk_spawn br.halfBracket (dPhi_Loop, Grid::sliceXY (dGM_Loop, N_E));
277
286
278
- auto bracketPhiNE_K_Loop = br.halfBracket (dPhi_Loop, Grid::sliceXY (dGM_Loop, N_E));
287
+ cilk_scope {
288
+ cilk_spawn DerivateNewMoment (A_PAR);
289
+ br.derivatives (ueKPar_K_New, dUEKPar_Loop);
290
+ }
279
291
auto bracketAParUEKPar_K_Loop = br.halfBracket (Grid::sliceXY (dGM_Loop, A_PAR), dUEKPar_Loop);
292
+ cilk_sync;
280
293
281
294
g.for_each_kxky ([&](Dim kx, Dim ky) {
282
295
GM_Nonlinear_K_Loop (kx, ky, N_E) =
@@ -290,13 +303,17 @@ void Naive::run(Dim N, Dim saveInterval) {
290
303
(kx | ky) == 0 ? 0 : nonlinear::phi (momentsNew_K (kx, ky, N_E), g.kPerp2 (kx, ky));
291
304
});
292
305
293
- br.derivatives (phi_K_New, dPhi_Loop);
306
+ cilk_spawn br.derivatives (phi_K_New, dPhi_Loop);
294
307
DerivateNewMoment (N_E);
308
+ cilk_sync;
309
+
295
310
if (g.M > 2 ) {
296
311
// Compute G2
297
- auto bracketPhiG2_K_Loop = br.halfBracket (dPhi_Loop, Grid::sliceXY (dGM_Loop, G_MIN));
312
+ auto bracketPhiG2_K_Loop =
313
+ cilk_spawn br.halfBracket (dPhi_Loop, Grid::sliceXY (dGM_Loop, G_MIN));
298
314
auto bracketAParG3_K_Loop =
299
315
br.halfBracket (Grid::sliceXY (dGM_Loop, A_PAR), Grid::sliceXY (dGM_Loop, G_MIN + 1 ));
316
+ cilk_sync;
300
317
301
318
g.for_each_kxky ([&](Dim kx, Dim ky) {
302
319
GM_Nonlinear_K_Loop (kx, ky, G_MIN) =
@@ -319,8 +336,9 @@ void Naive::run(Dim N, Dim saveInterval) {
319
336
});
320
337
321
338
auto bracketAParGMMinusPlus_K_Loop =
322
- br.halfBracket (Grid::sliceXY (dGM_Loop, A_PAR), dGMinusPlus_Loop);
339
+ cilk_spawn br.halfBracket (Grid::sliceXY (dGM_Loop, A_PAR), dGMinusPlus_Loop);
323
340
auto bracketPhiGM_K_Loop = br.halfBracket (dPhi_Loop, Grid::sliceXY (dGM_Loop, m));
341
+ cilk_sync;
324
342
325
343
g.for_each_kxky ([&](Dim kx, Dim ky) {
326
344
GM_Nonlinear_K_Loop (kx, ky, m) = nonlinear::GM (m, bracketPhiGM_K_Loop (kx, ky),
@@ -336,7 +354,8 @@ void Naive::run(Dim N, Dim saveInterval) {
336
354
}
337
355
338
356
// Compute G_{M-1}
339
- auto bracketPhiGLast_K_Loop = br.halfBracket (dPhi_Loop, Grid::sliceXY (dGM_Loop, LAST));
357
+ auto bracketPhiGLast_K_Loop =
358
+ cilk_spawn br.halfBracket (dPhi_Loop, Grid::sliceXY (dGM_Loop, LAST));
340
359
auto bracketAParGLast_K_Loop =
341
360
br.halfBracket (Grid::sliceXY (dGM_Loop, A_PAR), Grid::sliceXY (dGM_Loop, LAST));
342
361
g.for_each_kxky ([&](Dim kx, Dim ky) {
@@ -351,6 +370,7 @@ void Naive::run(Dim N, Dim saveInterval) {
351
370
br.derivatives (bracketAParGLast_K_Loop, dBrLast_Loop);
352
371
auto bracketTotalGLast_K_Loop =
353
372
br.halfBracket (Grid::sliceXY (dGM_Loop, A_PAR), dBrLast_Loop);
373
+ cilk_sync;
354
374
355
375
g.for_each_kxky ([&](Dim kx, Dim ky) {
356
376
GM_Nonlinear_K_Loop (kx, ky, LAST) =
0 commit comments