Example Jacobi2D SDAG: Consolidate parallel control flow into Main::run()
[charm.git] / examples / charm++ / jacobi2d-sdag / jacobi2d.ci
1 mainmodule jacobi2d {
2
3   readonly CProxy_Main mainProxy;
4   readonly int arrayDimX;
5   readonly int arrayDimY;
6   readonly int blockDimX;
7   readonly int blockDimY;
8
9   readonly int num_chare_x;
10   readonly int num_chare_y;
11
12   readonly int maxiterations;
13
14   mainchare Main {
15     entry Main(CkArgMsg *m);
16     entry void run() {
17       while (iterations < WARM_ITER) {
18         atomic {
19           array.doStep(CkCallback(CkIndex_Main::report(NULL), thisProxy), 1);
20         }
21         when report(CkReductionMsg *msg) atomic {
22           iterations++;
23           delete msg;
24         }
25       }
26       atomic "start_timed_portion" {
27         startTime = CmiWallTimer();
28         array.doStep(CkCallback(CkIndex_Main::report(NULL), thisProxy),
29                      maxiterations);
30       }
31       while (iterations < maxiterations) {
32         // Each worker reports back to here when it completes an iteration
33         // Asynchronous check on threshhold satisfaction
34         when report(CkReductionMsg *msg) atomic {
35           iterations++;
36           maxdifference=((double *) msg->getData())[0];
37           delete msg;
38           if (maxdifference - THRESHHOLD < 0)
39             done(true);
40         }
41       }
42       atomic { done(false); }
43     };
44     entry void report(CkReductionMsg *m);
45   };
46
47   array [2D] Jacobi {
48     entry Jacobi(void);
49     entry void begin_iteration(void);
50     entry void receiveGhosts(int iter, int dir, int size,
51                              double ghosts[size]);
52
53     entry void doStep(CkCallback cb, int numSteps) {
54       atomic "begin_iteration" {
55         begin_iteration();
56       }
57       for(imsg = 0; imsg < numExpected; imsg++) {
58         // "iterations" keeps track of messages across steps
59         when
60           receiveGhosts[iterations] (int iter, int dir, int size,
61                                      double ghosts[size])
62           atomic "process ghosts" {
63             processGhosts(dir, size, ghosts);
64           }
65       }
66       atomic "doWork" {
67         check_and_compute(cb, numSteps);
68       }
69     };
70   };
71 };