Merge branch 'charm' of charmgit:charm into charm
[charm.git] / examples / pose / ChunkSim / Worker.C
1 #include <math.h>
2
3 void worker::set(int wid)
4 {
5   int i;
6   workerID = wid;
7   for (i=0; i<WORKER_SZ; i++) data[i] = 0;
8 }
9
10 worker::worker() { for (int i=0; i<WORKER_SZ; i++) data[i] = 0; }
11
12 worker& worker::operator=(const worker& obj)
13 {
14   int i;
15   workerID = obj.workerID;
16   for (i=0; i<WORKER_SZ; i++) data[i] = obj.data[i];
17   return *this;
18 }
19
20
21 team::team(TeamData *m)
22 {
23   teamID = m->teamID;
24   numTeams = m->numTeams;
25   numWorkers = m->numWorkers;
26   myWorkers = new worker[numWorkers/numTeams];
27
28   WorkMsg *wm;
29   int offset = teamID * (numWorkers/numTeams);
30   CkAssert(offset >= 0);
31   //CkPrintf("Team %d(%d) constructed.  Offset=%d\n", parent->thisIndex, teamID, offset);
32   for (int i=0; i<numWorkers/numTeams; i++) {
33     myWorkers[i].set(offset+i);
34     wm = new WorkMsg;
35     wm->workerID = offset+i;
36     memset(wm->data, 0, 10*sizeof(int));
37     //CkPrintf("Team %d(%d) generated initial work for worker %d\n", parent->thisIndex, teamID, wm->workerID);
38     POSE_local_invoke(work(wm), 0);
39   }
40 }
41
42 void team::work(WorkMsg *wm) 
43 {
44   doWork(wm->workerID);
45 }
46 void team::work_anti(WorkMsg *wm) {restore(this);}
47 void team::work_commit(WorkMsg *wm) {}
48
49 void team::doWork(int k)
50 {
51   WorkMsg *wm;
52   
53   if ((POSE_endtime > -1) && (OVT() > POSE_endtime))  return;
54   for (int j=0; j<WORKER_SZ; j++) {
55     myWorkers[k%(numWorkers/numTeams)].data[j] += 
56       myWorkers[k%(numWorkers/numTeams)].data[99-j];
57   } 
58   // generate some events
59   if (k%19!=0) {
60     wm = new WorkMsg;
61     wm->workerID = (k+20)%numWorkers;
62     memset(wm->data, 0, 10*sizeof(int));
63     //CkPrintf("At(%d): Team %d(%d) worker %d generated actual work for worker %d\n", ovt, parent->thisIndex, teamID, k, wm->workerID);
64     POSE_invoke(work(wm), team, (wm->workerID)/(numWorkers/numTeams), k%50+10);
65   }
66   if (k%4==0) {
67     wm = new WorkMsg;
68     wm->workerID = (k+1)%numWorkers;
69     memset(wm->data, 0, 10*sizeof(int));
70     //CkPrintf("At(%d): Team %d(%d) worker %d generated actual work for worker %d\n", ovt, parent->thisIndex, teamID, k, wm->workerID);
71     POSE_invoke(work(wm), team, (wm->workerID)/(numWorkers/numTeams), 100);
72   }
73   if (k%33==0) {
74     wm = new WorkMsg;
75     wm->workerID = (k+3)%numWorkers;
76     memset(wm->data, 0, 10*sizeof(int));
77     //CkPrintf("At(%d): Team %d(%d) worker %d generated actual work for worker %d\n", ovt, parent->thisIndex, teamID, k, wm->workerID);
78     POSE_invoke(work(wm), team, (wm->workerID)/(numWorkers/numTeams), k+31);
79   }
80 }