added CQWrite support for persistent message
[charm.git] / examples / pose / ASIM / Worker.h
1 // Message size types
2 #define MIX_MS 0
3 #define SMALL 1
4 #define MEDIUM 2
5 #define LARGE 3
6
7 // Message sizes
8 #define SM_MSG_SZ 10
9 #define MD_MSG_SZ 100
10 #define LG_MSG_SZ 1000
11
12 // Grain sizes
13 #define MIX_GS 0
14 #define FINE 1
15 #define MEDIUM_GS 2
16 #define COARSE 3
17
18 // Granularity
19 #define FINE_GRAIN   0.000010
20 #define MEDIUM_GRAIN 0.001000
21 #define COARSE_GRAIN 0.010000
22
23 // Distribution types
24 #define RANDOM 0
25 #define IMBALANCED 1
26 #define UNIFORM 2
27
28 // Connectivity types
29 #define SPARSE 0
30 #define HEAVY 1
31 #define FULL 2
32
33 class WorkerData {
34  public:
35   int numObjs, numMsgs, msgSize, distribution, connectivity, locality;
36   int grainSize, elapsePattern, offsetPattern, sendPattern;
37   double granularity;
38   POSE_TimeType elapseTimes[5];
39   int numSends[5], offsets[5], neighbors[100];
40   int numNbrs;
41   WorkerData& operator=(const WorkerData& obj) {
42     int i;
43     eventMsg::operator=(obj);
44     numObjs = obj.numObjs;
45     numMsgs = obj.numMsgs;
46     msgSize = obj.msgSize;
47     distribution = obj.distribution;
48     connectivity = obj.connectivity;
49     locality = obj.locality;
50     grainSize = obj.grainSize;
51     elapsePattern = obj.elapsePattern;
52     offsetPattern = obj.offsetPattern;
53     sendPattern = obj.sendPattern;
54     granularity = obj.granularity;
55     for (i=0; i<5; i++) {
56       elapseTimes[i] = obj.elapseTimes[i];
57       numSends[i] = obj.numSends[i];
58       offsets[i] = obj.offsets[i];
59     }
60     for (i=0; i<100; i++)  neighbors[i] = obj.neighbors[i];
61     numNbrs = obj.numNbrs;
62     return *this;
63   }
64   void dump() {
65     int i;
66     CkPrintf("#Nbrs=%d [", numNbrs);
67     for (i=0; i<numNbrs; i++) {
68       CkPrintf("%d", neighbors[i]);
69       if (i != numNbrs-1) CkPrintf(", ");
70     }
71     CkPrintf("]\n");
72     CkPrintf("Elapse Offset #Sends\n");
73     for (i=0; i<5; i++)
74       CkPrintf("%6d %6d %6d\n", elapseTimes[i], offsets[i], numSends[i]);
75   }
76 };
77
78 class SmallWorkMsg {
79  public:
80   int data[SM_MSG_SZ];
81   SmallWorkMsg& operator=(const SmallWorkMsg& obj) {
82     eventMsg::operator=(obj);
83     for (int i=0; i<SM_MSG_SZ; i++) data[i] = obj.data[i];
84     return *this;
85   }
86 };
87
88 class MediumWorkMsg {
89  public:
90   int data[MD_MSG_SZ];
91   MediumWorkMsg& operator=(const MediumWorkMsg& obj) {
92     eventMsg::operator=(obj);
93     for (int i=0; i<MD_MSG_SZ; i++) data[i] = obj.data[i];
94     return *this;
95   }
96 };
97
98 class LargeWorkMsg {
99  public:
100   int data[LG_MSG_SZ];
101   LargeWorkMsg& operator=(const LargeWorkMsg& obj) {
102     eventMsg::operator=(obj);
103     for (int i=0; i<LG_MSG_SZ; i++) data[i] = obj.data[i];
104     return *this;
105   }
106 };
107
108
109 class worker {
110   int numObjs, numMsgs, msgSize, distribution, connectivity, locality;
111   int grainSize, elapsePattern, offsetPattern, sendPattern;
112   double granularity;
113   int elapseTimes[5], numSends[5], offsets[5], neighbors[100];
114   int numNbrs, elapseIdx, sendIdx, nbrIdx, offsetIdx, msgIdx, gsIdx;
115   int data[100];
116  public:
117   worker();
118   worker(WorkerData *m); 
119   ~worker() { }
120   worker& operator=(const worker& obj);
121   void pup(PUP::er &p) { 
122     chpt<state_worker>::pup(p); 
123     p(numObjs); p(numMsgs); p(msgSize); p(distribution); p(connectivity);
124     p(locality); p(grainSize); p(elapsePattern); p(offsetPattern); 
125     p(sendPattern); p(granularity);
126     p(elapseTimes, 5); p(numSends, 5); p(offsets, 5); p(neighbors, 100);
127     p(numNbrs); p(elapseIdx); p(sendIdx); p(nbrIdx); p(offsetIdx); 
128     p(msgIdx); p(gsIdx);
129     p(data, 100);
130   }
131   void dump() {
132     chpt<state_worker>::dump();
133     CkPrintf("[worker: ");
134   }
135   void doWork();
136
137   // Event methods
138   void workSmall(SmallWorkMsg *m);
139   void workSmall_anti(SmallWorkMsg *m);
140   void workSmall_commit(SmallWorkMsg *m);
141   void workMedium(MediumWorkMsg *m);
142   void workMedium_anti(MediumWorkMsg *m);
143   void workMedium_commit(MediumWorkMsg *m);
144   void workLarge(LargeWorkMsg *m);
145   void workLarge_anti(LargeWorkMsg *m);
146   void workLarge_commit(LargeWorkMsg *m);
147   void terminus(){}
148 };
149