New benchmarks to test the learning framework. Several new tests are now enabled.
[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 100
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         arr.start(size);
101     };
102     
103     void send(void) {
104         
105       mcount ++;
106       
107       if (mcount == nElements){
108         
109         pass ++;
110         mcount = 0;
111         
112         CkPrintf("%d %5.4lf\n", size, (CmiWallTimer() - curTime)*1000/
113                  MAXITER);
114         curTime = CkWallTimer();
115         
116         if(pass == NUMPASS)
117           done();
118         else            
119           arr.start(size);
120       }
121     }
122     
123     void done()
124     {   
125       superpass ++;
126       mcount = 0;
127       pass = 0;
128       
129       if(superpass == 10)
130           CkExit();
131       else {
132           if(superpass < 20)
133               size += 50;
134           else if(superpass < 30)
135               size += 100;
136           else if(superpass < 40)
137               size += 200;
138           else if(superpass < 50)
139               size += 500;
140           
141           arr.start(size);
142       }
143     }
144 };
145
146 /*array [1D]*/
147 class Bench : public ArrayElement1D
148 {
149   int pass;
150     int mcount;
151     int ite;
152     int msize;
153     double startTime;
154     ComlibInstanceHandle myInst;
155     CProxy_Bench arrd;      
156
157 public:
158   
159     Bench(ComlibInstanceHandle cinst)
160     {   
161         pass = 0;
162         mcount = 0;
163         ite = 0;
164         msize = 0;
165
166         myInst = cinst;
167
168         myInst.setSourcePe();
169
170         usesAtSync = CmiTrue;
171         setMigratable(true);
172
173         arrd = arr;
174         ComlibDelegateProxy(&arrd);
175     }
176     
177     Bench(CkMigrateMessage *m) {
178         CkPrintf("Migrated to %d\n", CkMyPe());
179         //myInst = cinst;
180     }
181     
182     void sendMessage()
183     {
184 #ifdef USELIB
185         myInst.beginIteration();
186 #endif        
187         for(int count = 0; count < nElements; count ++){
188             
189             ComlibPrintf("[%d] Sending Message from %d to %d\n", CkMyPe(), thisIndex, count);
190
191 #ifdef USELIB
192             arrd[count].receiveMessage(new (&msize, 0) BenchMessage); 
193 #else
194             arr[count].receiveMessage(new (&msize, 0) BenchMessage);
195 #endif
196         }
197
198 #ifdef USELIB
199         myInst.endIteration();
200 #endif        
201     }
202     
203     void receiveMessage(BenchMessage *bmsg){
204         
205         delete bmsg;
206         mcount ++;
207         
208         ComlibPrintf("In Receive Message %d %d %d\n", thisIndex, CkMyPe(), 
209                      pass);
210
211         if(mcount == nElements){
212             mcount = 0;            
213             pass ++;            
214             CProxy_Main mainProxy(mid);
215             if(pass == MAXITER){
216                 pass = 0;
217                 
218                 mainProxy.send();
219             }
220             else
221                 sendMessage();
222         }
223     }
224     
225     void start(int messagesize){
226         msize = messagesize;
227
228         if(ite % NUMPASS == NUMPASS/2 || ite % NUMPASS == 1)  
229             //Call atsync in the middle and in the end
230             AtSync();
231         else
232             sendMessage();
233         
234         //CkPrintf("In Start\n");
235         ite ++;
236     }
237
238     void ResumeFromSync() {
239         CkPrintf("%d: resuming\n", CkMyPe());
240         myInst.setSourcePe();
241         sendMessage();
242     }
243
244     void pup(PUP::er &p) {
245         if(p.isPacking())
246             CkPrintf("Migrating from %d\n", CkMyPe());
247
248         ArrayElement1D::pup(p);
249         p | pass ;
250         p | mcount ;
251         p | ite ;
252         p | startTime;
253         p | arrd;
254         p | myInst;
255         p | msize;
256     }
257 };
258
259
260 #include "bench.def.h"
261