[mpich2-commits] r5574 - mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad

mercierg at mcs.anl.gov mercierg at mcs.anl.gov
Tue Oct 27 04:18:47 CDT 2009


Author: mercierg
Date: 2009-10-27 04:18:47 -0500 (Tue, 27 Oct 2009)
New Revision: 5574

Modified:
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/Makefile.sm
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_finalize.c
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_impl.h
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_init.c
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_poll.c
Log:
Fix for Newmad for one-sided ops. 


Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/Makefile.sm
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/Makefile.sm	2009-10-27 09:18:02 UTC (rev 5573)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/Makefile.sm	2009-10-27 09:18:47 UTC (rev 5574)
@@ -2,4 +2,4 @@
            -I${top_builddir}/src/include
 lib${MPILIBNAME}_a_SOURCES = \
   newmad_finalize.c  newmad_init.c  newmad_poll.c      newmad_send.c \
-  newmad_register.c  newmad_test.c  newmad_cancel.c    newmad_probe.c  
+  newmad_register.c  newmad_test.c  newmad_cancel.c    newmad_probe.c 	newmad_alloc.c

Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_finalize.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_finalize.c	2009-10-27 09:18:02 UTC (rev 5573)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_finalize.c	2009-10-27 09:18:47 UTC (rev 5574)
@@ -18,6 +18,8 @@
 
     common_exit(NULL);
 
+    MPID_nem_newmad_internal_req_queue_destroy();
+   
    fn_exit:
      return mpi_errno;
    fn_fail:  ATTRIBUTE((unused))

Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_impl.h
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_impl.h	2009-10-27 09:18:02 UTC (rev 5573)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_impl.h	2009-10-27 09:18:47 UTC (rev 5574)
@@ -53,10 +53,8 @@
 int MPID_nem_newmad_anysource_matched(MPID_Request *rreq);
 
 /* Callbacks for events */
+int MPID_nem_newmad_post_init(void);
 void MPID_nem_newmad_get_adi_msg(nm_sr_event_t event, const nm_sr_event_info_t*info);
