77e4709f3a2987dc870b01bb74526cc622541dbc
[charm.git] / examples / pose / Ring / Worker.C
1 #include <math.h>
2
3 int GCD(int a, int b) {
4   if (b > a) 
5     return GCD(b,a);
6   else if(b == 0) 
7     return a;
8   else
9     return GCD(b, a%b);
10 }
11
12
13 worker::worker(WorkerData *m)
14 {
15   int i;
16   numObjs = m->numObjs;
17   numMsgs = m->numMsgs;
18   msgSize = m->msgSize;
19   grainSize = m->grainSize;
20   granularity = m->granularity;
21   density = m->density;
22   for (i=0; i<100; i++) data[i] = 0;
23   sent = 0;
24   totalObjs = numObjs * CkNumPes();
25   localDensity = ((double)density)/((double)totalObjs);
26   delete m;
27   SmallWorkMsg *sm = new SmallWorkMsg;
28   memset(sm->data, 0, SM_MSG_SZ*sizeof(int));
29   sm->fromPE = -1;
30   //CkPrintf("Worker %d created on PE %d.\n", myHandle, CkMyPe());
31   //if (myHandle%numObjs == 0) { //local ring; multiple global rings
32   //if (myHandle%(numObjs/2) == 0) { //multiple offset global rings
33   //if (myHandle == 0) { 
34     //CkPrintf("Worker %d starting ring, sending to self.\n", myHandle, CkMyPe());
35     POSE_invoke(workSmall(sm), worker, parent->thisIndex, 0);
36   //}
37 }
38
39 worker::worker()
40 {
41 }
42
43 worker& worker::operator=(const worker& obj)
44 {
45   int i;
46   rep::operator=(obj);
47   numObjs = obj.numObjs;
48   numMsgs = obj.numMsgs;
49   msgSize = obj.msgSize;
50   grainSize = obj.grainSize;
51   granularity = obj.granularity;
52   density = obj.density;
53   sent = obj.sent;
54   totalObjs = obj.totalObjs;
55   for (i=0; i<100; i++) data[i] = obj.data[i];
56   return *this;
57 }
58
59 void worker::terminus()
60 {
61   if (sent != numMsgs)
62     CkPrintf("%d sent %d messages!\n", myHandle, sent);
63 }
64
65 void worker::workSmall(SmallWorkMsg *m)
66 {
67   //CkPrintf("%d receiving small work at %d\n", parent->thisIndex, ovt);
68   doWork();
69 }
70
71 void worker::workSmall_anti(SmallWorkMsg *m)
72 {
73   restore(this);
74 }
75
76 void worker::workSmall_commit(SmallWorkMsg *m)
77 {
78 }
79
80 void worker::workMedium(MediumWorkMsg *m)
81 {
82   //CkPrintf("%d receiving medium work at %d\n", parent->thisIndex, ovt);
83   doWork();
84 }
85
86 void worker::workMedium_anti(MediumWorkMsg *m)
87 {
88   restore(this);
89 }
90
91 void worker::workMedium_commit(MediumWorkMsg *m)
92 {
93 }
94
95 void worker::workLarge(LargeWorkMsg *m)
96 {
97   //CkPrintf("%d receiving large work at %d\n", parent->thisIndex, ovt);
98   doWork();
99 }
100
101 void worker::workLarge_anti(LargeWorkMsg *m)
102 {
103   restore(this);
104 }
105
106 void worker::workLarge_commit(LargeWorkMsg *m)
107 {
108 }
109
110 void worker::doWork()
111 {
112   SmallWorkMsg *sm;
113   MediumWorkMsg *mm;
114   LargeWorkMsg *lm;
115   int nbr;
116
117   if (sent == numMsgs) return;
118   sent++;
119
120   // generate an event
121   int actualMsgSize = msgSize;
122   if (msgSize == MIX_MS) actualMsgSize = (actualMsgSize + 1) % 3;
123   if (actualMsgSize == SMALL) {
124     sm = new SmallWorkMsg;
125     memset(sm->data, 0, SM_MSG_SZ*sizeof(int));
126     sm->fromPE = myHandle;
127     // local ring
128     //POSE_invoke(workSmall(sm), worker, ((myHandle%numObjs)+1)%numObjs + (numObjs*CkMyPe()), 0);
129     POSE_invoke(workSmall(sm), worker, (myHandle+1)%totalObjs, 0);
130     //CkPrintf("%d sending small work to %d at %d. Sent=%d\n",myHandle,((myHandle%numObjs)+1)%numObjs + (numObjs*CkMyPe()),ovt,sent);
131   }
132   else if (actualMsgSize == MEDIUM) {
133     mm = new MediumWorkMsg;
134     memset(mm->data, 0, MD_MSG_SZ*sizeof(int));
135     POSE_invoke(workMedium(mm), worker, (myHandle+1)%totalObjs, 0);
136     //CkPrintf("%d sending medium work to %d at %d\n",myHandle,nbr,ovt);
137   }
138   else if (actualMsgSize == LARGE) {
139     lm = new LargeWorkMsg;
140     memset(lm->data, 0, LG_MSG_SZ*sizeof(int));
141     POSE_invoke(workLarge(lm), worker, (myHandle+1)%totalObjs, 0);
142     //CkPrintf("%d sending large work to %d at %d\n",myHandle,nbr,ovt);
143   }
144   int elapseCheck = sent * (1.0/localDensity);
145   if (OVT() < elapseCheck) elapse(elapseCheck-OVT());
146   /*
147   if (sent == numMsgs)
148     CkPrintf("%d done! sent %d & received %d messages!\n", myHandle, sent, received);
149   */
150 }
151