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