-void MPID_nem_newmad_get_rreq(nm_sr_event_t event, const nm_sr_event_info_t*info);
-void MPID_nem_newmad_handle_sreq(nm_sr_event_t event, const nm_sr_event_info_t*info);
-int MPID_nem_newmad_post_init(void);
 
 /* Dtype management */
 int MPID_nem_newmad_process_sdtype(MPID_Request **sreq_p,  MPI_Datatype datatype,  MPID_Datatype * dt_ptr, const void *buf, 
@@ -106,6 +104,34 @@
 /* accessor macro to private fields in REQ */
 #define REQ_FIELD(reqp, field) (((MPID_nem_newmad_req_area *)((reqp)->ch.netmod_area.padding))->field)
 
+/* The begining of this structure is the same as MPID_Request */
+struct MPID_nem_newmad_internal_req
+{
+   int                    handle;     /* unused */
+   volatile int           ref_count;  /* unused */
+   MPID_Request_kind_t    kind;       /* used   */
+   MPIDI_CH3_PktGeneric_t pending_pkt;
+   MPIDI_VC_t            *vc;
+   void                  *tmpbuf;
+   MPIDI_msg_sz_t         tmpbuf_sz;
+   nm_sr_request_t        newmad_req;
+   struct  MPID_nem_mx_internal_req *next;
+};
+
+typedef struct MPID_nem_newmad_internal_req MPID_nem_newmad_internal_req_t;
+
+typedef union
+{   
+   MPID_nem_newmad_internal_req_t nem_newmad_req;
+   MPID_Request                   mpi_req;
+} MPID_nem_newmad_unified_req_t ;
+
+/* Internal Reqs management */
+int MPID_nem_newmad_internal_req_queue_init(void);
+int MPID_nem_newmad_internal_req_queue_destroy(void);
+int MPID_nem_newmad_internal_req_dequeue(MPID_nem_newmad_internal_req_t **req);
+int MPID_nem_newmad_internal_req_enqueue(MPID_nem_newmad_internal_req_t *req);
+
 #if CH3_RANK_BITS == 16
 #define NBITS_TAG  32
 typedef int32_t Nmad_Nem_tag_t;

Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_init.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_init.c	2009-10-27 09:18:02 UTC (rev 5573)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_init.c	2009-10-27 09:18:47 UTC (rev 5574)
@@ -12,7 +12,6 @@
 MPID_nem_netmod_funcs_t MPIDI_nem_newmad_funcs = {
     MPID_nem_newmad_init,
     MPID_nem_newmad_finalize,
-    MPID_nem_newmad_ckpt_shutdown,
     MPID_nem_newmad_poll,
     MPID_nem_newmad_send,
     MPID_nem_newmad_get_business_card,
@@ -135,7 +134,9 @@
     int   mpi_errno = MPI_SUCCESS;
     char *dummy_argv[1] = {NULL};
     int   dummy_argc    = 1;
-    
+
+    MPID_nem_newmad_internal_req_queue_init();
+   
     ret = nm_core_init(&dummy_argc,dummy_argv, &mpid_nem_newmad_pcore);
     if (ret != NM_ESUCCESS){
         fprintf(stdout,"nm_core_init returned err = %d\n", ret);
@@ -457,6 +458,7 @@
    MPIDI_PG_t *pg_p;
    int         index;
 
+   nm_core_disable_progression(mpid_nem_newmad_pcore);
    pg_p = MPIDI_Process.my_pg;
    for (index = 0; index < pg_p->size ; index++)
    {
@@ -487,14 +489,13 @@
 	 }
       }
    }
+   nm_core_enable_progression(mpid_nem_newmad_pcore);
    
    while((num_recv_req > 0) || (num_send_req > 0))
      nm_schedule(mpid_nem_newmad_pcore);
    MPIU_Free(init_reqs);
    
    nm_sr_monitor(mpid_nem_newmad_pcore, NM_SR_EVENT_RECV_UNEXPECTED,&MPID_nem_newmad_get_adi_msg);
-   nm_sr_monitor(mpid_nem_newmad_pcore, NM_SR_EVENT_RECV_COMPLETED, &MPID_nem_newmad_get_rreq);
-   nm_sr_monitor(mpid_nem_newmad_pcore, NM_SR_EVENT_SEND_COMPLETED, &MPID_nem_newmad_handle_sreq);
    
    return 0;
 }

Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_poll.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_poll.c	2009-10-27 09:18:02 UTC (rev 5573)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_poll.c	2009-10-27 09:18:47 UTC (rev 5574)
@@ -28,7 +28,8 @@
 	if(s){HASH_DELETE(hh, mpid_nem_nmad_asreqs, s); (_nmad_req) = s->nmad_req_ptr; } else {(_nmad_req) = NULL;} \
     }while(0)
 
-static int MPID_nem_newmad_handle_rreq(MPID_Request *req, nm_sr_request_t *nmad_request, nm_tag_t match_info, size_t size);
+static int  MPID_nem_newmad_handle_rreq(MPID_Request *req, nm_sr_request_t *nmad_request, nm_tag_t match_info, size_t size);
+static void MPID_nem_newmad_handle_sreq(MPID_Request *req);
 
 #undef FUNCNAME
 #define FUNCNAME MPID_nem_newmad_get_adi_msg
