Revert "Drop requirement for user code to call CBase_foo::pup(p)"
[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     CBase_Hello::pup(p);//Call superclass
208     p|sid;
209     p(init);
210     p|cnt;
211     p|mcp;
212 #if 1
213     if (p.isUnpacking() && thisIndex == 0) {
214       CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch();
215       mg->resetSection(mcp);
216       CkCallback *cb = new CkCallback(CkIndex_Hello::cb_client(NULL), CkArrayIndex1D(0), thisProxy);
217       mg->setReductionClient(mcp, cb);
218     }
219 #endif
220   }
221 };
222
223 #if 0
224 void client(CkSectionInfo sid, void *param, int dataSize, void *data)
225 {
226   myReductionCounter *c=(myReductionCounter *)param;
227   CmiPrintf("RESULT [%d]: %d\n", c->reductionNo, *(int *)data); 
228   // check correctness
229   int result;
230   if (c->reductionNo%3 == 0) {
231     result = 0;
232     for (int i=0; i<sectionSize; i++) result+=i;
233   }
234   else if (c->reductionNo%3 == 2) {
235     result = 1;
236     for (int i=1; i<sectionSize+1; i++) result*=i;
237   }
238   else {
239     result = sectionSize+1;
240   }
241   if (*(int *)data != result) {
242     CmiAbort("wrong!");
243   }
244
245   c->reductionsRemaining--;
246   if (c->reductionsRemaining<=0) {
247     CProxy_main mproxy(mid);
248     mproxy.maindone();
249     c->reductionNo++;
250   }
251   else {
252     CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch();
253     if (c->reductionNo % 32 == 0)
254     mg->rebuild(mcp.ckGetSectionInfo());
255
256     if (c->reductionNo%3 == 0) {
257     HiMsg *hiMsg = new (1, 0) HiMsg;
258     hiMsg->data[0] = 18+c->reductionNo;
259     mcp.SayHi(hiMsg);
260     }
261     c->reductionNo++;
262   }
263 }
264 #endif
265
266 #include "hello.def.h"