added CQWrite support for persistent message
[charm.git] / examples / pose / ASIM / pgm.C
1 #include <unistd.h>
2 #include <math.h>
3 #include "pose.h"
4 #include "pgm.h"
5 #include "Pgm.def.h"
6 #include "Worker_sim.h"
7
8 main::main(CkArgMsg *m)
9 {
10   CkGetChareID(&mainhandle);
11   //  CProxy_main M(mainhandle);
12
13   int numObjs=-1, numMsgs=-1, msgSize=-1, distribution=-1, connectivity=-1,
14     locality=-1, grainSize=-1, elapsePattern=-1, offsetPattern=-1,
15     sendPattern=-1, pattern=-1, i;
16   double granularity=-1.0;
17   char grainString[20];
18   char *text;
19
20   if(m->argc<10) {
21     CkPrintf("Usage: asim <numObjs> <numMsgs> <msgSize> <distribution> <connectivitiy> <locality> <endTime> [ -g[f|m|c|z] | -t<granularity> ] <pattern>\n");
22     CkExit();
23   }
24   numObjs = atoi(m->argv[1]);
25   map = (int *)malloc(numObjs*sizeof(int));
26   numMsgs = atoi(m->argv[2]);
27   msgSize = atoi(m->argv[3]);
28   text = "";
29   if (msgSize == MIX_MS) { text = "MIXED"; }
30   else if (msgSize == SMALL) { text = "SMALL"; }
31   else if (msgSize == MEDIUM) { text = "MEDIUM"; }
32   else if (msgSize == LARGE) { text = "LARGE"; }
33
34   CkPrintf("asim run with: %d objects  %d messages  %s message size\n",
35            numObjs, numMsgs, text);
36
37   if (strcmp(m->argv[4], "RANDOM") == 0)
38     distribution = RANDOM;
39   else if (strcmp(m->argv[4], "IMBALANCED") == 0)
40     distribution = IMBALANCED;
41   else if (strcmp(m->argv[4], "UNIFORM") == 0)
42     distribution = UNIFORM;
43   else {
44     CkPrintf("Invalid distribution type: %s\n", m->argv[4]);
45     CkExit();
46   }
47
48   if (strcmp(m->argv[5], "SPARSE") == 0)
49     connectivity = SPARSE;
50   else if (strcmp(m->argv[5], "HEAVY") == 0)
51     connectivity = HEAVY;
52   else if (strcmp(m->argv[5], "FULL") == 0)
53     connectivity = FULL;
54   else {
55     CkPrintf("Invalid connectivity type: %s\n", m->argv[5]);
56     CkExit();
57   }
58
59   locality = atoi(m->argv[6]);
60   strcpy(grainString, m->argv[8]);
61   if (strcmp(grainString, "-gf") == 0) {
62     grainSize = FINE; text = "FINE"; }
63   else if (strcmp(grainString, "-gm") == 0) {
64     grainSize = MEDIUM_GS; text = "MEDIUM"; }
65   else if (strcmp(grainString, "-gc") == 0) {
66     grainSize = COARSE; text = "COARSE"; }
67   else if (strcmp(grainString, "-gz") == 0) {
68     grainSize = MIX_GS; text = "MIXED"; }
69   else if (strncmp(grainString, "-t", 2) == 0)
70     granularity = atof(&(grainString[2]));
71
72   CkPrintf("%s distribution  %s connectivity  %d%% locality  %d endtime  %s grainsize %f granularity\n",
73            m->argv[4], m->argv[5], locality, atoi(m->argv[7]), text, granularity);
74
75   pattern = atoi(m->argv[9]);
76   elapsePattern = pattern / 100;
77   pattern -= elapsePattern*100;
78   offsetPattern = pattern / 10;
79   pattern -= offsetPattern*10;
80   sendPattern = pattern;
81
82   CkPrintf("  %d elapsePattern  %d offsetPattern  %d sendPattern\n",
83            elapsePattern, offsetPattern, sendPattern);
84
85 #if USE_LONG_TIMESTAMPS
86   long long endtime = atoll(m->argv[7]);
87   if(endtime == -1)
88     POSE_init();
89   else
90     POSE_init(endtime);
91 #else
92   int endtime = atoll(m->argv[7]);
93   if(endtime == -1)
94     POSE_init();
95   else
96     POSE_init(endtime);
97 #endif
98
99   // create all the workers
100   WorkerData *wd;
101   int dest, j;
102   srand48(42);
103   buildMap(numObjs, distribution);
104   for (i=0; i<numObjs; i++) {
105     wd = new WorkerData;
106     dest = map[i];
107
108     wd->numObjs = numObjs;
109     wd->numMsgs = numMsgs;
110     wd->msgSize = msgSize;
111     wd->distribution = distribution;
112     wd->connectivity = connectivity;
113     wd->locality = locality;
114     wd->grainSize = grainSize;
115     wd->elapsePattern = elapsePattern;
116     wd->offsetPattern = offsetPattern;
117     wd->sendPattern = sendPattern;
118
119     wd->granularity = granularity;
120
121     // compute elapseTimes, numSends, offsets, neighbors, numNbrs
122     if (connectivity == SPARSE) wd->numNbrs = 4;
123     else if (connectivity == HEAVY) wd->numNbrs = 25;
124     else if (connectivity == FULL) wd->numNbrs = 100;
125
126     if (elapsePattern == 1)
127       for (j=0; j<5; j++) wd->elapseTimes[j] = (lrand48() % 2);
128     else if (elapsePattern == 2)
129       for (j=0; j<5; j++) wd->elapseTimes[j] = (lrand48() % 48) + 3;
130     else if (elapsePattern == 3)
131       for (j=0; j<5; j++) wd->elapseTimes[j] = (lrand48() % 50) + 51;
132     else if (elapsePattern == 4)
133       for (j=0; j<5; j++) wd->elapseTimes[j] = (lrand48() % 400) + 101;
134     else if (elapsePattern == 5)
135       for (j=0; j<5; j++) wd->elapseTimes[j] = (lrand48() % 500) + 501;
136
137     if (offsetPattern == 1)
138       for (j=0; j<5; j++) wd->offsets[j] = (lrand48() % 2);
139     else if (offsetPattern == 2)
140       for (j=0; j<5; j++) wd->offsets[j] = (lrand48() % 48) + 3;
141     else if (offsetPattern == 3)
142       for (j=0; j<5; j++) wd->offsets[j] = (lrand48() % 50) + 51;
143     else if (offsetPattern == 4)
144       for (j=0; j<5; j++) wd->offsets[j] = (lrand48() % 400) + 101;
145     else if (offsetPattern == 5)
146       for (j=0; j<5; j++) wd->offsets[j] = (lrand48() % 500) + 501;
147
148     if (sendPattern == 1)
149       for (j=0; j<5; j++) wd->numSends[j] = (lrand48()%numMsgs)/4;
150     else if (sendPattern == 2)
151       for (j=0; j<5; j++) wd->numSends[j] = (lrand48()%numMsgs)/3;
152     else if (sendPattern == 3)
153       for (j=0; j<5; j++) wd->numSends[j] = (lrand48()%numMsgs)/2;
154     else if (sendPattern == 4)
155       for (j=0; j<5; j++) wd->numSends[j] = (lrand48()%numMsgs);
156
157     for (j=0; j<wd->numNbrs; j++)
158       wd->neighbors[j] = getAnbr(numObjs, locality, dest);
159
160     wd->Timestamp(0);
161     //wd->dump();
162     if (distribution == RANDOM)
163       (*(CProxy_worker *) &POSE_Objects)[i].insert(wd);
164     else
165       (*(CProxy_worker *) &POSE_Objects)[i].insert(wd, dest);
166   }
167   POSE_Objects.doneInserting();
168 }
169
170 void main::buildMap(int numObjs, int dist)
171 {
172   int i, j=0, k;
173   if (dist == RANDOM)
174     for (i=0; i<numObjs; i++) map[i] = lrand48() % CkNumPes();
175   else if (dist == UNIFORM)
176     for (i=0; i<numObjs; i++) map[i] = i % CkNumPes();
177   else if (dist == IMBALANCED) {
178     int min = (numObjs/CkNumPes())/2;
179     if (min < 1) min = 1;
180     for (k=0; k<CkNumPes(); k++)
181       for (i=0; i<min; i++) {
182         map[j] = k;
183         j++;
184       }
185     i=CkNumPes()/2;
186     for (k=j; k<numObjs; k++) {
187       map[k] = i;
188       i++;
189       if (i == CkNumPes()) i = CkNumPes()/2;
190     }
191   }
192 }
193
194 int main::getAnbr(int numObjs, int locale, int dest)
195 {
196   int here = (lrand48() % 101) <= locale;
197   int idx;
198   if (CkNumPes() == 1) return lrand48() % numObjs;
199   if (here) {
200     idx = lrand48() % numObjs;
201     while (map[idx] != dest)
202       idx = lrand48() % numObjs;
203     return idx;
204   }
205   else {
206     idx = lrand48() % numObjs;
207     while (map[idx] == dest)
208       idx = lrand48() % numObjs;
209     return idx;
210   }
211 }
212