only compile cldb.bluegene.c when compiling blue gene charm++.
[charm.git] / src / conv-ldb / cldb.bluegene.c
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 /****
9   converse ldb for Blue Gene, this is the first version, full of hack and 
10   need more work.
11 ***/
12
13 #include "converse.h"
14 #include "blue.h"
15 #include "cldb.h"
16 #include "queueing.h"
17 #include <stdlib.h>
18
19 #define  DEBUGF(x)   /*CmiPrintf x;*/
20
21 #if CMK_BLUEGENE_CHARM
22
23 extern int CldPresentPE(int pe);
24
25 void LoadNotifyFn(int l)
26 {
27 }
28
29 char *CldGetStrategy(void)
30 {
31   return "rand";
32 }
33
34 void CldBalanceHandler(void *msg)
35 {
36   CldRestoreHandler((char *)msg);
37   CldPutToken((char *)msg);
38 }
39
40 void CldHandler(char *msg)
41 {
42   int len, queueing, priobits;
43   unsigned int *prioptr; 
44   CldInfoFn ifn; CldPackFn pfn;
45
46   CldRestoreHandler(msg);
47   ifn = (CldInfoFn)CmiHandlerToFunction(CmiGetInfo(msg));
48   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
49   CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
50 }
51
52 void CldEnqueueMulti(int npes, int *pes, void *msg, int infofn)
53 {
54   int len, queueing, priobits,i; unsigned int *prioptr;
55   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
56   CldPackFn pfn;
57 CmiAbort("CldEnqueueMulti!\n");
58   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
59   if (pfn) {
60     pfn(&msg);
61     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
62   }
63   CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
64   CmiSetInfo(msg,infofn);
65   for(i=0;i<npes;i++) {
66     CmiSyncSend(pes[i], len, (char *)msg);
67   }
68   CmiFree(msg);
69 }
70
71 #if CMK_BLUEGENE_NODE
72 static int BgMyPe() { return BgMyNode(); }
73 static int BgNumPes() { int x,y,z; BgGetSize(&x, &y, &z); return (x*y*z); }
74 #   define BGSENDPE(pe, msg, len)  {    \
75       int x,y,z;        \
76       BgGetXYZ(pe, &x, &y, &z); \
77       DEBUGF(("send to: (%d %d %d, %d) handle:%d\n", x,y,z,t, CmiGetHandler(msg)));  \
78       BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, \
79                    len, (char *)msg);   \
80       }
81 #   define BGBDCASTALL(len, msg)        \
82       BgBroadcastAllPacket(CmiGetHandler(msg), LARGE_WORK, len, msg);
83 #   define BGBDCAST(len, msg)   \
84       BgBroadcastPacketExcept(BgMyNode(), ANYTHREAD, CmiGetHandler(msg), \
85                               LARGE_WORK, len, msg);
86
87 #elif CMK_BLUEGENE_THREAD
88 static int BgMyPe() { return BgGetGlobalWorkerThreadID(); }
89 static int BgNumPes() { return BgNumNodes()*BgGetNumWorkThread(); }
90 #   define BGSENDPE(pe, msg, len)  {    \
91       int x,y,z,t;      \
92       t = (pe)%BgGetNumWorkThread();    \
93       pe = (pe)/BgGetNumWorkThread();   \
94       BgGetXYZ(pe, &x, &y, &z); \
95       DEBUGF(("send to: (%d %d %d, %d) handle:%d\n", x,y,z,t, CmiGetHandler(msg)));  \
96       BgSendPacket(x,y,z, t, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg); \
97       }
98 #   define BGBDCASTALL(len, msg)        \
99       BgThreadBroadcastAllPacket(CmiGetHandler(msg), LARGE_WORK, len, msg);
100 #   define BGBDCAST(len, msg)   \
101       BgThreadBroadcastPacketExcept(BgMyNode(), BgGetThreadID(), \
102                                     CmiGetHandler(msg), LARGE_WORK, len, msg);
103 #   define BGSENDNODE(node, msg, len)  {        \
104       int x,y,z;        \
105       BgGetXYZ(node, &x, &y, &z);       \
106       DEBUGF(("send to: (%d %d %d) handle:%d\n", x,y,z, CmiGetHandler(msg)));  \
107       BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg); \
108       }
109 #   define BGNODEBDCASTALL(len, msg)    \
110       BgBroadcastAllPacket(CmiGetHandler(msg), LARGE_WORK, len, msg);
111 #   define BGNODEBDCAST(len, msg)       \
112       BgBroadcastPacketExcept(BgMyNode(), ANYTHREAD,\
113                                     CmiGetHandler(msg), LARGE_WORK, len, msg);
114 #endif
115
116
117 void CldEnqueue(int pe, void *msg, int infofn)
118 {
119   int len, queueing, priobits; unsigned int *prioptr;
120   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
121   CldPackFn pfn;
122
123   DEBUGF(("[%d>] CldEnqueue pe: %d infofn:%d\n", BgMyNode(), pe, infofn));
124   if (pe == CLD_ANYWHERE) {
125     pe = (((CrnRand()+BgMyPe())&0x7FFFFFFF)%BgNumPes());
126 /*
127     while (!CldPresentPE(pe))
128       pe = (((CrnRand()+BgMyPe())&0x7FFFFFFF)%BgNumPes());
129 */
130     if (pe != BgMyPe())
131       CpvAccess(CldRelocatedMessages)++;
132     if (pe == BgMyPe()) {
133       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
134       CmiSetInfo(msg,infofn);
135       DEBUGF(("CldEnqueue CLD_ANYWHERE (pe == BgMyPe)\n"));
136 /*
137       CldPutToken((char *)msg);
138 */
139       BGSENDPE(pe, msg, len);
140     } 
141     else {
142       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
143       if (pfn) {
144         pfn(&msg);
145         ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
146       }
147       DEBUGF(("CldEnqueue at 2 pe=%d\n", pe));
148 /*
149       CldSwitchHandler((char *)msg, CpvAccess(CldBalanceHandlerIndex));
150       CmiSetInfo(msg,infofn);
151       CmiSyncSendAndFree(pe, len, (char *)msg);
152 */
153       BGSENDPE(pe, msg, len);
154     }
155   }
156   else if ((pe == BgMyPe()) || (BgNumPes() == 1)) {
157     DEBUGF(("CldEnqueue pe == CmiMyPe()\n"));
158     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
159     CmiSetInfo(msg,infofn);
160 /*
161     CsdEnqueueGeneral(msg, CQS_QUEUEING_LIFO, priobits, prioptr);
162 */
163     pe = BgMyPe();
164     BGSENDPE(pe, msg, len);
165   }
166   else {
167     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
168     if (pfn) {
169       pfn(&msg);
170       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
171     }
172 /*
173     CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
174 */
175     CmiSetInfo(msg,infofn);
176     DEBUGF(("CldEnqueue pe=%d\n", pe));
177     if (pe==CLD_BROADCAST) { 
178 CmiPrintf("CldEnqueue pe=%d\n", pe); CmiAbort("");
179 /*
180       CmiSyncBroadcastAndFree(len, (char *)msg);
181 */
182       BGBDCAST(len, (char *)msg);
183     }
184     else if (pe==CLD_BROADCAST_ALL) { 
185 /*
186       CmiSyncBroadcastAllAndFree(len, (char *)msg); 
187 */
188       BGBDCASTALL(len, (char *)msg);
189     }
190     else {
191 /*
192       CmiSyncSendAndFree(pe, len, (char *)msg);
193 */
194       BGSENDPE(pe, msg, len);
195     }
196   }
197 }
198
199 void CldNodeEnqueue(int node, void *msg, int infofn)
200 {
201   int len, queueing, priobits; unsigned int *prioptr;
202   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
203   CldPackFn pfn;
204   if (node == CLD_ANYWHERE) {
205     /* node = (((rand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes()); */
206     node = (((CrnRand()+BgMyNode())&0x7FFFFFFF)%BgNumNodes());
207     if (node != BgMyNode())
208       CpvAccess(CldRelocatedMessages)++;
209   }
210   if (node == BgMyNode()) {
211 /*
212     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
213     CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
214 */
215     BGSENDNODE(node, msg, len);
216   } 
217   else {
218     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
219     if (pfn) {
220       pfn(&msg);
221       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
222     }
223 /*
224     CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
225 */
226     CmiSetInfo(msg,infofn);
227     if (node==CLD_BROADCAST) { 
228 /*      CmiSyncNodeBroadcastAndFree(len, (char *)msg);  */
229       BGNODEBDCAST(len, (char *)msg);
230     }
231     else if (node==CLD_BROADCAST_ALL){
232 /*      CmiSyncNodeBroadcastAllAndFree(len,(char *)msg); */
233       BGNODEBDCASTALL(len, (char *)msg);
234     }
235     else {
236 /*      CmiSyncNodeSendAndFree(node, len, (char *)msg);  */
237       BGSENDNODE(node, msg, len);
238     }
239   }
240 }
241
242 void CldModuleInit()
243 {
244   CpvInitialize(int, CldHandlerIndex);
245   CpvInitialize(int, CldBalanceHandlerIndex);
246   CpvAccess(CldHandlerIndex) = CmiRegisterHandler((CmiHandler)CldHandler);
247   CpvAccess(CldBalanceHandlerIndex) = CmiRegisterHandler(CldBalanceHandler);
248   CpvInitialize(int, CldRelocatedMessages);
249   CpvInitialize(int, CldLoadBalanceMessages);
250   CpvInitialize(int, CldMessageChunks);
251   CpvAccess(CldRelocatedMessages) = CpvAccess(CldLoadBalanceMessages) = 
252     CpvAccess(CldMessageChunks) = 0;
253   CldModuleGeneralInit();
254 }
255
256
257 #endif