a little optimiation for SMP: use node shared queue for messages to the same node...
[charm.git] / src / conv-ldb / cldb.rand.c
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 #include "converse.h"
9 #include "queueing.h"
10 #include "cldb.h"
11 #include <stdlib.h>
12
13 void LoadNotifyFn(int l)
14 {
15 }
16
17 char *CldGetStrategy(void)
18 {
19   return "rand";
20 }
21
22 void CldHandler(char *msg)
23 {
24   int len, queueing, priobits;
25   unsigned int *prioptr; CldInfoFn ifn; CldPackFn pfn;
26   CldRestoreHandler(msg);
27   ifn = (CldInfoFn)CmiHandlerToFunction(CmiGetInfo(msg));
28   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
29   CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
30 }
31
32 void CldEnqueueMulti(int npes, int *pes, void *msg, int infofn)
33 {
34   int len, queueing, priobits,i; unsigned int *prioptr;
35   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
36   CldPackFn pfn;
37   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
38   if (pfn) {
39     pfn(&msg);
40     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
41   }
42   CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
43   CmiSetInfo(msg,infofn);
44
45   /*
46   for(i=0;i<npes;i++) {
47     CmiSyncSend(pes[i], len, msg);
48   }
49   CmiFree(msg);
50   */
51
52   CmiSyncListSendAndFree(npes, pes, len, msg);
53 }
54
55 void CldEnqueue(int pe, void *msg, int infofn)
56 {
57   int len, queueing, priobits; unsigned int *prioptr;
58   CldInfoFn ifn;
59   CldPackFn pfn;
60   if (pe == CLD_ANYWHERE) {
61     pe = (((CrnRand()+CmiMyPe())&0x7FFFFFFF)%CmiNumPes());
62       /* optimizationfor SMP */
63 #if CMK_SMP
64     if (CmiNodeOf(pe) == CmiMyNode()) {
65       CldNodeEnqueue(CmiMyNode(), msg, infofn);
66       return;
67     }
68 #endif
69     if (pe != CmiMyPe())
70       CpvAccess(CldRelocatedMessages)++;
71   }
72   ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
73   if (pe == CmiMyPe() && !CmiImmIsRunning()) {
74     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
75     /* CsdEnqueueGeneral is not thread or SIGIO safe */
76     CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
77   } else {
78     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
79     if (pfn && CmiNodeOf(pe) != CmiMyNode()) {
80       pfn(&msg);
81       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
82     }
83     CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
84     CmiSetInfo(msg,infofn);
85     if (pe==CLD_BROADCAST) { CmiSyncBroadcastAndFree(len, msg); }
86     else if (pe==CLD_BROADCAST_ALL) { CmiSyncBroadcastAllAndFree(len, msg); }
87     else CmiSyncSendAndFree(pe, len, msg);
88   }
89 }
90
91 void CldNodeEnqueue(int node, void *msg, int infofn)
92 {
93   int len, queueing, priobits; unsigned int *prioptr;
94   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
95   CldPackFn pfn;
96   if (node == CLD_ANYWHERE) {
97     node = (((CrnRand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes());
98     if (node != CmiMyNode())
99       CpvAccess(CldRelocatedMessages)++;
100   }
101   if (node == CmiMyNode() && !CmiImmIsRunning()) {
102     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
103     CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
104   } else {
105     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
106     if (pfn) {
107       pfn(&msg);
108       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
109     }
110     CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
111     CmiSetInfo(msg,infofn);
112     if (node==CLD_BROADCAST) { CmiSyncNodeBroadcastAndFree(len, msg); }
113     else if (node==CLD_BROADCAST_ALL){CmiSyncNodeBroadcastAllAndFree(len,msg);}
114     else CmiSyncNodeSendAndFree(node, len, msg);
115   }
116 }
117
118 void CldModuleInit(char **argv)
119 {
120   CpvInitialize(int, CldHandlerIndex);
121   CpvAccess(CldHandlerIndex) = CmiRegisterHandler((CmiHandler)CldHandler);
122   CpvInitialize(int, CldRelocatedMessages);
123   CpvInitialize(int, CldLoadBalanceMessages);
124   CpvInitialize(int, CldMessageChunks);
125   CpvAccess(CldRelocatedMessages) = CpvAccess(CldLoadBalanceMessages) = 
126     CpvAccess(CldMessageChunks) = 0;
127   CldModuleGeneralInit(argv);
128 }