Added netBcast
authorMilind Bhandarkar <milind@cs.uiuc.edu>
Fri, 13 Sep 1996 15:42:55 +0000 (15:42 +0000)
committerMilind Bhandarkar <milind@cs.uiuc.edu>
Fri, 13 Sep 1996 15:42:55 +0000 (15:42 +0000)
src/arch/net/machine.c

index fc3ac910a8166b1b87df283eff9ef4d6622de766..fe644846853f9f57676dc2eb9ddd1d2287a3c0e6 100644 (file)
@@ -1476,6 +1476,29 @@ static void AckReceivedMsgs()
   }
 }
 
+#define shift(root, num) ((num+total-root)%CpvAccess(Cmi_numpes))
+#define unshift(root, num) ((num+root)%CpvAccess(Cmi_numpes))
+
+static void my_children(root, pchild1, pchild2)
+    int root, *pchild1, *pchild2;
+{
+  int mynum = CpvAccess(Cmi_mype);
+  int total = CpvAccess(Cmi_numpes);
+  int p1, p2;
+
+  mynum = shift(root, mynum);
+  p1 = 2*mynum+1;
+  p2 = 2*mynum+2;
+  if(p1 >= total) 
+        *pchild1 = (-1);
+  else
+    *pchild1 = unshift(root, p1);
+  if(p2 >= total) 
+        *pchild2 = (-1);
+  else
+    *pchild2 = unshift(root, p2);
+}
+
 static int data_getone()
 {
   msgspace *recv_buf=NULL;
@@ -1494,10 +1517,39 @@ static int data_getone()
     UpdateSendWindow(recv_buf, (int) recv_buf->hd.PeNum);
     CmiFree(recv_buf);
   } else if (kind == SEND) {
-    sender = node_table + recv_buf->hd.PeNum;
-    if((sender->dataport)&&(sender->dataport!=htons(src.sin_port)))
-      KillEveryoneCode(38473);
-    AddToReceiveWindow(recv_buf, (int) recv_buf->hd.PeNum);
+        /*Milind*/
+        if(recv_buf->hd.PeNum & (1<<31)) {
+               int root, srcnode, d1, d2;
+               msgspace *m1=NULL, *m2=NULL;
+      
+               root = (recv_buf->hd.PeNum >> 16) & (~(1<<15));
+               srcnode = (recv_buf->hd.PeNum ^ (root<<16)) & (~(1<<31));
+               my_children(root, &d1, &d2);
+               if(d1!=(-1)){
+                 m1 = (msgspace *)CmiAlloc(CMK_DGRAM_MAX_SIZE);
+                 memcpy(m1, recv_buf, CMK_DGRAM_MAX_SIZE);
+                 m1->hd.PeNum = ((m1->hd.PeNum >> 16) << 16) | CpvAccess(Cmi_mype);
+        InsertInTransmitQueue(m1, d1);
+                 SendPackets(d1);
+               }
+               if(d2!=(-1)){
+                 m2 = (msgspace *)CmiAlloc(CMK_DGRAM_MAX_SIZE);
+                 memcpy(m2, recv_buf, CMK_DGRAM_MAX_SIZE);
+                 m2->hd.PeNum = ((m1->hd.PeNum >> 16) << 16) | CpvAccess(Cmi_mype);
+        InsertInTransmitQueue(m2, d2);
+                 SendPackets(d2);
+               }
+               recv_buf->hd.PeNum = srcnode;
+      sender = node_table + recv_buf->hd.PeNum;
+      if((sender->dataport)&&(sender->dataport!=htons(src.sin_port)))
+        KillEveryoneCode(38473);
+      AddToReceiveWindow(recv_buf, (int) recv_buf->hd.PeNum);
+        } else {
+      sender = node_table + recv_buf->hd.PeNum;
+      if((sender->dataport)&&(sender->dataport!=htons(src.sin_port)))
+        KillEveryoneCode(38473);
+      AddToReceiveWindow(recv_buf, (int) recv_buf->hd.PeNum);
+        }
   } 
   return kind;
 }
@@ -1651,6 +1703,57 @@ static int netSend(destPE, size, msg)
   CmiInterruptsRelease();
 }
 