@@ -47,34 +48,32 @@
     NEM_NMAD_MATCH_GET_CTXT(match_info, ctxt);
     if(ctxt == NEM_NMAD_INTRA_CTXT)
     {
-	mpid_nem_newmad_p_gate_t from   = info->recv_unexpected.p_gate;
-	int                      length = info->recv_unexpected.len; 
-	MPID_Request *rreq;
-	void         *data;
-
-	rreq = MPID_Request_create();
-	MPIU_Assert (rreq != NULL);
-	MPIU_Object_set_ref (rreq, 1);
-	rreq->kind = MPID_REQUEST_RECV;   
-	rreq->ch.vc = nm_gate_ref_get(from);
-      
-	if(length <=  sizeof(MPIDI_CH3_PktGeneric_t)) {
-	    data = (void *)&(rreq->dev.pending_pkt);
+        MPID_nem_newmad_internal_req_t *rreq;
+	mpid_nem_newmad_p_gate_t        from   = info->recv_unexpected.p_gate;
+	int                             length = info->recv_unexpected.len; 
+	void                           *data;
+       
+        MPID_nem_newmad_internal_req_dequeue(&rreq);
+        rreq->kind = MPID_REQUEST_RECV;   
+        rreq->vc = nm_gate_ref_get(from);
+       
+        if(length <=  sizeof(MPIDI_CH3_PktGeneric_t)) 
+	{
+	  data = (char*)&(rreq->pending_pkt);
 	}
-	else{
-	    rreq->dev.tmpbuf = MPIU_Malloc(length);
-	    MPIU_Assert(rreq->dev.tmpbuf);
-	    rreq->dev.tmpbuf_sz = length;               
-	    data = (void *)(rreq->dev.tmpbuf);
-	}
+       else
+       {
+	  rreq->tmpbuf = MPIU_Malloc(length);
+	  MPIU_Assert(rreq->tmpbuf);
+	  rreq->tmpbuf_sz = length;                   
+	  data = (char*)(rreq->tmpbuf);
+       }
 	
-	nm_sr_irecv_with_ref(mpid_nem_newmad_pcore, from, match_info, data,length, 
-			     &(REQ_FIELD(rreq,newmad_req)),(void *)rreq);	
+       nm_sr_irecv_with_ref(mpid_nem_newmad_pcore, from, match_info, data,length, &(rreq->newmad_req),(void *)rreq);	
     }
     return;
 }
 
-
 #undef FUNCNAME
 #define FUNCNAME MPID_nem_newmad_directRecv
 #undef FCNAME
@@ -152,85 +151,116 @@
 
 
 #undef FUNCNAME
-#define FUNCNAME MPID_nem_newmad_get_rreq
+#define FUNCNAME MPID_nem_newmad_poll
 #undef FCNAME
 #define FCNAME MPIDI_QUOTE(FUNCNAME)
