Broken version.
[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   WorkerData *wd;
60   wd = new WorkerData;
61   wd->numObjs = numObjs;
62   wd->numMsgs = numMsgs;
63   wd->msgSize = msgSize;
64   wd->grainSize = grainSize;
65   wd->granularity = granularity;
66   wd->density = density;
67   wd->Timestamp(0);
68   //Create the map group
69   CProxy_BlockMap myMap=CProxy_BlockMap::ckNew();
70   //Make a new array using that map
71   CkArrayOptions opts(totalObjs);
72   opts.setMap(myMap);
73   (*(CProxy_worker *) &POSE_Objects) = CProxy_worker::ckNew(wd, opts);
74
75   /*
76   // create all the workers
77   WorkerData *wd;
78   int dest, j;
79   srand48(42);
80   buildMap(totalObjs, UNIFORM);
81   for (i=0; i<totalObjs; i++) {
82     wd = new WorkerData;
83     wd->numObjs = numObjs;
84     wd->numMsgs = numMsgs;
85     wd->msgSize = msgSize;
86     wd->grainSize = grainSize;
87     wd->granularity = granularity;
88     wd->density = density;
89
90     dest = map[i];
91     wd->Timestamp(0);
92     //wd->dump();
93     (*(CProxy_worker *) &POSE_Objects)[i].insert(wd, dest);
94   }
95   */
96   /*
97   SmallWorkMsg *sm = new SmallWorkMsg;
98   memset(sm->data, 0, SM_MSG_SZ*sizeof(int));
99   sm->fromPE = -1;
100   sm->Timestamp(0);
101   (*(CProxy_worker *) &POSE_Objects).workSmall(sm);
102   */
103 }
104
105 void main::buildMap(int numObjs, int dist)
106 {
107   int i, j=0, k;
108   if (dist == RANDOM)
109     for (i=0; i<numObjs; i++) map[i] = lrand48() % CkNumPes();
110   else if (dist == UNIFORM)
111     for (i=0; i<numObjs; i++) map[i] = i / (numObjs/CkNumPes());
112   else if (dist == IMBALANCED) {
113     int min = (numObjs/CkNumPes())/2;
114     if (min < 1) min = 1;
115     for (k=0; k<CkNumPes(); k++)
116       for (i=0; i<min; i++) {
117         map[j] = k;
118         j++;
119       }
120     i=CkNumPes()/2;
121     for (k=j; k<numObjs; k++) {
122       map[k] = i;
123       i++;
124       if (i == CkNumPes()) i = CkNumPes()/2;
125     }
126   }
127 }
128
129 int main::getAnbr(int numObjs, int locale, int dest)
130 {
131   int here = (lrand48() % 101) <= locale;
132   int idx;
133   if (CkNumPes() == 1) return lrand48() % numObjs;
134   if (here) {
135     idx = lrand48() % numObjs;
136     while (map[idx] != dest)
137       idx = lrand48() % numObjs;
138     return idx;
139   }
140   else {
141     idx = lrand48() % numObjs;
142     while (map[idx] == dest)
143       idx = lrand48() % numObjs;
144     return idx;
145   }
146 }
147