+static int netBcast(size, msg) 
+     int size; 
+     char * msg; 
+{
+  DATA_HDR *hd,*hd2;
+  unsigned int pktnum = 0;
+  unsigned int numfrag = ((size-1)/MAXDSIZE) + 1;
+  unsigned int destPE1, destPE2;
+
+  my_children(CpvAccess(Cmi_mype), &destPE1, &destPE2);
+  if(destPE1==(-1) || destPE2==(-1)){
+        if(destPE1!=(-1))
+               netSend(destPE1, size, msg);
+    if(destPE2!=(-1))
+               netSend(destPE2, size, msg);
+    return 1;
+  }
+
+  CmiInterruptsBlock();
+  
+  if (!Communication_init) return -1;
+  
+  for(;pktnum<(numfrag-1);pktnum++) {
+    hd = (DATA_HDR *)CmiAlloc(CMK_DGRAM_MAX_SIZE);
+    hd->pktidx = pktnum;
+    hd->rem_size = size;
+    hd->PeNum = (1<<31) | (CpvAccess(Cmi_mype)<<16) | (CpvAccess(Cmi_mype));
+    memcpy((hd+1), msg, MAXDSIZE);
+        hd2 = (DATA_HDR *)CmiAlloc(CMK_DGRAM_MAX_SIZE);
+        memcpy(hd2,hd,CMK_DGRAM_MAX_SIZE);
+    InsertInTransmitQueue(hd, destPE1);
+    InsertInTransmitQueue(hd2, destPE2);
+    msg += MAXDSIZE;
+    size -= MAXDSIZE;
+  }
+  hd = (DATA_HDR *)CmiAlloc(sizeof(DATA_HDR)+size);
+  hd->pktidx = pktnum;
+  hd->rem_size = size;
+  hd->PeNum = (1<<31) | (CpvAccess(Cmi_mype)<<16) | (CpvAccess(Cmi_mype));
+  memcpy((hd+1), msg, size);
+  hd2 = (DATA_HDR *)CmiAlloc(sizeof(DATA_HDR)+size);
+  memcpy(hd2,hd,sizeof(DATA_HDR)+size);
+  InsertInTransmitQueue(hd, destPE1);
+  InsertInTransmitQueue(hd2, destPE2);
+  
+  SendPackets(destPE1);
+  SendPackets(destPE2);
+  
+  CmiInterruptsRelease();
+}
+
 static int netSendV(destPE, n, sizes, msgs) 
      int destPE, n, *sizes; 
      char **msgs; 
@@ -1846,11 +1949,14 @@ void CmiFreeSendFn(destPE, size, msg)
 void CmiSyncBroadcastFn(size,msg)
      int size; char *msg;
 {
+  netBcast(size,msg);
+  /*
   int i;
   for (i=0;i<CpvAccess(Cmi_numpes);i++) {
     if (i != CpvAccess(Cmi_mype)) 
       netSend(i,size,msg);
   }
+  */
 }
 
 CmiCommHandle CmiAsyncBroadcastFn(size, msg)
@@ -1863,11 +1969,14 @@ CmiCommHandle CmiAsyncBroadcastFn(size, msg)
 void CmiFreeBroadcastFn(size,msg)
      int size; char *msg;
 {
+  netBcast(size,msg);
+  /*
   int i;
   for (i=0;i<CpvAccess(Cmi_numpes);i++) {
     if (i != CpvAccess(Cmi_mype)) 
       netSend(i,size,msg);
   }
+  */
   CmiFree(msg);
 }
 
@@ -1876,9 +1985,12 @@ void CmiSyncBroadcastAllFn(size,msg)
 {
   int i;
   char *msg1;
+  netBcast(size,msg);
+  /*
   for (i=0;i<CpvAccess(Cmi_numpes);i++)
     if (i != CpvAccess(Cmi_mype)) 
       netSend(i,size,msg);
+  */
   msg1 = (char *)CmiAlloc(size);
   memcpy(msg1,msg,size);
   FIFO_EnQueue(CpvAccess(CmiLocalQueue),msg1);
@@ -1894,10 +2006,13 @@ CmiCommHandle CmiAsyncBroadcastAllFn(size, msg)
 void CmiFreeBroadcastAllFn(size,msg)
      int size; char *msg;
 {
+  netBcast(size,msg);
+  /*
   int i;
   for (i=0;i<CpvAccess(Cmi_numpes);i++)
     if (i != CpvAccess(Cmi_mype)) 
       netSend(i,size,msg);
+  */
   FIFO_EnQueue(CpvAccess(CmiLocalQueue),msg);
 }