Merge branch 'charm' of charmgit:charm into charm
[charm.git] / examples / pose / ChunkSim / 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 numTeams=-1, numWorkers=-1, i;
14
15   if(m->argc!=4) {
16     CkPrintf("Usage: asim <numTeams> <numWorkers> <endTime>\n");
17     CkExit();
18   }
19   numTeams = atoi(m->argv[1]);
20   numWorkers = atoi(m->argv[2]);
21   map = (int *)malloc(numTeams*sizeof(int));
22
23   CkPrintf("asim run with: %d teams of %d workers", numTeams, numWorkers);
24   CkPrintf("%d endtime\n", atoi(m->argv[3]));
25
26   POSE_init(atoi(m->argv[3]));
27   CkPrintf("POSE_endtime = %d\n", POSE_endtime);
28
29   // create all the teams of workers
30   TeamData *td;
31   int dest, j, k, wid=0;
32   srand48(42);
33   buildMap(numTeams, UNIFORM);
34   for (k=0; k<numTeams; k++) { // create numTeams teams
35     dest = map[k];
36     td = new TeamData;
37     td->teamID = k;
38     td->numTeams = numTeams;
39     td->numWorkers = numWorkers*numTeams;
40     td->Timestamp(0);
41     (*(CProxy_team *) &POSE_Objects)[k].insert(td, dest);
42   }
43 }
44
45 void main::buildMap(int numObjs, int dist)
46 {
47   int i, j=0, k;
48   if (dist == RANDOM)
49     for (i=0; i<numObjs; i++) map[i] = lrand48() % CkNumPes();
50   else if (dist == UNIFORM) {
51     i=0;
52     for (j=0; j<CkNumPes(); j++)
53       for (k=0; k<numObjs/CkNumPes(); k++) {
54         map[i] = j; 
55         i++;
56       }
57     while (i< numObjs) map[i] = CkNumPes()-1;
58   }
59   else if (dist == IMBALANCED) {
60     int min = (numObjs/CkNumPes())/2;
61     if (min < 1) min = 1;
62     for (k=0; k<CkNumPes(); k++)
63       for (i=0; i<min; i++) {
64         map[j] = k;
65         j++;
66       }
67     i=CkNumPes()/2;
68     for (k=j; k<numObjs; k++) {
69       map[k] = i;
70       i++;
71       if (i == CkNumPes()) i = CkNumPes()/2;
72     }
73   }
74 }
75
76 int main::getAnbr(int numObjs, int locale, int dest)
77 {
78   int here = (lrand48() % 101) <= locale;
79   int idx;
80   if (CkNumPes() == 1) return lrand48() % numObjs;
81   if (here) {
82     idx = lrand48() % numObjs;
83     while (map[idx] != dest)
84       idx = lrand48() % numObjs;
85     return idx;
86   }
87   else {
88     idx = lrand48() % numObjs;
89     while (map[idx] == dest)
90       idx = lrand48() % numObjs;
91     return idx;
92   }
93 }
94