-void MPID_nem_newmad_get_rreq(nm_sr_event_t event, const nm_sr_event_info_t*info)
+int 
+MPID_nem_newmad_poll(int in_blocking_poll)
 {
-   nm_sr_request_t  *p_request = info->recv_completed.p_request;
-   MPID_Request     *req = NULL;
-   void             *ref;
-   nm_tag_t          match_info = 0;
-   MPIR_Context_id_t ctxt;
-   size_t            size;
-
-   nm_sr_get_size(mpid_nem_newmad_pcore, p_request, &size);
-   nm_sr_get_tag(mpid_nem_newmad_pcore, p_request, &match_info);
-   nm_sr_get_ref(mpid_nem_newmad_pcore, p_request, &ref);
-   req =  (MPID_Request *)ref;
-   MPIU_Assert(req != NULL);
-#ifdef DEBUG
-   fprintf(stdout,"========> Completing Recv req  %p (match is %lx) \n",req,match_info);
-#endif
-   NEM_NMAD_MATCH_GET_CTXT(match_info, ctxt);       
-   if(ctxt == NEM_NMAD_INTRA_CTXT)
+   nm_sr_request_t *p_request = NULL;
+   nm_tag_t         match_info = 0;
+   int mpi_errno = MPI_SUCCESS;   
+   
+   nm_sr_send_success(mpid_nem_newmad_pcore, &p_request);
+   if (p_request != NULL)
    {
-       if (req->kind == MPID_REQUEST_RECV)
-       {
-	   if (size <= sizeof(MPIDI_CH3_PktGeneric_t))
-	   {
-	       MPID_nem_handle_pkt(req->ch.vc,(char *)&(req->dev.pending_pkt),(MPIDI_msg_sz_t)(size));
-	   }
-	   else
-	   {
-	       MPID_nem_handle_pkt(req->ch.vc,(char *)(req->dev.tmpbuf),(MPIDI_msg_sz_t)(req->dev.tmpbuf_sz));
-	       MPIU_Free(req->dev.tmpbuf);
-	   }
-	   MPIDI_CH3_Request_destroy(req);
-       }
-       else
-       {
-	   MPIU_Assert(0);
-       }
+      MPID_nem_newmad_unified_req_t *ref = NULL;
+      MPID_Request                  *req = NULL;
+      MPID_Request_kind_t            kind;      
+      MPIR_Context_id_t ctxt;
+      
+      nm_sr_get_tag(mpid_nem_newmad_pcore,p_request, &match_info);
+      NEM_NMAD_MATCH_GET_CTXT(match_info, ctxt);
+            
+      nm_sr_get_ref(mpid_nem_newmad_pcore,p_request,(void *)&ref);
+      req = &(ref->mpi_req);
+      MPIU_Assert(req != NULL);
+      kind = req->kind;
+	
+      if(ctxt == NEM_NMAD_INTRA_CTXT)
+      {
+	 if ((kind == MPID_REQUEST_SEND) || (kind == MPID_PREQUEST_SEND))
+	 {
+	    MPID_nem_newmad_handle_sreq(req);	    
+	 }
+      }
+      else
+      {
+	 if ((kind == MPID_REQUEST_SEND) || (kind == MPID_PREQUEST_SEND))
+	 {
+	    MPIU_Assert(MPIDI_Request_get_type(req) != MPIDI_REQUEST_TYPE_GET_RESP);                  
+	    MPID_nem_newmad_handle_sreq(req);	    
+	 }
+      }   
    }
-   else
+   
+   nm_sr_recv_success(mpid_nem_newmad_pcore, &p_request);
+   if (p_request != NULL)
    {
-       if ((req->kind == MPID_REQUEST_RECV) || (req->kind == MPID_PREQUEST_RECV))
-       {
-	   int found = FALSE;
-	   nm_sr_request_t *nmad_request = NULL;	       
-	   MPIU_Assert(MPIDI_Request_get_type(req) != MPIDI_REQUEST_TYPE_GET_RESP);
-	   MPIU_THREAD_CS_ENTER(MSGQUEUE,req);
-	   MPID_NEM_NMAD_GET_REQ_FROM_HASH(req,nmad_request);
-	   found = MPIDI_CH3U_Recvq_DP(req);
-	   if(found){
+      MPID_nem_newmad_unified_req_t *ref = NULL;
+      MPID_Request                  *req = NULL;
+      MPID_Request_kind_t            kind;      
+      MPIR_Context_id_t              ctxt;
+      size_t                         size;
+            
+      nm_sr_get_ref(mpid_nem_newmad_pcore,p_request,(void *)&ref);
+      req = &(ref->mpi_req);
+      MPIU_Assert(req != NULL);
+      kind = req->kind;
+      nm_sr_get_size(mpid_nem_newmad_pcore, p_request, &size);
+      nm_sr_get_tag(mpid_nem_newmad_pcore,p_request, &match_info);
+      NEM_NMAD_MATCH_GET_CTXT(match_info, ctxt);
+	
+      if(ctxt == NEM_NMAD_INTRA_CTXT)
+      {
+	 MPID_nem_newmad_internal_req_t *adi_req = &(ref->nem_newmad_req);
+	 if (kind == MPID_REQUEST_RECV)
+	 {
+	    if (size <= sizeof(MPIDI_CH3_PktGeneric_t))
+	    {
+	       MPID_nem_handle_pkt(adi_req->vc,(char *)&(adi_req->pending_pkt),(MPIDI_msg_sz_t)(size));
+	    }
+	    else
+	    {
+	       MPID_nem_handle_pkt(adi_req->vc,(char *)(adi_req->tmpbuf),(MPIDI_msg_sz_t)(adi_req->tmpbuf_sz));
+	       MPIU_Free(adi_req->tmpbuf);
+	    }
+	    nm_core_disable_progression(mpid_nem_newmad_pcore);
+	    MPID_nem_newmad_internal_req_enqueue(adi_req);
+	    nm_core_enable_progression(mpid_nem_newmad_pcore);
+	 }
+	 else
+	 {
+	    MPIU_Assert(0);
+	 }	 
+      }
+      else
+      {
+	 if ((kind == MPID_REQUEST_RECV) || (kind == MPID_PREQUEST_RECV))
+	 {
+	    int found = FALSE;
+	    nm_sr_request_t *nmad_request = NULL;	       
+	    MPIU_Assert(MPIDI_Request_get_type(req) != MPIDI_REQUEST_TYPE_GET_RESP);
+	    MPIU_THREAD_CS_ENTER(MSGQUEUE,req);
+	    MPID_NEM_NMAD_GET_REQ_FROM_HASH(req,nmad_request);
+	    found = MPIDI_CH3U_Recvq_DP(req);
+	    if(found){
 	       MPID_nem_newmad_handle_rreq(req,nmad_request,match_info,size);
-	   }
-	   if(nmad_request != NULL)
-	   {
+	    }
+	    if(nmad_request != NULL)
+	    {
 	       MPIU_Assert(req->dev.match.parts.rank == MPI_ANY_SOURCE);
 	       MPIU_Free(nmad_request);
-	   }
-	   MPIU_THREAD_CS_EXIT(MSGQUEUE,req);
-       }
-       else
-       {
-	   MPIU_Assert(0);
-       }
+	    }
+	    MPIU_THREAD_CS_EXIT(MSGQUEUE,req);
+	 }
+	 else
+	 {
+	    MPIU_Assert(0);
+	 }
+      }   
    }
-}
 
