converse ldb for bluegene.
[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   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
56   if (pfn) {
57     pfn(&msg);
58     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
59   }
60   CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
61   CmiSetInfo(msg,infofn);
62   for(i=0;i<npes;i++) {
63     CmiSyncSend(pes[i], len, (char *)msg);
64   }
65   CmiFree(msg);
66 }
67
68 void CldEnqueue(int pe, void *msg, int infofn)
69 {
70   int len, queueing, priobits; unsigned int *prioptr;
71   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
72   CldPackFn pfn;
73   int size;
74
75   int sx,sy,sz; BgGetSize(&sx, &sy, &sz); size = (sx*sy*sz);
76
77   DEBUGF(("[%d] CldEnqueue pe: %d infofn:%d\n", BgMyNode(), pe, infofn));
78   if (pe == CLD_ANYWHERE) {
79     pe = (((CrnRand()+CmiMyPe())&0x7FFFFFFF)%CmiNumPes());
80     while (!CldPresentPE(pe))
81       pe = (((CrnRand()+CmiMyPe())&0x7FFFFFFF)%CmiNumPes());
82     if (pe != CmiMyPe())
83       CpvAccess(CldRelocatedMessages)++;
84     if (pe == CmiMyPe()) {
85       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
86       CmiSetInfo(msg,infofn);
87       DEBUGF(("CldEnqueue at 1\n"));
88 /*
89       CldPutToken((char *)msg);
90 */
91       {
92       int x,y,z;
93       BgGetXYZ(pe, &x, &y, &z);
94       DEBUGF(("send to: %d %d %d handle:%d\n", x,y,z, CmiGetHandler(msg)));
95       BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg);
96       }
97     } 
98     else {
99       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
100       if (pfn) {
101         pfn(&msg);
102         ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
103       }
104       DEBUGF(("CldEnqueue at 2\n"));
105 /*
106       CldSwitchHandler((char *)msg, CpvAccess(CldBalanceHandlerIndex));
107       CmiSetInfo(msg,infofn);
108       CmiSyncSendAndFree(pe, len, (char *)msg);
109 */
110       {
111       int x,y,z;
112       if (pe >= size) pe = size-1;
113       BgGetXYZ(pe, &x, &y, &z);
114       DEBUGF(("send to: %d %d %d handle:%d\n", x,y,z, CmiGetHandler(msg)));
115       BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg);
116       }
117     }
118   }
119   else if ((pe == CmiMyPe()) || (CmiNumPes() == 1)) {
120     DEBUGF(("CldEnqueue pe == CmiMyPe()\n"));
121     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
122     CmiSetInfo(msg,infofn);
123 /*
124     CsdEnqueueGeneral(msg, CQS_QUEUEING_LIFO, priobits, prioptr);
125 */
126     {
127     int x,y,z;
128     if (pe >= CmiNumPes()) pe = CmiNumPes()-1;
129     BgGetXYZ(pe, &x, &y, &z);
130     BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg);
131     }
132   }
133   else {
134     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
135     if (pfn) {
136       pfn(&msg);
137       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
138     }
139 /*
140     CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
141 */
142     CmiSetInfo(msg,infofn);
143     DEBUGF(("CldEnqueue pe=%d\n", pe));
144     if (pe==CLD_BROADCAST) { 
145 CmiPrintf("CldEnqueue pe=%d\n", pe); CmiAbort("");
146       CmiSyncBroadcastAndFree(len, (char *)msg); }
147     else if (pe==CLD_BROADCAST_ALL) { 
148 CmiPrintf("CldEnqueue pe=%d\n", pe); CmiAbort("");
149       CmiSyncBroadcastAllAndFree(len, (char *)msg); 
150     }
151     else {
152 /*
153       CmiSyncSendAndFree(pe, len, (char *)msg);
154 */
155       int x,y,z;
156       BgGetXYZ(pe, &x, &y, &z);
157       DEBUGF(("send to: %d %d %d handle:%d\n", x,y,z, CmiGetHandler(msg)));
158       BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, len, msg);
159     }
160   }
161 }
162
163 void CldNodeEnqueue(int node, void *msg, int infofn)
164 {
165   int len, queueing, priobits; unsigned int *prioptr;
166   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
167   CldPackFn pfn;
168   if (node == CLD_ANYWHERE) {
169     /* node = (((rand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes()); */
170     node = (((CrnRand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes());
171     if (node != CmiMyNode())
172       CpvAccess(CldRelocatedMessages)++;
173   }
174   if (node == CmiMyNode()) {
175     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
176     CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
177   } 
178   else {
179     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
180     if (pfn) {
181       pfn(&msg);
182       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
183     }
184     CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
185     CmiSetInfo(msg,infofn);
186     if (node==CLD_BROADCAST) { CmiSyncNodeBroadcastAndFree(len, (char *)msg); }
187     else if (node==CLD_BROADCAST_ALL){CmiSyncNodeBroadcastAllAndFree(len,(char *)msg);}
188     else CmiSyncNodeSendAndFree(node, len, (char *)msg);
189   }
190 }
191
192 void CldModuleInit()
193 {
194   CpvInitialize(int, CldHandlerIndex);
195   CpvInitialize(int, CldBalanceHandlerIndex);
196   CpvAccess(CldHandlerIndex) = CmiRegisterHandler(CldHandler);
197   CpvAccess(CldBalanceHandlerIndex) = CmiRegisterHandler(CldBalanceHandler);
198   CpvInitialize(int, CldRelocatedMessages);
199   CpvInitialize(int, CldLoadBalanceMessages);
200   CpvInitialize(int, CldMessageChunks);
201   CpvAccess(CldRelocatedMessages) = CpvAccess(CldLoadBalanceMessages) = 
202     CpvAccess(CldMessageChunks) = 0;
203   CldModuleGeneralInit();
204 }
205