reducing iterations for these two too!
[charm.git] / tests / charm++ / commtest / comlib / benchmulti.C
1
2 #include <stdio.h>
3 #include <string.h>
4
5 #include <sys/time.h>
6 #include <sys/resource.h>
7 #include <unistd.h>
8
9 #include "ComlibManager.h"
10 #include "EachToManyMulticastStrategy.h"
11 #include "BroadcastStrategy.h"
12 #include "bench.decl.h"
13
14 #define USELIB
15 #define MAXPASS 10
16
17 int MESSAGESIZE=128;
18 /*readonly*/ CkChareID mid;
19 /*readonly*/ CProxy_Bench arr;
20 /*readonly*/ int nElements;
21
22 void callbackhandler(void *message){
23     //CkPrintf("[%d]In callback function\n", CkMyPe());
24     
25     BenchMessage *bm = (BenchMessage *)EnvToUsr((envelope *)message);
26     arr[CkMyPe()].receiveMessage(bm);
27 }
28
29 class BenchMessage : public CMessage_BenchMessage {
30 public:
31     int size;
32     char *data;
33     int src;
34     
35     static void *alloc(int mnum, size_t size, int *sizes, int priobits){
36         int total_size = size + sizeof(char) * sizes[0];
37         BenchMessage *dmsg = (BenchMessage *)CkAllocMsg(mnum, total_size, 
38                                                         priobits);
39         dmsg->size = sizes[0];        
40         return (void *)dmsg;
41     }
42     
43     static void *pack(BenchMessage *msg){
44         return (void *)msg;
45     }
46     
47     static BenchMessage *unpack(void *buf){
48         BenchMessage *bmsg = (BenchMessage *)buf;
49         return bmsg;
50     }
51 };
52
53 /*mainchare*/
54 class Main : public Chare
55 {
56     int pass, superpass;
57     double curTime;
58 public:
59     Main(CkArgMsg* m)
60     {
61         //Process command-line arguments
62         pass = 0;
63         superpass = 0;
64         nElements= CkNumPes();
65
66         if(m->argc > 1 ) MESSAGESIZE=atoi(m->argv[1]);
67
68         if(m->argc > 2 ) nElements=atoi(m->argv[2]);
69
70         delete m;
71         
72         CkPrintf("Running Bench on %d processors for %d elements with %d byte messages\n", CkNumPes(), nElements, MESSAGESIZE);
73         
74         mid = thishandle;        
75
76         arr = CProxy_Bench::ckNew();
77                 
78         int count = 0;
79         CkArrayIndexMax *elem_array = new CkArrayIndexMax[nElements];
80         for(count = 0; count < nElements; count ++) {
81             elem_array[count] = CkArrayIndex1D(count);
82         }
83
84         EachToManyMulticastStrategy *strat = new 
85             EachToManyMulticastStrategy(USE_MESH, arr.ckGetArrayID(), 
86                                         arr.ckGetArrayID(),
87                                         nElements, elem_array,
88                                         nElements, elem_array);
89
90         strat->setMulticast();
91
92         BroadcastStrategy *bstrat = new BroadcastStrategy
93             (arr.ckGetArrayID(), USE_HYPERCUBE);
94         
95         CkPrintf("After creating array\n");
96         CkArrayID aid = arr.ckGetArrayID();
97
98         ComlibInstanceHandle cinst = CkGetComlibInstance();        
99         cinst.setStrategy(strat);
100         ComlibPrintf("After register strategy\n");
101
102         for(count = 0; count < nElements; count++)
103             arr[count].insert(cinst);
104         arr.doneInserting();
105         
106         curTime = CkWallTimer();
107         arr.sendMessage();
108         CkPrintf("After Main\n");
109     };
110     
111     void send(void) {
112         
113         static int count = 0;
114         count ++;
115
116         if (count == nElements){
117             pass ++;
118             count = 0;
119             arr.sendMessage();
120         }
121     }
122     
123     void done()
124     {
125         static int count = 0;
126         
127         count ++;
128         
129         if(count == nElements) {
130             CkPrintf("%d %5.4lf\n", MESSAGESIZE, (CmiWallTimer() - curTime)*1000/MAXPASS);
131
132             curTime = CkWallTimer();
133             superpass ++;
134             pass = 0;
135             count = 0;
136
137             if(superpass == 10)
138                 CkExit();
139             else {
140                 if(superpass < 20)
141                     MESSAGESIZE += 50;
142                 else if(superpass < 30)
143                     MESSAGESIZE += 100;
144                 else if(superpass < 40)
145                     MESSAGESIZE += 200;
146                 else if(superpass < 50)
147                     MESSAGESIZE += 500;
148                 
149                 arr.start(MESSAGESIZE);
150             }
151         }
152     }
153 };
154
155 /*array [1D]*/
156 class Bench : public CBase_Bench 
157 {
158     int pass;
159     int mcount;
160     double time, startTime;
161     int firstEntryFlag, sendFinishedFlag;
162     CProxy_Bench arrd;
163     ComlibInstanceHandle myinst;
164
165 public:
166
167     void pup(PUP::er &p) {
168         if(p.isPacking())
169             CkPrintf("Migrating from %d\n", CkMyPe());
170
171         ArrayElement1D::pup(p);
172         p | pass ;
173         p | mcount ;
174         p | time;
175         p | startTime;
176         p | firstEntryFlag ;
177         p | sendFinishedFlag ;
178         p | myinst;
179         p | arrd;
180     }
181   
182     Bench(ComlibInstanceHandle cinst)
183     {   
184         pass = 0;
185         mcount = 0;
186         time = 0.0;
187         
188         firstEntryFlag = 0;
189         sendFinishedFlag = 0;
190
191         arrd = thisProxy;
192         ComlibDelegateProxy(&arrd);
193
194         CkArrayIndexMax *elem_array = new CkArrayIndexMax[nElements];
195         for(int count = 0; count < nElements; count ++) 
196             elem_array[count] = CkArrayIndex1D(count);
197         
198         usesAtSync = CmiTrue;
199         setMigratable(true);
200         myinst = cinst;
201     }
202     
203     Bench(CkMigrateMessage *m) {
204         CkPrintf(" Migrated to %d\n", CkMyPe());
205     }
206     
207     void sendMessage()
208     {
209         if(thisIndex >= nElements) {
210             finishPass();
211             return;
212         }
213         
214 #ifdef USELIB
215         myinst.beginIteration();
216 #endif
217
218         int count = 0;
219         int size = MESSAGESIZE;
220         
221 #ifdef USELIB
222         arrd.receiveMessage(new(&size, 0) BenchMessage);
223 #else
224         arr[count].receiveMessage(new (&size, 0) BenchMessage);
225 #endif
226
227 #ifdef USELIB
228         myinst.endIteration();
229 #endif
230
231         sendFinishedFlag = 1;   
232     }
233     
234     void receiveMessage(BenchMessage *bmsg){
235         
236         ComlibPrintf("[%d][%d] In Receive Message \n", CkMyPe(), thisIndex);
237         
238         if(!firstEntryFlag) {
239             startTime = CkWallTimer();
240             firstEntryFlag = 1;
241         }
242         
243         delete bmsg;
244         
245         mcount ++;
246
247         if(mcount == nElements){
248             finishPass();
249         }
250     }
251
252     void start(int messagesize){
253         //CkPrintf("In Start\n");
254         MESSAGESIZE = messagesize;
255         
256         if(firstEntryFlag) {
257             CkPrintf("Calling AtSync\n");
258             AtSync();
259         }
260         else
261             sendMessage();
262     }
263
264     void ResumeFromSync() {
265         myinst.setSourcePe();
266         sendMessage();
267     }
268
269     void finishPass(){
270         mcount = 0;            
271         pass ++;        
272         time += CkWallTimer() - startTime;
273
274         CProxy_Main mainProxy(mid);
275         if(pass == MAXPASS){
276             pass = 0;
277             mainProxy.done();
278         }
279         else {
280             sendMessage();
281             int x = 0;
282         }
283         
284         sendFinishedFlag = 0;
285     }
286 };
287
288 #include "bench.def.h"