Revert "Drop requirement for user code to call CBase_foo::pup(p)"
[charm.git] / tests / charm++ / delegation / pipelined-section-reduction / 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
12 int NumElements;                        // readonly
13 int CompleteMsgSize;
14 int NumFrags;
15 int NumReductions;
16 int SectionSize;
17
18 void client(CkSectionInfo sid, void *param, int dataSize, void *data);
19
20 class HiMsg : public CkMcastBaseMsg, public CMessage_HiMsg
21 {
22 public:
23   int *data;
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 < 6) {
43       CkAbort("Usage: hello <nElements> <completeMsgSize> <nFrags> <nReductioins> <sectionSize>\n");
44     }
45     NumElements = atoi(m->argv[1]);
46     CompleteMsgSize = atoi(m->argv[2]);
47     NumFrags = atoi(m->argv[3]);
48     NumReductions = atoi(m->argv[4]);
49     SectionSize = atoi(m->argv[5]);
50
51     delete m;
52     CkPrintf("Running Hello on %d processors for %d elements\n",
53              CkNumPes(),NumElements);
54     mid = thishandle;
55
56     arr = CProxy_Hello::ckNew(NumElements);
57
58     mCastGrpId = CProxy_CkMulticastMgr::ckNew();
59
60     arr[0].start();
61
62   };
63
64   void maindone(void)
65   {
66     static int count = 0;
67     count ++;
68     CkPrintf("All done\n");
69     CkExit();
70   };
71 };
72
73
74 class Hello : public CBase_Hello
75 {
76 private:
77   CkSectionInfo sid;
78   int init;
79   myReductionCounter cnt;
80   CProxySection_Hello mcp;
81   int sectionSize;
82   double startTime;
83   double endTime;
84   int redNo;
85
86 public:
87   Hello()
88   {
89     //CkPrintf("Hello %d created\n",thisIndex);
90     init = 0;
91     redNo = 0;
92   }
93
94   Hello(CkMigrateMessage *m) {}
95
96   void start()
97   {
98     CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch();
99
100     sectionSize = SectionSize;
101     if (sectionSize > NumElements) sectionSize = NumElements;
102     CkArrayIndex *al = new CkArrayIndex[sectionSize];
103     for (int i=0; i<sectionSize; i++) {
104       al[i] = CkArrayIndex1D(i);
105     }
106     mcp = CProxySection_Hello::ckNew(thisArrayID, al, sectionSize);
107     mcp.ckSectionDelegate(mg);
108     delete [] al;
109     cnt.reductionsRemaining=NumReductions;
110     cnt.reductionNo=0;
111     CkCallback *cb = new CkCallback(CkIndex_Hello::cb_client(NULL), CkArrayIndex1D(0), thisProxy);
112     mg->setReductionClient(mcp, cb);
113
114     HiMsg *hiMsg = new (2, 0) HiMsg;
115     hiMsg->data[0] = 22;
116     hiMsg->data[1] = 28;
117     startTime = CkWallTimer ();
118     mcp.SayHi(hiMsg);
119   }
120   
121   void cb_client(CkReductionMsg *msg)
122   {
123     endTime = CkWallTimer ();
124     int dataSize = msg->getSize();
125     void *data = msg->getData();
126     CmiPrintf("%e\n", endTime-startTime); 
127
128     // check correctness
129     int result;
130     int redno = msg->getRedNo();
131     result = 0;
132     for (int i=0; i<sectionSize; i++) result+=i;
133
134     if (*(int *)data != result) {
135       CmiPrintf("Expected: %d acual:%d\n", result, *(int *)data);
136       CmiAbort("reduction result is wrong!");
137     }
138   
139     cnt.reductionsRemaining--;
140     if (cnt.reductionsRemaining<=0) {
141       CProxy_main mproxy(mid);
142       mproxy.maindone();
143       cnt.reductionNo++;
144     }
145     else {
146       HiMsg *hiMsg = new (2, 0) HiMsg;
147       hiMsg->data[0] = 22;
148       hiMsg->data[1] = 28;
149       startTime = CkWallTimer ();  
150       mcp.SayHi(hiMsg);
151       cnt.reductionNo++;
152     }
153     delete msg;
154   }
155
156   void SayHi(HiMsg *m)
157   {
158     redNo ++;
159     CmiAssert(m->data[0] == 22 && m->data[1] == 28);
160
161     CkGetSectionInfo(sid, m);
162
163     CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch();
164     int dataSize = (int)(CompleteMsgSize);
165     int* data = new int [dataSize];
166     int fragSize = dataSize/NumFrags;
167     CkAssert (0 != fragSize);
168     for (int i=0; i<dataSize; i++) {
169       data [i] = thisIndex;
170     }
171     CkCallback cb(CkIndex_Hello::cb_client(NULL), CkArrayIndex1D(0), thisProxy);
172     mg->contribute(dataSize*sizeof(int), data,CkReduction::sum_int, sid, cb, fragSize*sizeof(int));
173 //    data[0] = thisIndex+2;
174 //    data[1] = thisIndex+2;
175 //    mg->contribute(2*sizeof(int), &data,CkReduction::max_int, sid, sizeof(int));
176 //    data[0] = thisIndex+1;
177 //    data[1] = thisIndex+1;
178 //    mg->contribute(2*sizeof(int), &data,CkReduction::product_int, sid, sizeof(int));
179     delete m;
180     if (1)
181       ckMigrate((CkMyPe()+1)%CkNumPes());
182   }
183
184   void pup(PUP::er &p) {
185     CBase_Hello::pup(p);//Call superclass
186     p|sid;
187     p(init);
188     p|cnt;
189     p|mcp;
190     p|sectionSize;
191     p|startTime;
192     p|endTime;
193     p|redNo;
194   }
195 };
196
197 #include "hello.def.h"