2 converse ldb for Blue Gene, this is the first version, full of hack and
12 #define DEBUGF(x) /*CmiPrintf x;*/
16 extern int CldPresentPE(int pe
);
18 void LoadNotifyFn(int l
)
22 char *CldGetStrategy(void)
27 void CldBalanceHandler(void *msg
)
29 CldRestoreHandler((char *)msg
);
30 CldPutToken((char *)msg
);
33 void CldHandler(char *msg
)
35 int len
, queueing
, priobits
;
36 unsigned int *prioptr
;
37 CldInfoFn ifn
; CldPackFn pfn
;
39 CldRestoreHandler(msg
);
40 ifn
= (CldInfoFn
)CmiHandlerToFunction(CmiGetInfo(msg
));
41 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
42 CsdEnqueueGeneral(msg
, queueing
, priobits
, prioptr
);
46 static int BgMyPe() { return BgMyNode(); }
47 static int BgNumPes() { int x
,y
,z
; BgGetSize(&x
, &y
, &z
); return (x
*y
*z
); }
48 # define BGSENDPE(pe, msg, len) { \
50 BgGetXYZ(pe, &x, &y, &z); \
51 DEBUGF(("send to: (%d %d %d, %d) handle:%d\n", x,y,z,t, CmiGetHandler(msg))); \
52 BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, \
55 # define BGBDCASTALL(len, msg) \
56 BgBroadcastAllPacket(CmiGetHandler(msg), LARGE_WORK, len, msg);
57 # define BGBDCAST(len, msg) \
58 BgBroadcastPacketExcept(BgMyNode(), ANYTHREAD, CmiGetHandler(msg), \
59 LARGE_WORK, len, msg);
61 #elif CMK_BIGSIM_THREAD
62 static int BgMyPe() { return BgGetGlobalWorkerThreadID(); }
63 static int BgNumPes() { return BgNumNodes()*BgGetNumWorkThread(); }
64 # define BGSENDPE(pe, msg, len) { \
66 t = (pe)%BgGetNumWorkThread(); \
67 pe = (pe)/BgGetNumWorkThread(); \
68 BgGetXYZ(pe, &x, &y, &z); \
69 DEBUGF(("send to: (%d %d %d, %d) handle:%d\n", x,y,z,t, CmiGetHandler(msg))); \
70 BgSendPacket(x,y,z, t, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg); \
72 # define BGBDCASTALL(len, msg) \
73 BgThreadBroadcastAllPacket(CmiGetHandler(msg), LARGE_WORK, len, msg);
74 # define BGBDCAST(len, msg) \
75 BgThreadBroadcastPacketExcept(BgMyNode(), BgGetThreadID(), \
76 CmiGetHandler(msg), LARGE_WORK, len, msg);
77 # define BGSENDNODE(node, msg, len) { \
79 BgGetXYZ(node, &x, &y, &z); \
80 DEBUGF(("send to: (%d %d %d) handle:%d\n", x,y,z, CmiGetHandler(msg))); \
81 BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg); \
83 # define BGNODEBDCASTALL(len, msg) \
84 BgBroadcastAllPacket(CmiGetHandler(msg), LARGE_WORK, len, msg);
85 # define BGNODEBDCAST(len, msg) \
86 BgBroadcastPacketExcept(BgMyNode(), ANYTHREAD,\
87 CmiGetHandler(msg), LARGE_WORK, len, msg);
90 void CldEnqueueGroup(CmiGroup grp
, void *msg
, int infofn
)
92 CmiAbort("CldEnqueueGroup not supported!");
95 void CldEnqueueMulti(int npes
, int *pes
, void *msg
, int infofn
)
97 int len
, queueing
, priobits
,i
; unsigned int *prioptr
;
98 CldInfoFn ifn
= (CldInfoFn
)CmiHandlerToFunction(infofn
);
100 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
103 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
106 CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
107 CmiSetInfo(msg,infofn);
109 BgSyncListSend(npes
, pes
, CmiGetHandler(msg
), LARGE_WORK
, len
, msg
);
112 void CldEnqueue(int pe
, void *msg
, int infofn
)
114 int len
, queueing
, priobits
; unsigned int *prioptr
;
115 CldInfoFn ifn
= (CldInfoFn
)CmiHandlerToFunction(infofn
);
118 DEBUGF(("[%d>] CldEnqueue pe: %d infofn:%d\n", BgMyNode(), pe
, infofn
));
119 if (pe
== CLD_ANYWHERE
) {
120 pe
= (((CrnRand()+BgMyPe())&0x7FFFFFFF)%BgNumPes());
122 while (!CldPresentPE(pe))
123 pe = (((CrnRand()+BgMyPe())&0x7FFFFFFF)%BgNumPes());
126 CpvAccess(CldRelocatedMessages
)++;
127 if (pe
== BgMyPe()) {
128 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
129 CmiSetInfo(msg
,infofn
);
130 DEBUGF(("CldEnqueue CLD_ANYWHERE (pe == BgMyPe)\n"));
132 CldPutToken((char *)msg);
134 BGSENDPE(pe
, msg
, len
);
137 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
140 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
142 DEBUGF(("CldEnqueue at 2 pe=%d\n", pe
));
144 CldSwitchHandler((char *)msg, CpvAccess(CldBalanceHandlerIndex));
145 CmiSetInfo(msg,infofn);
146 CmiSyncSendAndFree(pe, len, (char *)msg);
148 BGSENDPE(pe
, msg
, len
);
151 else if ((pe
== BgMyPe()) || (BgNumPes() == 1)) {
152 DEBUGF(("CldEnqueue pe == CmiMyPe()\n"));
153 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
154 CmiSetInfo(msg
,infofn
);
156 CsdEnqueueGeneral(msg, CQS_QUEUEING_LIFO, priobits, prioptr);
159 BGSENDPE(pe
, msg
, len
);
162 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
165 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
168 CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
170 CmiSetInfo(msg
,infofn
);
171 DEBUGF(("CldEnqueue pe=%d\n", pe
));
172 if (pe
==CLD_BROADCAST
) {
173 CmiPrintf("CldEnqueue pe=%d\n", pe
); CmiAbort("");
175 CmiSyncBroadcastAndFree(len, (char *)msg);
177 BGBDCAST(len
, (char *)msg
);
179 else if (pe
==CLD_BROADCAST_ALL
) {
181 CmiSyncBroadcastAllAndFree(len, (char *)msg);
183 BGBDCASTALL(len
, (char *)msg
);
187 CmiSyncSendAndFree(pe, len, (char *)msg);
189 BGSENDPE(pe
, msg
, len
);
194 void CldNodeEnqueue(int node
, void *msg
, int infofn
)
196 int len
, queueing
, priobits
; unsigned int *prioptr
;
197 CldInfoFn ifn
= (CldInfoFn
)CmiHandlerToFunction(infofn
);
199 if (node
== CLD_ANYWHERE
) {
200 /* node = (((rand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes()); */
201 node
= (((CrnRand()+BgMyNode())&0x7FFFFFFF)%BgNumNodes());
202 if (node
!= BgMyNode())
203 CpvAccess(CldRelocatedMessages
)++;
205 if (node
== BgMyNode()) {
206 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
208 CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
210 BGSENDNODE(node
, msg
, len
);
213 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
216 ifn(msg
, &pfn
, &len
, &queueing
, &priobits
, &prioptr
);
219 CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
221 CmiSetInfo(msg
,infofn
);
222 if (node
==CLD_BROADCAST
) {
223 /* CmiSyncNodeBroadcastAndFree(len, (char *)msg); */
224 BGNODEBDCAST(len
, (char *)msg
);
226 else if (node
==CLD_BROADCAST_ALL
){
227 /* CmiSyncNodeBroadcastAllAndFree(len,(char *)msg); */
228 BGNODEBDCASTALL(len
, (char *)msg
);
231 /* CmiSyncNodeSendAndFree(node, len, (char *)msg); */
232 BGSENDNODE(node
, msg
, len
);
237 void CldModuleInit(char **argv
)
239 CpvInitialize(int, CldHandlerIndex
);
240 CpvInitialize(int, CldBalanceHandlerIndex
);
241 CpvAccess(CldHandlerIndex
) = CmiRegisterHandler((CmiHandler
)CldHandler
);
242 CpvAccess(CldBalanceHandlerIndex
) = CmiRegisterHandler(CldBalanceHandler
);
243 CpvInitialize(int, CldRelocatedMessages
);
244 CpvInitialize(int, CldLoadBalanceMessages
);
245 CpvInitialize(int, CldMessageChunks
);
246 CpvAccess(CldRelocatedMessages
) = CpvAccess(CldLoadBalanceMessages
) =
247 CpvAccess(CldMessageChunks
) = 0;
248 CldModuleGeneralInit(argv
);