replaced CmiNumPes(), so that chare creations are scattered well when cldanywhere.
[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 #if CMK_BLUEGENE_NODE
69 #define BGSENDPE(pe, msg, len)  {       \
70       int x,y,z;        \
71       BgGetXYZ(pe, &x, &y, &z); \
72       DEBUGF(("send to: (%d %d %d, %d) handle:%d\n", x,y,z,t, CmiGetHandler(msg)));  \
73       BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg); \
74       }
75 #else
76 #define BGSENDPE(pe, msg, len)  {       \
77       int x,y,z,t;      \
78       t = (pe)%BgGetNumWorkThread();    \
79       pe = (pe)/BgGetNumWorkThread();   \
80       BgGetXYZ(pe, &x, &y, &z); \
81       DEBUGF(("send to: (%d %d %d, %d) handle:%d\n", x,y,z,t, CmiGetHandler(msg)));  \
82       BgSendPacket(x,y,z, t, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg); \
83       }
84 #endif
85
86 #if CMK_BLUEGENE_NODE
87 static int BgMyPe() { return BgMyNode(); }
88 static int BgNumPes() { int x,y,z; BgGetSize(&x, &y, &z); return (x*y*z); }
89 #else
90 static int BgMyPe() { return BgGetGlobalWorkerThreadID(); }
91 static int BgNumPes() { return BgGetTotalSize()*BgGetNumWorkThread(); }
92 #endif
93
94 void CldEnqueue(int pe, void *msg, int infofn)
95 {
96   int len, queueing, priobits; unsigned int *prioptr;
97   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
98   CldPackFn pfn;
99   int size;
100
101   int sx,sy,sz; BgGetSize(&sx, &sy, &sz); size = (sx*sy*sz);
102
103   DEBUGF(("[%d>] CldEnqueue pe: %d infofn:%d\n", BgMyNode(), pe, infofn));
104   if (pe == CLD_ANYWHERE) {
105     pe = (((CrnRand()+BgMyPe())&0x7FFFFFFF)%BgNumPes());
106     while (!CldPresentPE(pe))
107       pe = (((CrnRand()+BgMyPe())&0x7FFFFFFF)%BgNumPes());
108     if (pe != BgMyPe())
109       CpvAccess(CldRelocatedMessages)++;
110     if (pe == BgMyPe()) {
111       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
112       CmiSetInfo(msg,infofn);
113       DEBUGF(("CldEnqueue CLD_ANYWHERE (pe == BgMyPe)\n"));
114 /*
115       CldPutToken((char *)msg);
116 */
117       BGSENDPE(pe, msg, len);
118     } 
119     else {
120       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
121       if (pfn) {
122         pfn(&msg);
123         ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
124       }
125       DEBUGF(("CldEnqueue at 2 pe=%d\n", pe));
126 /*
127       CldSwitchHandler((char *)msg, CpvAccess(CldBalanceHandlerIndex));
128       CmiSetInfo(msg,infofn);
129       CmiSyncSendAndFree(pe, len, (char *)msg);
130 */
131       BGSENDPE(pe, msg, len);
132 /*
133       {
134       int x,y,z;
135       if (pe >= size) pe = size-1;
136       BgGetXYZ(pe, &x, &y, &z);
137       DEBUGF(("send to: %d %d %d handle:%d\n", x,y,z, CmiGetHandler(msg)));
138       BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg);
139       }
140 */
141     }
142   }
143   else if ((pe == CmiMyPe()) || (CmiNumPes() == 1)) {
144     DEBUGF(("CldEnqueue pe == CmiMyPe()\n"));
145     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
146     CmiSetInfo(msg,infofn);
147 /*
148     CsdEnqueueGeneral(msg, CQS_QUEUEING_LIFO, priobits, prioptr);
149 */
150     BGSENDPE(pe, msg, len);
151 /*
152     {
153     int x,y,z;
154     if (pe >= CmiNumPes()) pe = CmiNumPes()-1;
155     BgGetXYZ(pe, &x, &y, &z);
156     BgSendPacket(x,y,z, ANYTHREAD, CmiGetHandler(msg), LARGE_WORK, len, (char *)msg);
157     }
158 */
159   }
160   else {
161     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
162     if (pfn) {
163       pfn(&msg);
164       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
165     }
166 /*
167     CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
168 */
169     CmiSetInfo(msg,infofn);
170     DEBUGF(("CldEnqueue pe=%d\n", pe));
171     if (pe==CLD_BROADCAST) { 
172 CmiPrintf("CldEnqueue pe=%d\n", pe); CmiAbort("");
173       CmiSyncBroadcastAndFree(len, (char *)msg); }
174     else if (pe==CLD_BROADCAST_ALL) { 
175 CmiPrintf("CldEnqueue pe=%d\n", pe); CmiAbort("");
176       CmiSyncBroadcastAllAndFree(len, (char *)msg); 
177     }
178     else {
179 /*
180       CmiSyncSendAndFree(pe, len, (char *)msg);
181 */
182       BGSENDPE(pe, msg, len);
183     }
184   }
185 }
186
187 void CldNodeEnqueue(int node, void *msg, int infofn)
188 {
189   int len, queueing, priobits; unsigned int *prioptr;
190   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
191   CldPackFn pfn;
192   if (node == CLD_ANYWHERE) {
193     /* node = (((rand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes()); */
194     node = (((CrnRand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes());
195     if (node != CmiMyNode())
196       CpvAccess(CldRelocatedMessages)++;
197   }
198   if (node == CmiMyNode()) {
199     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
200     CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
201   } 
202   else {
203     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
204     if (pfn) {
205       pfn(&msg);
206       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
207     }
208     CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
209     CmiSetInfo(msg,infofn);
210     if (node==CLD_BROADCAST) { CmiSyncNodeBroadcastAndFree(len, (char *)msg); }
211     else if (node==CLD_BROADCAST_ALL){CmiSyncNodeBroadcastAllAndFree(len,(char *)msg);}
212     else CmiSyncNodeSendAndFree(node, len, (char *)msg);
213   }
214 }
215
216 void CldModuleInit()
217 {
218   CpvInitialize(int, CldHandlerIndex);
219   CpvInitialize(int, CldBalanceHandlerIndex);
220   CpvAccess(CldHandlerIndex) = CmiRegisterHandler(CldHandler);
221   CpvAccess(CldBalanceHandlerIndex) = CmiRegisterHandler(CldBalanceHandler);
222   CpvInitialize(int, CldRelocatedMessages);
223   CpvInitialize(int, CldLoadBalanceMessages);
224   CpvInitialize(int, CldMessageChunks);
225   CpvAccess(CldRelocatedMessages) = CpvAccess(CldLoadBalanceMessages) = 
226     CpvAccess(CldMessageChunks) = 0;
227   CldModuleGeneralInit();
228 }
229