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