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