-#undef FUNCNAME
-#define FUNCNAME MPID_nem_newmad_poll
-#undef FCNAME
-#define FCNAME MPIDI_QUOTE(FUNCNAME)
-int 
-MPID_nem_newmad_poll(int in_blocking_poll)
-{
-   int mpi_errno = MPI_SUCCESS;   
-
-   nm_schedule(mpid_nem_newmad_pcore);
-
  fn_exit:
    return mpi_errno;
  fn_fail:  ATTRIBUTE((unused))
@@ -242,27 +272,12 @@
 #undef FCNAME
 #define FCNAME MPIDI_QUOTE(FUNCNAME)
 void
-MPID_nem_newmad_handle_sreq(nm_sr_event_t event, const nm_sr_event_info_t*info)
+MPID_nem_newmad_handle_sreq(MPID_Request *req)
 {
-    nm_sr_request_t  *p_request = info->send_completed.p_request;
-    MPID_Request     *req;
-    nm_tag_t          match_info = 0;
-    MPIR_Context_id_t ctxt;
-    void             *ref; 
     int (*reqFn)(MPIDI_VC_t *, MPID_Request *, int *);
-   
-    nm_sr_get_tag(mpid_nem_newmad_pcore,p_request, &match_info);
-    nm_sr_get_ref(mpid_nem_newmad_pcore,p_request,&ref);
-    req = (MPID_Request *)ref;
-    MPIU_Assert(req != NULL);
 #ifdef DEBUG
     fprintf(stdout,"========> Completing Send req  %p (match is %lx) \n",req,match_info);
 #endif
-    NEM_NMAD_MATCH_GET_CTXT(match_info, ctxt);
-    if(ctxt != NEM_NMAD_INTRA_CTXT)
-    {
-	MPIU_Assert(MPIDI_Request_get_type(req) != MPIDI_REQUEST_TYPE_GET_RESP);                  
-    }
     reqFn = req->dev.OnDataAvail;
     if (!reqFn){
 	MPIDI_CH3U_Request_complete(req);
@@ -272,10 +287,9 @@
 	MPIDI_VC_t *vc = req->ch.vc;
 	int complete   = 0;
 	reqFn(vc, req, &complete);
-	if(complete)
-        {            
-	    MPIDI_CH3U_Request_complete(req);
-	    MPIU_DBG_MSG(CH3_CHANNEL, VERBOSE, ".... complete");
+	if(!complete)
+        {   
+	   MPIU_Assert(complete == TRUE);
 	}
     }
     mpid_nem_newmad_pending_send_req--;
@@ -297,6 +311,10 @@
     MPIDI_msg_sz_t data_sz;
     MPIDI_VC_t    *vc = NULL;
 
+#ifdef DEBUG
+   fprintf(stdout,"========> Completing Recv req  %p (match is %lx) \n",req,match_info);
+#endif
+   
     if (req->dev.match.parts.rank == MPI_ANY_SOURCE)
     {
 	mpid_nem_newmad_p_gate_t source;



More information about the mpich2-commits mailing list