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