Integrated Prefix Router for alltoall operation. It uses permutation
[charm.git] / src / conv-com / prefixrouter.C
1 #include "prefixrouter.h"
2
3 #if 0
4 #define PREFIXDEB printf
5 #else
6 #define PREFIXDEB /* printf */
7 #endif
8
9 void PrefixRouter::EachToManyMulticastQ(comID id, CkQ<MessageHolder *> &msgq) {
10   PREFIXDEB("[%d]Sending through prefix router: ",CmiMyPe());
11   if(!msgq.isEmpty()){
12     MessageHolder *mhdl = msgq[0];
13     if(mhdl->dest_proc<0)  // broadcast or multicast
14         sendMulticast(msgq);
15     else
16         sendPointToPoint(msgq);
17   }
18   Done(id);
19 }
20
21 void PrefixRouter::sendMulticast(CkQ<MessageHolder *> &msgq) {
22     int count;
23     PREFIXDEB("with a multicast\n");
24     while(!msgq.isEmpty()){
25         MessageHolder *mhdl = msgq.deq();
26         
27         if(mhdl->dest_proc == IS_BROADCAST) {
28             for(count = 0; count < npes; count ++) {
29                 int curDest = gpes[MyPe ^ count];
30                 char *msg = mhdl->getMessage();
31                 CmiSyncSend(curDest, mhdl->size, msg);
32             }
33         }
34         else {
35             CkAbort("Implement later");
36         }
37     }
38 }
39
40 void PrefixRouter::sendPointToPoint(CkQ<MessageHolder *> &msgq) {
41     int count, i;
42     PREFIXDEB("with a point-to-point\n");
43     int len = msgq.length();
44     for(count = 0; count < npes; count ++) {
45         int curDest = gpes[MyPe ^ count];
46         
47         for(i = 0; i < len; i++) {
48             MessageHolder *mhdl = msgq[i];
49             
50             CkAssert(mhdl->dest_proc >= 0);
51             if(mhdl->dest_proc == curDest) {
52                 char *msg = mhdl->getMessage();
53                 CmiSyncSendAndFree(curDest, mhdl->size, msg);
54             }
55         }
56     }
57     
58     for(i = 0; i < len; i++) {
59         MessageHolder *mhdl = msgq.deq();
60         delete mhdl;
61     }
62 }