Bug #1062: Fix linking errors by moving definition of userDrivenMode to machine-commo...
[charm.git] / src / conv-ldb / cldb.bluegene.c
blobf6743743163392a6ee44b331af05aecf565ccd55
1 /****
2 converse ldb for Blue Gene, this is the first version, full of hack and
3 need more work.
4 ***/
6 #include "converse.h"
7 #include "blue.h"
8 #include "cldb.h"
9 #include "queueing.h"
10 #include <stdlib.h>
12 #define DEBUGF(x) /*CmiPrintf x;*/
14 #if CMK_BIGSIM_CHARM
16 extern int CldPresentPE(int pe);
18 void LoadNotifyFn(int l)
22 char *CldGetStrategy(void)
24 return "rand";
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);
45 #if CMK_BIGSIM_NODE
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) { \
49 int x,y,z; \
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, \
53 len, (char *)msg); \
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) { \
65 int x,y,z,t; \
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) { \
78 int x,y,z; \
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);
88 #endif
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);
99 CldPackFn pfn;
100 ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
101 if (pfn) {
102 pfn(&msg);
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);
116 CldPackFn pfn;
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());
125 if (pe != BgMyPe())
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);
136 else {
137 ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
138 if (pfn) {
139 pfn(&msg);
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);
158 pe = BgMyPe();
159 BGSENDPE(pe, msg, len);
161 else {
162 ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
163 if (pfn) {
164 pfn(&msg);
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);
185 else {
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);
198 CldPackFn pfn;
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);
212 else {
213 ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
214 if (pfn) {
215 pfn(&msg);
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);
230 else {
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);
251 void CldCallback(){}
253 #endif