fa52102213f40515a4b6aa4c5b0071fd4b5a62c3
[charm.git] / examples / pose / Ring / 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
12   int numObjs=-1, numMsgs=-1, msgSize=-1, locality=-1, grainSize=-1;
13   int density=-1, i, totalObjs=-1;
14   double granularity=-1.0;
15   char grainString[20];
16   char *text;
17
18   if(m->argc<6) {
19     CkPrintf("Usage: simb <#objsPerProc> <#msgsPerObj> <msgSize(MIXED,SMALL,MEDIUM,LARGE)> [-g[f|m|c|z] | -t<granularity> ] <density(msgsPerVTU)>\n");
20     CkExit();
21   }
22   numObjs = atoi(m->argv[1]);
23   totalObjs = numObjs * CkNumPes();
24   map = (int *)malloc(totalObjs*sizeof(int));
25   numMsgs = atoi(m->argv[2]);
26   if (strcmp(m->argv[3], "MIXED") == 0)
27     msgSize = MIX_MS;
28   else if (strcmp(m->argv[3], "SMALL") == 0)
29     msgSize = SMALL;
30   else if (strcmp(m->argv[3], "MEDIUM") == 0)
31     msgSize = MEDIUM;
32   else if (strcmp(m->argv[3], "LARGE") == 0)
33     msgSize = LARGE;
34   else {
35     CkPrintf("Invalid message size: %s\n", m->argv[8]);
36     CkExit();
37   }
38
39   CkPrintf(">>> simb run with %d objects per processor each to send %d messages of %s size...\n", numObjs, numMsgs, m->argv[3]);
40
41   strcpy(grainString, m->argv[4]);
42   text = "";
43   if (strcmp(grainString, "-gf") == 0) {
44     grainSize = FINE; text = "FINE"; }
45   else if (strcmp(grainString, "-gm") == 0) {
46     grainSize = MEDIUM_GS; text = "MEDIUM"; }
47   else if (strcmp(grainString, "-gc") == 0) {
48     grainSize = COARSE; text = "COARSE"; }
49   else if (strcmp(grainString, "-gz") == 0) {
50     grainSize = MIX_GS; text = "MIXED"; }
51   else if (strncmp(grainString, "-t", 2) == 0)
52     granularity = atof(&(grainString[2]));
53   density = atoi(m->argv[5]);
54
55   CkPrintf(">>> ...Each event has %s granularity of %f on average...\n>>> ...Events are concentrated at approximately %d per Virtual Time Unit(VTU).\n", text, granularity, density);
56
57   POSE_init();
58
59   // create all the workers
60   WorkerData *wd;
61   int dest, j;
62   srand48(42);
63   buildMap(totalObjs, UNIFORM);
64   for (i=0; i<totalObjs; i++) {
65     wd = new WorkerData;
66     wd->numObjs = numObjs;
67     wd->numMsgs = numMsgs;
68     wd->msgSize = msgSize;
69     wd->grainSize = grainSize;
70     wd->granularity = granularity;
71     wd->density = density;
72
73     dest = map[i];
74     wd->Timestamp(0);
75     //wd->dump();
76     (*(CProxy_worker *) &POSE_Objects)[i].insert(wd, dest);
77   }
78 }
79
80 void main::buildMap(int numObjs, int dist)
81 {
82   int i, j=0, k;
83   if (dist == RANDOM)
84     for (i=0; i<numObjs; i++) map[i] = lrand48() % CkNumPes();
85   else if (dist == UNIFORM)
86     for (i=0; i<numObjs; i++) map[i] = i / (numObjs/CkNumPes());
87   else if (dist == IMBALANCED) {
88     int min = (numObjs/CkNumPes())/2;
89     if (min < 1) min = 1;
90     for (k=0; k<CkNumPes(); k++)
91       for (i=0; i<min; i++) {
92         map[j] = k;
93         j++;
94       }
95     i=CkNumPes()/2;
96     for (k=j; k<numObjs; k++) {
97       map[k] = i;
98       i++;
99       if (i == CkNumPes()) i = CkNumPes()/2;
100     }
101   }
102 }
103
104 int main::getAnbr(int numObjs, int locale, int dest)
105 {
106   int here = (lrand48() % 101) <= locale;
107   int idx;
108   if (CkNumPes() == 1) return lrand48() % numObjs;
109   if (here) {
110     idx = lrand48() % numObjs;
111     while (map[idx] != dest)
112       idx = lrand48() % numObjs;
113     return idx;
114   }
115   else {
116     idx = lrand48() % numObjs;
117     while (map[idx] == dest)
118       idx = lrand48() % numObjs;
119     return idx;
120   }
121 }
122