msgQ test: Adjust test parameters (num priorities, numiters)
[charm.git] / tests / charm++ / startupTest / startupTest.C
1 #include "charm++.h"
2 #include "startupTest.decl.h"
3 #include <stdio.h>
4 #include <math.h>
5
6 #include "startupTest.h"
7
8 int intOne;
9 int arrSize;
10 double dOne;
11 double dTwo;
12 double WasteUnits;
13         
14 CkVec <int> IntArrOne;
15 CkVec <int> IntArrTwo;
16 CkVec <int> IntArrThree;
17 CkVec <int> IntArrFour;
18 CkVec <int> IntArrFive;
19 CkHashtableT<intdual, int> mapSix;
20 CkVec<CProxy_groupTest> groupProxy;
21 CkVec<CProxy_groupTestX> groupProxyX;
22 CProxy_main mainProxy;          
23 CProxy_ReadArrZero zeroProxy;           
24 CProxy_ReadArrOne oneProxy;             
25 CProxy_ReadArrTwo twoProxy;             
26 CProxy_ReadArrThree threeProxy;         
27 CProxy_ReadArrFour fourProxy;           
28 CProxy_ReadArrFive fiveProxy;           
29 CProxy_ReadArrSix sixProxy;             
30 CProxy_ReadArrSeven sevenProxy;         
31
32
33 main::main(CkArgMsg *msg)
34 {
35   int reported;
36   int validateBoundOrder=0;
37   if(msg->argc<4)
38     CkAbort("Usage: startupTest arrSize1 arrSize2 WasteUnits validateBoundOrder\n Where arrsize is int >0 wasteunit is double >0 validateBoundOrder is 1 or 0\n");
39   //get arrsize and wastetime from cmd line
40   arrSize=atoi(msg->argv[1]);
41   int arrSize2=atoi(msg->argv[2]);
42   sscanf(msg->argv[3],"%lg",&WasteUnits);
43   validateBoundOrder=atoi(msg->argv[4]);
44   mainProxy=thishandle;
45   if(arrSize<1 || arrSize2 < 1 || WasteUnits<=0 || (validateBoundOrder!=1 && validateBoundOrder!=0))
46     CkAbort("Usage: startupTest arrSize1 arrSize2 WasteUnits validateBoundOrder\n Where arrsize is int >0 wasteunit is double >0 validateBoundOrder is 1 or 0\n");
47   doneCount=0;
48   //init readonly values
49   CkPrintf("Nodes %d Cpus %d Using %d %d from %s %s %g from %s\n",CkNumNodes(), CkNumPes(),arrSize,arrSize2,msg->argv[1],msg->argv[2],WasteUnits, msg->argv[3]);
50   intOne=1;
51   dOne=1.0;
52   dTwo=2.0;
53   for(int i=0;i<arrSize;i++)
54     {
55       IntArrOne.push_back(i);
56       IntArrTwo.push_back(i);
57       IntArrThree.push_back(i);
58       IntArrFour.push_back(i);
59       IntArrFive.push_back(i);
60     }
61   for(int i=0;i<arrSize;i++)
62     {
63       groupProxy.push_back(CProxy_groupTest::ckNew(i));
64     }
65   for(int i=0;i<arrSize;i++)
66     {
67       groupProxyX.push_back(CProxy_groupTestX::ckNew(i));
68     }
69   //create zero by default map
70   zeroProxy  = CProxy_ReadArrZero::ckNew();  
71   for(int i=0;i<arrSize;i++)
72     zeroProxy(i).insert(arrSize, WasteUnits);
73   zeroProxy.doneInserting();
74
75   // make our callbacks
76
77   CkCallback cb[9];
78   for(int i=0;i<7;i++)
79     {
80       cb[i]=CkCallback(CkIndex_ReadArrZero::receiveRed(NULL),CkArrayIndex1D(i),zeroProxy);
81     }
82   //create one-five by map then array
83
84   CProxy_OneMap oneMap = CProxy_OneMap::ckNew(WasteUnits);
85   CkArrayOptions arrOpts;
86   arrOpts.setMap(oneMap);
87   oneProxy  = CProxy_ReadArrOne::ckNew(arrSize, WasteUnits, cb[0],arrOpts);  
88   for(int i=0;i<arrSize;i++)
89     oneProxy(i).insert(arrSize, WasteUnits,cb[0]);
90   oneProxy.doneInserting();
91
92   CProxy_TwoMap twoMap = CProxy_TwoMap::ckNew(WasteUnits);
93   arrOpts.setMap(twoMap);
94   twoProxy  = CProxy_ReadArrTwo::ckNew(arrSize, WasteUnits, cb[1],arrOpts);  
95   for(int i=0;i<arrSize;i++)
96     twoProxy(i).insert(arrSize, WasteUnits,cb[1]);
97   twoProxy.doneInserting();
98
99   CProxy_ThreeMap threeMap = CProxy_ThreeMap::ckNew(WasteUnits);
100   arrOpts.setMap(threeMap);
101   threeProxy  = CProxy_ReadArrThree::ckNew(arrSize, WasteUnits, cb[2],arrOpts);  
102   for(int i=0;i<arrSize;i++)
103     threeProxy(i).insert(arrSize, WasteUnits,cb[2]);
104   threeProxy.doneInserting();
105
106   // make 4 new style
107   CkArrayOptions arrOptsBulk(arrSize);
108   CProxy_FourMap fourMap = CProxy_FourMap::ckNew(WasteUnits);
109   arrOptsBulk.setMap(fourMap);
110   fourProxy  = CProxy_ReadArrFour::ckNew(arrSize,WasteUnits,cb[3],arrOptsBulk);  
111   /*  for(int i=0;i<arrSize;i++)
112       fourProxy(i).insert(arrSize, WasteUnits);*/
113   fourProxy.doneInserting();
114
115   // make 5 a shadow of 4
116   CkArrayOptions arrOptsBind4(arrSize);
117   arrOptsBind4.bindTo(fourProxy);
118   fiveProxy  = CProxy_ReadArrFive::ckNew(arrSize, WasteUnits, validateBoundOrder,cb[4],arrOptsBind4);  
119   //  for(int i=0;i<arrSize;i++)
120   //    fiveProxy(i).insert(arrSize, WasteUnits);
121   fiveProxy.doneInserting();
122
123
124   //#define SIX_INSERT
125 #ifdef SIX_INSERT
126   // if you make six this way it may lose the race with seven 
127   CProxy_SixMap sixMap = CProxy_SixMap::ckNew(WasteUnits);
128   arrOpts.setMap(sixMap);
129   sixProxy  = CProxy_ReadArrSix::ckNew(arrSize, arrSize2, WasteUnits,cb[5], arrOpts);  
130   for(int i=0;i<arrSize;i++)
131     for(int j=0;j<arrSize2;j++)
132       sixProxy(i,j).insert(arrSize,arrSize2, WasteUnits,cb[5]);
133   sixProxy.doneInserting();
134 #else
135   // bulk build six
136   CkArrayOptions arrOptsSix(arrSize,arrSize2);
137   CProxy_SixMap sixMap = CProxy_SixMap::ckNew(WasteUnits);
138   arrOptsSix.setMap(sixMap);
139   sixProxy  = CProxy_ReadArrSix::ckNew(arrSize,arrSize2, WasteUnits, cb[5],arrOptsSix);  
140   sixProxy.doneInserting();
141
142 #endif
143
144   // make seven a shadow of six
145   //#define SEVEN_INSERT
146 #ifdef SEVEN_INSERT
147
148   CkArrayOptions arrOptsBind6;
149   arrOptsBind6.bindTo(sixProxy);
150   sevenProxy  = CProxy_ReadArrSeven::ckNew(arrSize, arrSize2,WasteUnits, validateBoundOrder,cb[6],arrOptsBind6);  
151   for(int i=0;i<arrSize;i++)
152     for(int j=0;j<arrSize2;j++)
153       sevenProxy(i,j).insert(arrSize, arrSize2,WasteUnits,validateBoundOrder,cb[6]);
154   sevenProxy.doneInserting();
155
156 #else
157
158   CkArrayOptions arrOptsBind6(arrSize,arrSize2);
159   arrOptsBind6.bindTo(sixProxy);
160   sevenProxy  = CProxy_ReadArrSeven::ckNew(arrSize, arrSize2,WasteUnits, validateBoundOrder,cb[6],arrOptsBind6);  
161   sevenProxy.doneInserting();
162 #endif  
163
164   CheckAllReadOnly();
165   CkPrintf("Setup Complete for arrSize %d WasteUnits %g\n",arrSize, WasteUnits);
166   zeroProxy.dowork(); 
167   oneProxy.dowork(); 
168   twoProxy.dowork(); 
169   threeProxy.dowork(); 
170   fourProxy.dowork(); 
171   fiveProxy.dowork(); 
172   sixProxy.dowork(); 
173   sevenProxy.dowork(); 
174 };
175
176 void main::createReport(CkReductionMsg *msg)
177 {
178   //  int count=((int *) msg->getData())[0];
179   int array=(int) msg->getUserFlag();
180   delete msg;
181   CkPrintf("Create Report for %d\n",array);
182   /*
183   switch (array){
184
185   case 0 :  zeroProxy.dowork(); break;
186   case 1 :  oneProxy.dowork(); break;
187   case 2 :  twoProxy.dowork(); break;
188   case 3 :  threeProxy.dowork(); break;
189   case 4 :  fourProxy.dowork(); break;
190   case 5 :  fiveProxy.dowork(); break;
191   default: CkAbort("impossible user flag"); break;
192   }
193   */
194 };
195
196 void main::doneReport(CkReductionMsg *msg)
197 {
198   //  int count=(int) msg->getData()[0];
199   int array=(int) msg->getUserFlag();
200   delete msg;
201   CkPrintf("Done Report for %d\n",array);  
202   doneCount++;
203   if(doneCount==8)
204     {
205       CkPrintf("All Done %d\n",doneCount);  
206       CkExit();
207     }
208 };
209
210 int OneMap::procNum(int hdl, const CkArrayIndex &idx)
211 {
212   CkArrayIndex1D idx1d = *(CkArrayIndex1D *) &idx;
213   return(IntArrOne[idx1d.index]%CkNumPes());
214 };
215
216 int TwoMap::procNum(int hdl, const CkArrayIndex &idx)
217 {
218   CkArrayIndex1D idx1d = *(CkArrayIndex1D *) &idx;
219   return(IntArrTwo[idx1d.index]%CkNumPes());
220 };
221
222 int ThreeMap::procNum(int hdl, const CkArrayIndex &idx)
223 {
224   CkArrayIndex1D idx1d = *(CkArrayIndex1D *) &idx;
225   return(IntArrThree[idx1d.index]%CkNumPes());
226 };
227
228 int FourMap::procNum(int hdl, const CkArrayIndex &idx)
229 {
230   CkArrayIndex1D idx1d = *(CkArrayIndex1D *) &idx;
231   return(IntArrFour[idx1d.index]%CkNumPes());
232 };
233
234 int FiveMap::procNum(int hdl, const CkArrayIndex &idx)
235 {
236   CkArrayIndex1D idx1d = *(CkArrayIndex1D *) &idx;
237   int retval=IntArrFive[idx1d.index]%CkNumPes();
238   //  CkPrintf("procnum five %d %d\n",idx1d.index,retval);
239   return(retval);
240 };
241
242
243 int SixMap::procNum(int hdl, const CkArrayIndex &idx)
244 {
245   CkArrayIndex2D idx2d = *(CkArrayIndex2D *) &idx;
246   int retval=(idx2d.index[0]+idx2d.index[1])%CkNumPes();
247   //  CkPrintf("procnum Six %d %d %d\n",idx2d.index[0],idx2d.index[1],retval);
248   return(retval);
249 };
250
251
252
253 void WasteTime(double howmuch)
254 {
255   double start = CmiWallTimer();
256   while (CmiWallTimer() - start < howmuch) ;
257   
258 };
259
260
261 bool CheckAllReadOnly()
262 {
263
264   CkAssert(intOne==1);
265   CkAssert(dOne==1.0);
266   CkAssert(dTwo==2.0);
267   CkAssert(arrSize>0);
268   for(int i=0;i<arrSize;i++)
269     {
270       CkAssert(IntArrOne[i]==i);
271       CkAssert(IntArrTwo[i]==i);
272       CkAssert(IntArrThree[i]==i);
273       CkAssert(IntArrFour[i]==i);
274       CkAssert(IntArrFive[i]==i);
275     }
276   return(true);
277 };
278
279
280
281 #include "startupTest.def.h"