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