[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