Added bluegene emulator sources and test programs.
[charm.git] / src / langs / bluegene / BlueGene.h
1 // File: BlueGene.h
2
3 #ifndef _BlueGene_h
4 #define _BlueGene_h
5
6 #include "BlueGene.decl.h"
7 #include "charm++.h"
8
9 #define SIZE_INBUFFER     32
10 #define MAX_NUM_THREADS   200
11 #define MAX_HANDLERS      16
12
13 enum WorkType {LARGE_WORK=0, SMALL_WORK=1};
14
15 #if BG_TIMER
16 #define BGTimer() CkWallTimer()
17 #else
18 #define BGTimer() 0.0
19 #endif
20
21 class BgNode ;
22 class InBuffer ;
23 class SchedulerQ ;
24 class ThreadInfo ;
25 class PacketMsg ;
26 class Main ;
27 // CkQ is defined in charm++.h
28 typedef CkQ<PacketMsg*> MsgQ;
29
30 extern "C" void  BgInit(Main *) ;
31 extern "C" void* BgNodeInit(BgNode *) ;
32 extern "C" void  BgFinish() ;
33
34 typedef void (*BgHandler)(ThreadInfo *) ;
35
36 class CreateBgNodeMsg: public CMessage_CreateBgNodeMsg
37 {
38 public:
39   int numCTh ;
40   int numWTh ;
41   int numBgX ;
42   int numBgY ;
43   int numBgZ ;
44 } ;
45 //~~~ end of class CreateBgNodeMsg ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
46
47 class PacketMsg: public CMessage_PacketMsg
48 {
49 public:
50   int handlerID ;
51   WorkType type;
52   double sendTime ;
53   double recvTime ;
54 } ;
55 //~~~ end of class PacketMsg ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
56
57 class Main: public Chare 
58 {
59 private:
60   CkArgMsg *args ;
61   int       numBgX, numBgY, numBgZ ;   
62   double starttime, endtime;
63
64 public:
65        Main(CkArgMsg *msg) ;
66        ~Main() ;
67   void Finish(void) ;
68
69   void CreateBlueGene(CreateBgNodeMsg *msg) ;
70   int          getNumArgs() ;
71   const char** getArgs() ;
72 } ;
73
74 //~~~ end of class Main ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75
76 class BgNode: public ArrayElement3D
77 {
78 private:
79   int          numCTh;
80   int          numWTh;
81   InBuffer*    inBuffer;
82   PacketMsg**  matchTable;
83   CthThread*   threadTable;
84   BgHandler*   handlerTable;
85   SchedulerQ*  workThQ;
86   SchedulerQ*  commForMsg;
87   SchedulerQ*  commForWork;
88   MsgQ*        addMsgQ;
89   CProxy_BgNode**** proxies;
90
91 public:
92   int         numBgX ;
93   int         numBgY ;
94   int         numBgZ ;
95   void*       nvData ;
96
97 public:   
98        BgNode(CreateBgNodeMsg *msgPtr) ;
99        ~BgNode() ; 
100        BgNode(CkMigrateMessage *msgPtr) {} ;
101
102   void registerHandler(int handlerID, BgHandler h) ;
103   void addMessage(PacketMsg *msgPtr, int handlerID, WorkType type) ;
104
105   void putMessage(PacketMsg *msgPtr) ;
106   void assignMsg() ;
107   void startCommTh(ThreadInfo *info) ;
108   void startWorkTh(ThreadInfo *info) ;
109
110   void sendPacket(int x, int y, int z, PacketMsg *msgPtr, 
111                   int handlerID, WorkType type) ;
112   void getXYZ(int& x, int& y, int& z) ;
113   double getNumCTh() { return numCTh; }
114   double getNumWTh() { return numWTh; }
115   void finish() ;
116 } ;
117 //~~~ end of class BgNode
118
119
120 class InBuffer
121 {
122   PacketMsg *msgs[SIZE_INBUFFER];
123   int first, count;
124   BgNode *bgNode ;
125   MsgQ *mq;
126
127 public:
128   InBuffer(BgNode *bgNodeRef) : 
129     bgNode(bgNodeRef), first(0), count(0) 
130   {
131     for(int i=0;i<SIZE_INBUFFER;i++)
132       msgs[i] = 0;
133     mq = new MsgQ;
134   }
135   ~InBuffer()
136   {
137     for(int i=first, n=0; n < count; n++)
138     {
139       delete msgs[i];
140       i = (i+1)%SIZE_INBUFFER;
141     }
142     delete mq;
143   } 
144   PacketMsg* getMessage(void)
145   {
146     PacketMsg *m = msgs[first];
147     if(count) {
148       msgs[first] = 0;
149       first = (first+1)%SIZE_INBUFFER;
150       count --;
151       if(count==SIZE_INBUFFER-1) {
152         PacketMsg *m1;
153         if(m1=mq->deq())
154           putMessage(m1);
155       }
156     }
157     return m;
158   }
159   void putMessage(PacketMsg *msgPtr)
160   {
161     if(count==SIZE_INBUFFER)
162     {
163       mq->enq(msgPtr);
164       return;
165     }
166     msgs[(first+count)%SIZE_INBUFFER] = msgPtr;
167     count++;
168     bgNode->assignMsg();
169   }
170 } ;
171 //~~~ end of InBuffer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
172
173 class SchedulerQ
174 {
175 private:
176   int *q;
177   int front, count, max ;
178
179 public:
180   SchedulerQ(int _max) : front(0), count(0), max(_max) { q = new int[_max]; }
181   ~SchedulerQ() { delete[] q; }
182   int  dequeThread(void)
183   {
184     int ret = (-1);
185     if( count>0)
186     { 
187       ret = q[front]; 
188       front = (front+1)%max; 
189       count--;
190     }
191     return ret;
192   }
193   void enqueThread(int threadID)
194   {
195     q[(front+count)%max] = threadID;
196     count++;
197   }
198 } ;
199 //~~~ end of SchedulerQ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
200
201
202 class ThreadInfo
203 {
204 public:
205   BgNode *bgNode ;
206   int     selfID ;
207   void   *msg ;
208   double currTime;
209   double handlerStartTime;
210
211 public:
212   double getTime(void)
213   {
214     double tp2 ;
215     tp2 = BGTimer()*1e6;
216     return (tp2 - handlerStartTime + currTime);
217   }
218   void sendPacket(int x, int y, int z, PacketMsg *msgPtr, int handlerID, 
219                   WorkType type)
220   {
221     msgPtr->sendTime = getTime();
222     bgNode->sendPacket(x,y,z,msgPtr,handlerID,type);
223   }
224 } ;
225 //~~~ end of ThreadInfo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
226
227 extern "C" void startCommTh(ThreadInfo *info) ;
228 extern "C" void startWorkTh(ThreadInfo *info) ;
229
230 #endif