0df7ea9287e07e4fd73ab5aa26deb710871e0f17
[charm.git] / tests / charm++ / delegation / multicast / hello.C
1 #include <stdio.h>
2 #include "charm++.h"
3 #include "ckmulticast.h"
4
5 #include "hello.decl.h"
6
7 CkChareID mid;
8 CProxy_Hello arr;
9 CkGroupID mCastGrpId;
10 CProxySection_Hello *mcast;
11 int nElements;                  // readonly
12 int sectionSize;                // readonly
13
14 #define SECTIONSIZE  6
15 #define REDUCE_TIME  100
16
17 void client(CkSectionInfo sid, void *param, int dataSize, void *data);
18
19 class HiMsg : public CkMcastBaseMsg, public CMessage_HiMsg
20 {
21 public:
22   int *data;
23 //      HiMsg(int n) {data=n;}
24 };
25
26
27 class myReductionCounter {
28 public:
29   int reductionNo;
30   int reductionsRemaining;
31 public:
32   myReductionCounter(): reductionNo(0), reductionsRemaining(0) {}
33 };
34 PUPbytes(myReductionCounter)
35
36 class main : public CBase_main
37 {
38 public:
39   main(CkMigrateMessage *m) {}
40   main(CkArgMsg* m)
41   {
42     if(m->argc < 2) {
43       CkAbort("Usage: hello <nElements>\n");
44     }
45     nElements = atoi(m->argv[1]);
46     delete m;
47     CkPrintf("Running Hello on %d processors for %d elements\n",
48              CkNumPes(),nElements);
49     mid = thishandle;
50
51     sectionSize = SECTIONSIZE;
52     if (sectionSize > nElements) sectionSize = nElements;
53
54     arr = CProxy_Hello::ckNew(nElements);
55
56     mCastGrpId = CProxy_CkMulticastMgr::ckNew(3);   // new factor
57
58     arr[0].start();
59
60   };
61
62   void maindone(void)
63   {
64     static int count = 0;
65     count ++;
66 //    if (count < sectionSize*3) return;
67     CkPrintf("All done\n");
68     CkExit();
69   };
70 };
71
72
73 class Hello : public CBase_Hello
74 {
75 private:
76   CkSectionInfo sid;
77   int init;
78   myReductionCounter cnt;
79   CProxySection_Hello mcp;
80
81 public:
82   Hello()
83   {
84     CkPrintf("Hello %d created\n",thisIndex);
85     init = 0;
86   }
87
88   Hello(CkMigrateMessage *m) {}
89
90     // only on index 0
91   void start()
92   {
93     CkAssert(thisIndex == 0);
94 CmiPrintf("start %d elements\n", nElements);
95     CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch();
96
97     // create section proxy
98 //    CkVec<CkArrayIndex1D> al;
99 //    for (int i=0; i<sectionSize; i++)
100 //      al.push_back(CkArrayIndex1D(i));
101 //    mcp = CProxySection_Hello::ckNew(thisArrayID, al.getVec(), al.size());
102 #if 0
103     mcast = new CProxySection_Hello(thisArrayID, al, sectionSize, mCastGrpId);
104 #endif
105     mcp = CProxySection_Hello::ckNew(thisArrayID, 0, sectionSize-1, 1);
106     mcp.ckSectionDelegate(mg);
107
108 #if 0
109     mcp.ckDelegate(mg);
110     mg->setSection(mcp);
111 #endif
112
113 #if 0
114     mg->setSection(sid, thisArrayID, al, sectionSize);
115     sid.create(thisArrayID);
116     for (int i=0; i<sectionSize; i++) 
117       sid.addMember(CkArrayIndex1D(i));
118     mg->setSection(sid);
119 #endif
120
121     cnt.reductionsRemaining=REDUCE_TIME;
122     cnt.reductionNo=0;
123 //    mg->setReductionClient(mcp, client, cnt);
124     CkCallback *cb = new CkCallback(CkIndex_Hello::cb_client(NULL), CkArrayIndex1D(0), thisProxy);
125     mg->setReductionClient(mcp, cb);
126
127     HiMsg *hiMsg = new (2, 0) HiMsg;
128     hiMsg->data[0] = 22;
129     hiMsg->data[1] = 28;
130     mcp.SayHi(hiMsg);
131   }
132   
133 //  void cb_client(CkSectionInfo sid, void *param, int dataSize, void *data)
134   void cb_client(CkReductionMsg *msg)
135   {
136     int dataSize = msg->getSize();
137     void *data = msg->getData();
138     CmiPrintf("RESULT [%d]: %d\n", cnt.reductionNo, *(int *)data); 
139
140     // check correctness
141     int result;
142     int redno = msg->getRedNo();
143     if (redno%3 == 0) {
144       result = 0;
145       for (int i=0; i<sectionSize; i++) result+=i;
146     }
147     else if (redno%3 == 2) {
148       result = 1;
149       for (int i=1; i<sectionSize+1; i++) result*=i;
150     }
151     else {
152       result = sectionSize+1;
153     }
154     if (*(int *)data != result) {
155       CmiPrintf("Expected: %d acual:%d\n", result, *(int *)data);
156       CmiAbort("reduction result is wrong!");
157     }
158   
159     cnt.reductionsRemaining--;
160     if (cnt.reductionsRemaining<=0) {
161       CProxy_main mproxy(mid);
162       mproxy.maindone();
163       cnt.reductionNo++;
164     }
165     else {
166 #if 0
167       CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch();
168       if (cnt->reductionNo % 32 == 0)
169         mg->rebuild(mcp.ckGetSectionInfo());
170 #endif
171   
172       if (cnt.reductionNo%3 == 0) {
173         HiMsg *hiMsg = new (2, 0) HiMsg;
174         //hiMsg->data[0] = 18+cnt.reductionNo;
175         hiMsg->data[0] = 22;
176         hiMsg->data[1] = 28;
177         mcp.SayHi(hiMsg);
178       }
179       cnt.reductionNo++;
180     }
181     delete msg;
182   }
183
184   void SayHi(HiMsg *m)
185   {
186     // CkPrintf("[%d] Hi[%d] from element %d\n",CmiMyPe(), m->data[0],thisIndex);
187     CmiAssert(m->data[0] == 22 && m->data[1] == 28);
188
189     CkGetSectionInfo(sid, m);
190 //CmiPrintf("[%d] SayHi: sid on %d %p\n", CmiMyPe(), sid.pe, sid.val);
191
192     CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch();
193
194     int data = thisIndex;
195     CkCallback cb(CkIndex_Hello::cb_client(NULL), CkArrayIndex1D(0), thisProxy);
196     mg->contribute(sizeof(int), &data,CkReduction::sum_int, sid, cb);
197     data = thisIndex+2;
198     mg->contribute(sizeof(int), &data,CkReduction::max_int, sid);
199     data = thisIndex+1;
200     mg->contribute(sizeof(int), &data,CkReduction::product_int, sid);
201     delete m;
202     if (1)
203     ckMigrate((CkMyPe()+1)%CkNumPes());
204   }
205
206   void pup(PUP::er &p) {
207     p|sid;
208     p(init);
209     p|cnt;
210     p|mcp;
211 #if 1
212     if (p.isUnpacking() && thisIndex == 0) {
213       CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch();
214       mg->resetSection(mcp);
215       CkCallback *cb = new CkCallback(CkIndex_Hello::cb_client(NULL), CkArrayIndex1D(0), thisProxy);
216       mg->setReductionClient(mcp, cb);
217     }
218 #endif
219   }
220 };
221
222 #if 0
223 void client(CkSectionInfo sid, void *param, int dataSize, void *data)
224 {
225   myReductionCounter *c=(myReductionCounter *)param;
226   CmiPrintf("RESULT [%d]: %d\n", c->reductionNo, *(int *)data); 
227   // check correctness
228   int result;
229   if (c->reductionNo%3 == 0) {
230     result = 0;
231     for (int i=0; i<sectionSize; i++) result+=i;
232   }
233   else if (c->reductionNo%3 == 2) {
234     result = 1;
235     for (int i=1; i<sectionSize+1; i++) result*=i;
236   }
237   else {
238     result = sectionSize+1;
239   }
240   if (*(int *)data != result) {
241     CmiAbort("wrong!");
242   }
243
244   c->reductionsRemaining--;
245   if (c->reductionsRemaining<=0) {
246     CProxy_main mproxy(mid);
247     mproxy.maindone();
248     c->reductionNo++;
249   }
250   else {
251     CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch();
252     if (c->reductionNo % 32 == 0)
253     mg->rebuild(mcp.ckGetSectionInfo());
254
255     if (c->reductionNo%3 == 0) {
256     HiMsg *hiMsg = new (1, 0) HiMsg;
257     hiMsg->data[0] = 18+c->reductionNo;
258     mcp.SayHi(hiMsg);
259     }
260     c->reductionNo++;
261   }
262 }
263 #endif
264
265 #include "hello.def.h"