added example of alltoall
[charm.git] / examples / charm++ / allToAll / allToAll.C
1 #include "allToAll.decl.h"
2
3 /*readonly*/ CProxy_Main mainProxy;
4 /*readonly*/ int numChares;
5 /*readonly*/ int msgSize;
6 /*readonly*/ int max_iter;
7
8 struct allToAllMsg : public CMessage_allToAllMsg {
9   char *data;
10 };
11
12 struct Main : public CBase_Main {
13         double start;
14         CProxy_allToAll allToAllProxy;
15     int         iter;
16
17         Main(CkArgMsg* m) {
18
19         max_iter = 1000;
20         numChares = CkNumPes();
21         msgSize = 1024;
22                 // 3D allToAll on a NxNxN array
23         if(m->argc >= 2)
24         {
25             msgSize = atoi(m->argv[1]);
26         }
27         if(m->argc >= 3)
28         {
29             numChares = atoi(m->argv[2]);
30         }
31         
32         delete m;
33
34         iter = 0;
35                 mainProxy = thisProxy;
36                 // Construct an array of allToAll chares to do the calculation
37                 allToAllProxy = CProxy_allToAll::ckNew(numChares);
38         }
39
40         void allToAllReady() {
41                 start = CkWallTimer();
42                 // Broadcast the 'go' signal to the allToAll chare array
43                 allToAllProxy.doAllToAll();
44         
45         }
46
47         void nextallToAll() {
48                 
49         iter++;
50         if(iter < max_iter)
51         {
52             allToAllProxy.doAllToAll();
53         }else
54         {
55             double time = CkWallTimer() - start;
56             CkPrintf("allToAll on %d cores for msg size: %d per iteration:%f ms\n",
57                 CkNumPes(), msgSize,  time/max_iter*1000);
58             CkExit();
59         }
60     }
61
62 };
63
64 struct allToAll : public CBase_allToAll {
65         allToAll_SDAG_CODE
66
67         int count;
68     int iter;
69     allToAllMsg  **msgs;
70     int recvCnt;
71
72         allToAll() {
73                  __sdag_init();
74         iter = 0;
75         recvCnt = 0;
76                 msgs = new allToAllMsg*[numChares];
77                 for(int i = 0; i < numChares; i++) {
78                         msgs[i] = new (msgSize) allToAllMsg;
79                 }
80
81                 // reduction to the mainchare to signal that initialization is complete
82                 contribute(CkCallback(CkReductionTarget(Main,allToAllReady), mainProxy));
83         }
84
85         // Sends transpose messages to every other chare
86         void sendAllToAll() {
87                 
88         for(int i = thisIndex; i < thisIndex+numChares; i++) {
89                         int t = i % numChares;
90                         CkSetRefNum(msgs[t],iter);
91                         thisProxy[t].getAllToAll(msgs[t]);
92                 }
93         }
94
95         // Sends transpose messages to every other chare
96         void getAllToAll() {
97         }
98
99     void processAllToAll(allToAllMsg *msg)
100     {
101         msgs[recvCnt] = msg;
102         recvCnt++;
103     }
104
105
106         void finish(){
107             recvCnt = 0;        
108         contribute(CkCallback(CkReductionTarget(Main,nextallToAll), mainProxy));
109         }
110
111         allToAll(CkMigrateMessage* m) {}
112         ~allToAll() {}
113
114 };
115
116 #include "allToAll.def.h"