Fixing a bug with ctrl message scheme
authorNikhil Jain <nikhil@illinois.edu>
Mon, 22 Oct 2012 23:45:24 +0000 (18:45 -0500)
committerNikhil Jain <nikhil@illinois.edu>
Mon, 22 Oct 2012 23:45:24 +0000 (18:45 -0500)
src/arch/mpi/machine-ctrlmsg.c
src/arch/mpi/machine.c

index 8da4dfdf9f01ccb2cadfabf6877c48d9c7e7dd2d..131ef2305b25004136431f06caac5ca26c71ecec 100644 (file)
 #if USE_MPI_CTRLMSG_SCHEME
 
 #define CTRL_MSG_TAG         (TAG-13)
+#define USE_NUM_TAGS            1000
 
-static int MPI_CTRL_MSG_CNT=10;
+static int MPI_CTRL_MSG_CNT=100;
+static int tags;
 
 typedef struct MPICtrlMsgEntry{
        int src;
        int size;
+        int tag;
 }MPICtrlMsgEntry;
 
 typedef struct RecvCtrlMsgEntry{
@@ -43,6 +46,8 @@ static void createCtrlMsgIrecvBufs(){
        MPICtrlMsgEntry *bufPtr = NULL;
        MPI_Request *reqPtr = NULL;
        int count = MPI_CTRL_MSG_CNT;
+
+        tags = 0;
        
        recvCtrlMsgList.bufCnt = count;
        recvCtrlMsgList.ctrlReqs = (MPI_Request *)malloc(sizeof(MPI_Request)*count);
@@ -53,7 +58,7 @@ static void createCtrlMsgIrecvBufs(){
        
        for(i=0; i<count; i++, bufPtr++, reqPtr++){
                if(MPI_SUCCESS != MPI_Irecv(bufPtr, sizeof(MPICtrlMsgEntry), 
-                                                                                                        MPI_BYTE, MPI_ANY_SOURCE, CTRL_MSG_TAG, charmComm, reqPtr)){
+                              MPI_BYTE, MPI_ANY_SOURCE, CTRL_MSG_TAG, charmComm, reqPtr)){
                        CmiAbort("MPI_Irecv failed in creating pre-posted ctrl msg buffers\n");
                }
        }
@@ -64,14 +69,15 @@ static void sendViaCtrlMsg(int node, int size, char *msg, SMSG_LIST *smsg){
 
        one.src = CmiMyNode();
        one.size = size;
+        one.tag = TAG + 100 + tags;
+
+        tags = (tags+1)%USE_NUM_TAGS;
        
        START_TRACE_SENDCOMM(msg);
-       if(MPI_SUCCESS != MPI_Send((void *)&one, sizeof(MPICtrlMsgEntry), MPI_BYTE, node, 
-                                                                                                  CTRL_MSG_TAG, charmComm)){
+       if(MPI_SUCCESS != MPI_Send((void *)&one, sizeof(MPICtrlMsgEntry), MPI_BYTE, node, CTRL_MSG_TAG, charmComm)){
                CmiAbort("MPI_Send failed in sending ctrl msg\n");
        }
-       
-       if (MPI_SUCCESS != MPI_Isend((void *)msg,size,MPI_BYTE,node,TAG,charmComm,&(smsg->req)))
+       if (MPI_SUCCESS != MPI_Isend((void *)msg,size,MPI_BYTE,node,one.tag,charmComm,&(smsg->req)))
             CmiAbort("MPISendOneMsg: MPI_Isend failed!\n");
        END_TRACE_SENDCOMM(msg);
 }
@@ -86,7 +92,6 @@ static int recvViaCtrlMsg(){
        int flg = 0;
        int nbytes = -1;
        MPI_Status sts;
-       
        if(MPI_SUCCESS != MPI_Testany(count, ctrlReqs, &completed_index, &flg, &sts)){
                CmiAbort("MPI_Testany failed for checking if ctrl msg is received\n");
        }
@@ -106,7 +111,7 @@ static int recvViaCtrlMsg(){
                }
                
                /* irecv the actual msg */
-               if(MPI_SUCCESS != MPI_Irecv(actualMsg, msgsize, MPI_BYTE, src, TAG, charmComm, &(one->req))){
+               if(MPI_SUCCESS != MPI_Irecv(actualMsg, msgsize, MPI_BYTE, src, ctrlMsgs[completed_index].tag, charmComm, &(one->req))){
                        CmiAbort("MPI_Irecv failed after a ctrl msg is received\n");
                }
                one->msg = actualMsg;
@@ -119,4 +124,4 @@ static int recvViaCtrlMsg(){
        return nbytes;
 }
 
-#endif
\ No newline at end of file
+#endif
index 58591905237aea9b818df0798ac949a9ff159b29..5c9a82156f2c660f1b5367528df69499675cc72e 100644 (file)
@@ -442,7 +442,7 @@ static CmiCommHandle MPISendOneMsg(SMSG_LIST *smsg) {
         END_TRACE_SENDCOMM(msg);
     }
 #elif USE_MPI_CTRLMSG_SCHEME
-       sendViaCtrlMsg(node, size, msg, smsg);
+    sendViaCtrlMsg(node, size, msg, smsg);
 #else
 /* branch not using MPI_POST_RECV or USE_MPI_CTRLMSG_SCHEME */
 
@@ -461,8 +461,9 @@ static CmiCommHandle MPISendOneMsg(SMSG_LIST *smsg) {
     CpvAccess(MsgQueueLen)++;
     if (CpvAccess(sent_msgs)==0)
         CpvAccess(sent_msgs) = smsg;
-    else
+    else {
         CpvAccess(end_sent)->next = smsg;
+    }
     CpvAccess(end_sent) = smsg;
 
 #if !CMI_DYNAMIC_EXERT_CAP && !CMI_EXERT_SEND_CAP
@@ -624,6 +625,7 @@ static int PumpMsgs(void) {
 #if USE_MPI_CTRLMSG_SCHEME
        doSyncRecv = 0;
        nbytes = recvViaCtrlMsg();
+  recd = 1;
        if(nbytes == -1) break;
 #elif MPI_POST_RECV
                /* First check posted recvs then do  probe unmatched outstanding messages */
@@ -841,7 +843,6 @@ static int PumpMsgs(void) {
     MPI_Status sts;
     while(waitIrecvListHead->next) {
         IRecvList irecvEnt = waitIrecvListHead->next;
-
         START_EVENT();
                 
         /*printf("PE[%d]: check irecv entry=%p\n", CmiMyPe(), irecvEnt);*/
@@ -855,7 +856,7 @@ static int PumpMsgs(void) {
         handleOneRecvedMsg(irecvEnt->size, irecvEnt->msg);
         waitIrecvListHead->next = irecvEnt->next;
         irecvListEntryFree(irecvEnt);
-        recd = 1;        
+        //recd = 1;        
     }
     if(waitIrecvListHead->next == NULL)
         waitIrecvListTail = waitIrecvListHead;
@@ -1873,7 +1874,6 @@ int CmiBarrierZero() {
         if (CmiMyNode() == 0)  {
             for (i=0; i<CmiNumNodes()-1; i++) {
                 START_EVENT();
-
                 if (MPI_SUCCESS != MPI_Recv(msg,1,MPI_BYTE,MPI_ANY_SOURCE,BARRIER_ZERO_TAG, charmComm,&sts))
                     CmiPrintf("MPI_Recv failed!\n");