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