Merge branch 'charm' of charmgit:charm into 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 #if CMK_BLUEGENE_NODE
53 static int BgMyPe() { return BgMyNode(); }
54 static int BgNumPes() { int x,y,z; BgGetSize(&x, &y, &z); return (x*y*z); }
55 #   define BGSENDPE(pe, msg, len)  {    \
56       int x,y,z;        \
57       BgGetXYZ(pe, &x, &y, &z); \
58       DEBUGF(("send to: (%d %d %d, %d) handle:%d\n", x,y,z,t, CmiGetHandler(msg)));  \
59       BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, \
60                    len, (char *)msg);   \
61       }
62 #   define BGBDCASTALL(len, msg)        \
63       BgBroadcastAllPacket(CmiGetHandler(msg), LARGE_WORK, len, msg);
64 #   define BGBDCAST(len, msg)   \
65       BgBroadcastPacketExcept(BgMyNode(), ANYTHREAD, CmiGetHandler(msg), \
66                               LARGE_WORK, len, msg);
67
68 #elif CMK_BLUEGENE_THREAD
69 static int BgMyPe() { return BgGetGlobalWorkerThreadID(); }
70 static int BgNumPes() { return BgNumNodes()*BgGetNumWorkThread(); }
71 #   define BGSENDPE(pe, msg, len)  {    \
72       int x,y,z,t;      \
73       t = (pe)%BgGetNumWorkThread();    \
74       pe = (pe)/BgGetNumWorkThread();   \
75       BgGetXYZ(pe, &x, &y, &z); \
76       DEBUGF(("send to: (%d %d %d, %d) handle:%d\n", x,y,z,t, CmiGetHandler(msg)));  \
77       BgSendPacket(x,y,z, t, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg); \
78       }
79 #   define BGBDCASTALL(len, msg)        \
80       BgThreadBroadcastAllPacket(CmiGetHandler(msg), LARGE_WORK, len, msg);
81 #   define BGBDCAST(len, msg)   \
82       BgThreadBroadcastPacketExcept(BgMyNode(), BgGetThreadID(), \
83                                     CmiGetHandler(msg), LARGE_WORK, len, msg);
84 #   define BGSENDNODE(node, msg, len)  {        \
85       int x,y,z;        \
86       BgGetXYZ(node, &x, &y, &z);       \
87       DEBUGF(("send to: (%d %d %d) handle:%d\n", x,y,z, CmiGetHandler(msg)));  \
88       BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg); \
89       }
90 #   define BGNODEBDCASTALL(len, msg)    \
91       BgBroadcastAllPacket(CmiGetHandler(msg), LARGE_WORK, len, msg);
92 #   define BGNODEBDCAST(len, msg)       \
93       BgBroadcastPacketExcept(BgMyNode(), ANYTHREAD,\
94                                     CmiGetHandler(msg), LARGE_WORK, len, msg);
95 #endif
96
97 void CldEnqueueGroup(CmiGroup grp, void *msg, int infofn)
98 {
99   CmiAbort("CldEnqueueGroup not supported!");
100 }
101
102 void CldEnqueueMulti(int npes, int *pes, void *msg, int infofn)
103 {
104   int len, queueing, priobits,i; unsigned int *prioptr;
105   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
106   CldPackFn pfn;
107   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
108   if (pfn) {
109     pfn(&msg);
110     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
111   }
112 /*
113   CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
114   CmiSetInfo(msg,infofn);
115 */
116   BgSyncListSend(npes, pes, CmiGetHandler(msg), LARGE_WORK, len, msg);
117 }
118
119 void CldEnqueue(int pe, void *msg, int infofn)
120 {
121   int len, queueing, priobits; unsigned int *prioptr;
122   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
123   CldPackFn pfn;
124
125   DEBUGF(("[%d>] CldEnqueue pe: %d infofn:%d\n", BgMyNode(), pe, infofn));
126   if (pe == CLD_ANYWHERE) {
127     pe = (((CrnRand()+BgMyPe())&0x7FFFFFFF)%BgNumPes());
128 /*
129     while (!CldPresentPE(pe))
130       pe = (((CrnRand()+BgMyPe())&0x7FFFFFFF)%BgNumPes());
131 */
132     if (pe != BgMyPe())
133       CpvAccess(CldRelocatedMessages)++;
134     if (pe == BgMyPe()) {
135       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
136       CmiSetInfo(msg,infofn);
137       DEBUGF(("CldEnqueue CLD_ANYWHERE (pe == BgMyPe)\n"));
138 /*
139       CldPutToken((char *)msg);
140 */
141       BGSENDPE(pe, msg, len);
142     } 
143     else {
144       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
145       if (pfn) {
146         pfn(&msg);
147         ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
148       }
149       DEBUGF(("CldEnqueue at 2 pe=%d\n", pe));
150 /*
151       CldSwitchHandler((char *)msg, CpvAccess(CldBalanceHandlerIndex));
152       CmiSetInfo(msg,infofn);
153       CmiSyncSendAndFree(pe, len, (char *)msg);
154 */
155       BGSENDPE(pe, msg, len);
156     }
157   }
158   else if ((pe == BgMyPe()) || (BgNumPes() == 1)) {
159     DEBUGF(("CldEnqueue pe == CmiMyPe()\n"));
160     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
161     CmiSetInfo(msg,infofn);
162 /*
163     CsdEnqueueGeneral(msg, CQS_QUEUEING_LIFO, priobits, prioptr);
164 */
165     pe = BgMyPe();
166     BGSENDPE(pe, msg, len);
167   }
168   else {
169     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
170     if (pfn) {
171       pfn(&msg);
172       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
173     }
174 /*
175     CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
176 */
177     CmiSetInfo(msg,infofn);
178     DEBUGF(("CldEnqueue pe=%d\n", pe));
179     if (pe==CLD_BROADCAST) { 
180 CmiPrintf("CldEnqueue pe=%d\n", pe); CmiAbort("");
181 /*
182       CmiSyncBroadcastAndFree(len, (char *)msg);
183 */
184       BGBDCAST(len, (char *)msg);
185     }
186     else if (pe==CLD_BROADCAST_ALL) { 
187 /*
188       CmiSyncBroadcastAllAndFree(len, (char *)msg); 
189 */
190       BGBDCASTALL(len, (char *)msg);
191     }
192     else {
193 /*
194       CmiSyncSendAndFree(pe, len, (char *)msg);
195 */
196       BGSENDPE(pe, msg, len);
197     }
198   }
199 }
200
201 void CldNodeEnqueue(int node, void *msg, int infofn)
202 {
203   int len, queueing, priobits; unsigned int *prioptr;
204   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
205   CldPackFn pfn;
206   if (node == CLD_ANYWHERE) {
207     /* node = (((rand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes()); */
208     node = (((CrnRand()+BgMyNode())&0x7FFFFFFF)%BgNumNodes());
209     if (node != BgMyNode())
210       CpvAccess(CldRelocatedMessages)++;
211   }
212   if (node == BgMyNode()) {
213     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
214 /*
215     CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
216 */
217     BGSENDNODE(node, msg, len);
218   } 
219   else {
220     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
221     if (pfn) {
222       pfn(&msg);
223       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
224     }
225 /*
226     CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
227 */
228     CmiSetInfo(msg,infofn);
229     if (node==CLD_BROADCAST) { 
230 /*      CmiSyncNodeBroadcastAndFree(len, (char *)msg);  */
231       BGNODEBDCAST(len, (char *)msg);
232     }
233     else if (node==CLD_BROADCAST_ALL){
234 /*      CmiSyncNodeBroadcastAllAndFree(len,(char *)msg); */
235       BGNODEBDCASTALL(len, (char *)msg);
236     }
237     else {
238 /*      CmiSyncNodeSendAndFree(node, len, (char *)msg);  */
239       BGSENDNODE(node, msg, len);
240     }
241   }
242 }
243
244 void CldModuleInit(char **argv)
245 {
246   CpvInitialize(int, CldHandlerIndex);
247   CpvInitialize(int, CldBalanceHandlerIndex);
248   CpvAccess(CldHandlerIndex) = CmiRegisterHandler((CmiHandler)CldHandler);
249   CpvAccess(CldBalanceHandlerIndex) = CmiRegisterHandler(CldBalanceHandler);
250   CpvInitialize(int, CldRelocatedMessages);
251   CpvInitialize(int, CldLoadBalanceMessages);
252   CpvInitialize(int, CldMessageChunks);
253   CpvAccess(CldRelocatedMessages) = CpvAccess(CldLoadBalanceMessages) = 
254     CpvAccess(CldMessageChunks) = 0;
255   CldModuleGeneralInit(argv);
256 }
257
258 void CldCallback(){}
259
260 #endif