[mpich2-commits] r4198 - mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad
mercierg at mcs.anl.gov
mercierg at mcs.anl.gov
Thu Mar 26 10:16:26 CDT 2009
Author: mercierg
Date: 2009-03-26 10:16:25 -0500 (Thu, 26 Mar 2009)
New Revision: 4198
Added:
mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_cancel.c
mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_probe.c
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
mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_send.c
Log:
New version of the newmad module
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-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/Makefile.sm 2009-03-26 15:16:25 UTC (rev 4198)
@@ -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_register.c newmad_test.c newmad_cancel.c newmad_probe.c
Added: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_cancel.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_cancel.c (rev 0)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_cancel.c 2009-03-26 15:16:25 UTC (rev 4198)
@@ -0,0 +1,66 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ * (C) 2006 by Argonne National Laboratory.
+ * See COPYRIGHT in top-level directory.
+ */
+
+#include "newmad_impl.h"
+#include "my_papi_defs.h"
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_mx_cancel_send
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_newmad_cancel_send(MPIDI_VC_t *vc, MPID_Request *sreq)
+{
+ nm_sr_request_t *nmad_req = NULL;
+ int mpi_errno = MPI_SUCCESS;
+ int ret;
+
+ nmad_req = &(REQ_FIELD(sreq,newmad_req));
+ ret = nm_sr_scancel(mpid_nem_newmad_pcore,nmad_req);
+
+ if (ret == NM_ESUCCESS)
+ {
+ sreq->status.cancelled = TRUE;
+ mpid_nem_newmad_pending_send_req--;
+ }
+ else
+ {
+ sreq->status.cancelled = FALSE;
+ }
+
+ fn_exit:
+ return mpi_errno;
+ fn_fail: ATTRIBUTE((unused))
+ goto fn_exit;
+}
+
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_newmad_cancel_recv
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_newmad_cancel_recv(MPIDI_VC_t *vc, MPID_Request *rreq)
+{
+ nm_sr_request_t *nmad_req = NULL;
+ int mpi_errno = MPI_SUCCESS;
+ int ret;
+
+ nmad_req = &(REQ_FIELD(rreq,newmad_req));
+ ret = nm_sr_rcancel(mpid_nem_newmad_pcore,nmad_req);
+
+ if (ret == NM_ESUCCESS)
+ {
+ rreq->status.cancelled = TRUE;
+ }
+ else
+ {
+ rreq->status.cancelled = FALSE;
+ }
+
+ fn_exit:
+ return mpi_errno;
+ fn_fail: ATTRIBUTE((unused))
+ goto fn_exit;
+}
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-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_finalize.c 2009-03-26 15:16:25 UTC (rev 4198)
@@ -18,7 +18,7 @@
fn_exit:
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
@@ -32,7 +32,7 @@
int mpi_errno = MPI_SUCCESS;
fn_exit:
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
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-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_impl.h 2009-03-26 15:16:25 UTC (rev 4198)
@@ -6,7 +6,6 @@
#ifndef NEWMAD_MODULE_IMPL_H
#define NEWMAD_MODULE_IMPL_H
-//#include <linux/types.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdint.h>
@@ -45,15 +44,17 @@
int MPID_nem_newmad_directRecv(MPIDI_VC_t *vc, MPID_Request *rreq);
int MPID_nem_newmad_cancel_send(MPIDI_VC_t *vc, MPID_Request *sreq);
int MPID_nem_newmad_cancel_recv(MPIDI_VC_t *vc, MPID_Request *rreq);
-
+int MPID_nem_newmad_probe(MPIDI_VC_t *vc, int source, int tag, MPID_Comm *comm,
+ int context_offset, MPI_Status *status);
+int MPID_nem_newmad_iprobe(MPIDI_VC_t *vc, int source, int tag, MPID_Comm *comm,
+ int context_offset, int *flag, MPI_Status *status);
/* Any source management */
-int MPID_nem_newmad_anysource_posted(MPID_Request *rreq);
+void MPID_nem_newmad_anysource_posted(MPID_Request *rreq);
int MPID_nem_newmad_anysource_matched(MPID_Request *rreq);
/* Callbacks for events */
-void MPID_nem_newmad_get_adi_msg(nm_sr_event_t event, nm_sr_event_info_t*info);
-void MPID_nem_newmad_handle_sreq(nm_sr_event_t event, nm_sr_event_info_t*info);
-void MPID_nem_newmad_handle_rreq(nm_sr_event_t event, nm_sr_event_info_t*info);
+void MPID_nem_newmad_get_adi_msg(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);
/* Dtype management */
int MPID_nem_newmad_process_sdtype(MPID_Request **sreq_p, MPI_Datatype datatype, MPID_Datatype * dt_ptr, const void *buf,
@@ -64,16 +65,15 @@
/* Connection management*/
int MPID_nem_newmad_send_conn_info (MPIDI_VC_t *vc);
-#define MPID_NEM_NMAD_MAX_STRING_SIZE ((MPID_NEM_MAX_NETMOD_STRING_LEN)/2)
-#define MPID_NEM_NMAD_MAX_NETS 4
+#define MPID_NEM_NMAD_MAX_NETS 3
+#define MY_SIZE (MPID_NEM_MAX_NETMOD_STRING_LEN/2)
+typedef nm_gate_t mpid_nem_newmad_p_gate_t;
-typedef nm_gate_id_t mpid_nem_newmad_p_gate_t;
-
typedef struct MPID_nem_newmad_vc_area_internal
{
- char hostname[MPID_NEM_NMAD_MAX_STRING_SIZE];
- char url[MPID_NEM_NMAD_MAX_NETS][MPID_NEM_NMAD_MAX_STRING_SIZE];
- uint8_t drv_id[MPID_NEM_NMAD_MAX_NETS];
+ char hostname[MY_SIZE];
+ char url[MPID_NEM_NMAD_MAX_NETS][MY_SIZE];
+ uint8_t drv_id[MPID_NEM_NMAD_MAX_NETS];
mpid_nem_newmad_p_gate_t p_gate;
} MPID_nem_newmad_vc_area_internal_t;
@@ -164,9 +164,10 @@
#define NEM_NMAD_DIRECT_MATCH(_match,_tag,_rank,_context) NEM_NMAD_SET_MATCH(_match,_tag,_rank,_context)
#define NEM_NMAD_ADI_MATCH(_match) NEM_NMAD_SET_MATCH(_match,0,0,NEM_NMAD_INTRA_CTXT)
-extern nm_core_t mpid_nem_newmad_pcore;
-extern mpid_nem_newmad_p_gate_t *mpid_nem_newmad_gate_to_rank;
-extern int mpid_nem_newmad_pending_send_req;
+extern nm_core_t mpid_nem_newmad_pcore;
+extern int mpid_nem_newmad_pending_send_req;
+#define NMAD_IOV_MAX_DEPTH 15 /* NM_SO_PREALLOC_IOV_LEN */
+
#endif //NEWMAD_MODULE_IMPL_H
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-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_init.c 2009-03-26 15:16:25 UTC (rev 4198)
@@ -39,21 +39,21 @@
NULL, /* startall */
MPID_nem_newmad_cancel_send,/* cancel_send */
- MPID_nem_newmad_cancel_recv /* cancel_recv */
+ MPID_nem_newmad_cancel_recv, /* cancel_recv */
+
+ MPID_nem_newmad_probe, /* probe */
+ MPID_nem_newmad_iprobe /* iprobe */
};
-//typedef int (*nm_driver_load)(struct nm_drv_ops*);
static int mpid_nem_newmad_myrank;
static nm_drv_id_t drv_id[MPID_NEM_NMAD_MAX_NETS];
static char *url[MPID_NEM_NMAD_MAX_NETS];
-static char url_keys[MPID_NEM_NMAD_MAX_NETS][MPID_NEM_NMAD_MAX_STRING_SIZE] = {"url_id0","url_id1","url_id2","url_id3"};
+static char url_keys[MPID_NEM_NMAD_MAX_NETS][MPID_NEM_MAX_NETMOD_STRING_LEN] = {"url_id0","url_id1","url_id2","url_id3"};
static int mpid_nem_newmad_num_rails = 1 ;
nm_core_t mpid_nem_newmad_pcore;
int mpid_nem_newmad_pending_send_req = 0;
-mpid_nem_newmad_p_gate_t *mpid_nem_newmad_gate_to_rank = NULL;
-
#ifdef MPID_MAD_MODULE_MULTIRAIL
static puk_component_t *p_driver_load_array;
static void mpid_nem_newmad_rails(void)
@@ -75,6 +75,7 @@
#if defined CONFIG_TCP
mpid_nem_newmad_num_rails++;
#endif
+ MPIU_Assert(mpid_nem_newmad_num_rails <= MPID_NEM_NMAD_MAX_NETS);
p_driver_load_array = (puk_component_t *)MPIU_Malloc( mpid_nem_newmad_num_rails*sizeof(puk_component_t));
@@ -94,7 +95,7 @@
p_driver_load_array[index++] = nm_core_component_load("driver", "tcp");
#endif
}
-#else //MPID_MAD_MODULE_MULTIRAIL
+#else /* MPID_MAD_MODULE_MULTIRAIL */
static puk_component_t p_driver_load;
static void mpid_nem_newmad_rails(void)
{
@@ -110,7 +111,7 @@
p_driver_load = nm_core_component_load("driver", "tcp");
# endif
}
-#endif //MULTIRAIL
+#endif /* MULTIRAIL */
#undef FUNCNAME
@@ -123,8 +124,8 @@
#ifdef CONFIG_TCP
#ifndef MPID_MAD_MODULE_MULTIRAIL
char hostname[16];
-#endif //TCP
-#endif //MPID_MAD_MODULE_MULTIRAIL
+#endif /* TCP */
+#endif /* MPID_MAD_MODULE_MULTIRAIL */
#endif
int index = 0;
int ret;
@@ -140,7 +141,7 @@
mpid_nem_newmad_rails();
#ifdef MPID_MAD_MODULE_MULTIRAIL
fprintf(stdout,"Number of rails : %i\n",nem_mad_num_rail);
-#endif //MPID_MAD_MODULE_MULTIRAIL
+#endif /* MPID_MAD_MODULE_MULTIRAIL */
ret = nm_sr_init(mpid_nem_newmad_pcore);
if(ret != NM_ESUCCESS) {
@@ -150,10 +151,10 @@
#warning "========== MAD MODULE MULTIRAIL CODE ENABLED ============="
ret = nm_core_driver_load_init_some(mpid_nem_newmad_pcore, mpid_nem_newmad_num_rails,
p_driver_load_array, drv_id, url);
-#else //MPID_MAD_MODULE_MULTIRAIL
+#else /* MPID_MAD_MODULE_MULTIRAIL */
ret = nm_core_driver_load_init(mpid_nem_newmad_pcore,
p_driver_load, &drv_id[0], &url[0]);
-#endif //MPID_MAD_MODULE_MULTIRAIL
+#endif /* MPID_MAD_MODULE_MULTIRAIL */
if (ret != NM_ESUCCESS) {
fprintf(stdout,"nm_core_driver_init(some) returned ret = %d\n", ret);
}
@@ -168,15 +169,15 @@
url[0] = (char *)MPIU_Malloc(strlen(hostname)+1);
strcpy(url[0],hostname);
}
-#endif //!MULTIRAIL
-#endif // TCP
+#endif /* !MULTIRAIL */
+#endif /* TCP */
#endif
nm_ns_init(mpid_nem_newmad_pcore);
-
+
fn_exit:
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
@@ -219,7 +220,7 @@
int index;
fprintf(stdout,"Size of MPID_nem_mad_module_vc_area_internal_t : %i | size of nm_sr_request_t :%i | Size of req_area : %i\n",
- sizeof(MPID_nem_newmad_vc_area_internal_t),sizeof(nm_sr_request_t), sizeof(MPID_nem_newmad_req_area));
+ sizeof(MPID_nem_newmad_vc_area_internal_t),sizeof(nm_sr_request_t), sizeof(MPID_nem_newmad_req_area));
MPIU_Assert( sizeof(MPID_nem_newmad_vc_area_internal_t) <= MPID_NEM_VC_NETMOD_AREA_LEN);
MPIU_Assert( sizeof(MPID_nem_newmad_req_area) <= MPID_NEM_REQ_NETMOD_AREA_LEN);
@@ -232,12 +233,11 @@
init_mad(pg_p);
- mpi_errno = MPID_nem_mad_module_get_business_card (pg_rank,bc_val_p, val_max_sz_p);
+ mpi_errno = MPID_nem_newmad_get_business_card(pg_rank,bc_val_p, val_max_sz_p);
if (mpi_errno) MPIU_ERR_POP (mpi_errno);
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_SEND_COMPLETED, &MPID_nem_newmad_handle_sreq);
- //nm_sr_monitor(mpid_nem_newmad_pcore, NM_SR_EVENT_RECV_COMPLETED, &MPID_nem_newmad_handle_rreq);
mpi_errno = MPIDI_CH3I_Register_anysource_notification(MPID_nem_newmad_anysource_posted,
MPID_nem_newmad_anysource_matched);
@@ -245,7 +245,7 @@
fn_exit:
return mpi_errno;
- fn_fail:
+ fn_fail:
goto fn_exit;
}
@@ -341,10 +341,38 @@
int
MPID_nem_newmad_vc_init (MPIDI_VC_t *vc)
{
- int mpi_errno = MPI_SUCCESS;
- MPIDI_CH3I_VC *vc_ch = (MPIDI_CH3I_VC *)vc->channel_private;
+ MPIDI_CH3I_VC *vc_ch = (MPIDI_CH3I_VC *)vc->channel_private;
+ char business_card[MPID_NEM_MAX_NETMOD_STRING_LEN];
+ int mpi_errno = MPI_SUCCESS;
+ int ret;
+ int index;
+ mpi_errno = vc->pg->getConnInfo(vc->pg_rank, business_card, MPID_NEM_MAX_NETMOD_STRING_LEN, vc->pg);
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+
+ (((MPID_nem_newmad_vc_area *)((MPIDI_CH3I_VC *)(vc)->channel_private)->netmod_area.padding)->area) =
+ (MPID_nem_newmad_vc_area_internal_t *)MPIU_Malloc(sizeof(MPID_nem_newmad_vc_area_internal_t));
+
+ MPIU_Assert( (((MPID_nem_newmad_vc_area *)((MPIDI_CH3I_VC *)(vc)->channel_private)->netmod_area.padding)->area) != NULL);
+
+ ret = nm_core_gate_init(mpid_nem_newmad_pcore, &(VC_FIELD(vc, p_gate)));
+ if (ret != NM_ESUCCESS) fprintf(stdout,"nm_core_gate_init returned ret = %d\n", ret);
+ nm_gate_ref_set(VC_FIELD(vc, p_gate),(void*)vc);
+ for(index = 0 ; index < mpid_nem_newmad_num_rails ; index ++)
+ {
+ mpi_errno = MPID_nem_newmad_get_from_bc (business_card, VC_FIELD(vc, hostname), VC_FIELD(vc, url[index]), index);
+ if (mpi_errno) MPIU_ERR_POP (mpi_errno);
+
+ VC_FIELD(vc, drv_id[index]) = drv_id[index];
+
+ if (vc->lpid > mpid_nem_newmad_myrank){
+ ret = nm_core_gate_accept(mpid_nem_newmad_pcore,VC_FIELD(vc, p_gate), drv_id[index], NULL);
+ }
+ else if (vc->lpid < mpid_nem_newmad_myrank){
+ ret = nm_core_gate_connect(mpid_nem_newmad_pcore,VC_FIELD(vc, p_gate), drv_id[index], VC_FIELD(vc, url[index]));
+ }
+ }
vc->eager_max_msg_sz = 32768;
vc->rndvSend_fn = NULL;
@@ -368,6 +396,8 @@
{
int mpi_errno = MPI_SUCCESS;
+ MPIU_Free((((MPID_nem_newmad_vc_area *)((MPIDI_CH3I_VC *)(vc)->channel_private)->netmod_area.padding)->area));
+
fn_exit:
return mpi_errno;
fn_fail:
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-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_poll.c 2009-03-26 15:16:25 UTC (rev 4198)
@@ -6,7 +6,7 @@
#include "newmad_impl.h"
#include "my_papi_defs.h"
-#include "uthash.h"
+#include "../mx/uthash.h"
typedef struct mpid_nem_nmad_hash_struct {
MPID_Request *mpid_req_ptr;
@@ -28,48 +28,43 @@
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);
-
-
#undef FUNCNAME
#define FUNCNAME MPID_nem_newmad_get_adi_msg
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
-void MPID_nem_newmad_get_adi_msg(nm_sr_event_t event, nm_sr_event_info_t*info)
+void
+MPID_nem_newmad_get_adi_msg(nm_sr_event_t event, const nm_sr_event_info_t*info)
{
nm_tag_t match_info = info->recv_unexpected.tag;
MPIR_Context_id_t ctxt;
NEM_NMAD_MATCH_GET_CTXT(match_info, ctxt);
if(ctxt == NEM_NMAD_INTRA_CTXT)
{
- nm_gate_t from = info->recv_unexpected.p_gate;
+ mpid_nem_newmad_p_gate_t from = info->recv_unexpected.p_gate;
+ int length = info->recv_unexpected.len;
MPID_Request *rreq;
- MPIDI_VC_t *vc;
- struct iovec mad_iov;
- int num_iov = 1;
- int length = 0; //=info->...
+ void *data;
rreq = MPID_Request_create();
MPIU_Assert (rreq != NULL);
MPIU_Object_set_ref (rreq, 1);
rreq->kind = MPID_REQUEST_RECV;
-
- //get vc from gate
- rreq->ch.vc = vc;
+ rreq->ch.vc = nm_gate_ref_get(from);
if(length <= sizeof(MPIDI_CH3_PktGeneric_t)) {
- mad_iov.iov_base = (char*)&(rreq->dev.pending_pkt);
+ data = (void *)&(rreq->dev.pending_pkt);
}
else{
rreq->dev.tmpbuf = MPIU_Malloc(length);
MPIU_Assert(rreq->dev.tmpbuf);
rreq->dev.tmpbuf_sz = length;
- mad_iov.iov_base = (char*)(rreq->dev.tmpbuf);
+ data = (void *)(rreq->dev.tmpbuf);
}
- mad_iov.iov_len = length;
- nm_sr_irecv_with_ref(mpid_nem_newmad_pcore, from, match_info, mad_iov.iov_base,
- length, &(REQ_FIELD(rreq,newmad_req)), (void *)&rreq);
+ nm_sr_irecv_with_ref(mpid_nem_newmad_pcore, from, match_info, data,length,
+ &(REQ_FIELD(rreq,newmad_req)),(void *)rreq);
}
return;
}
@@ -84,35 +79,163 @@
MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_NEWMAD_DIRECTRECV);
MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_NEWMAD_DIRECTRECV);
+ if (!((MPIDI_CH3I_VC *)vc->channel_private)->is_local)
+ {
+ nm_tag_t match_info = 0;
+ MPIR_Rank_t source = rreq->dev.match.parts.rank;
+ MPIR_Context_id_t context = rreq->dev.match.parts.context_id;
+ Nmad_Nem_tag_t tag = rreq->dev.match.parts.tag;
+ int ret;
+ int num_seg = 1;
+ MPIDI_msg_sz_t data_sz;
+ int dt_contig;
+ MPI_Aint dt_true_lb;
+ MPID_Datatype *dt_ptr;
+ struct iovec newmad_iov[NMAD_IOV_MAX_DEPTH];
+
+ NEM_NMAD_DIRECT_MATCH(match_info,0,source,context);
+ if (tag != MPI_ANY_TAG)
+ {
+ NEM_NMAD_SET_TAG(match_info,tag);
+ }
+ else
+ {
+ MPIU_Assert(0);
+ }
+
+ MPIDI_Datatype_get_info(rreq->dev.user_count,rreq->dev.datatype, dt_contig, data_sz, dt_ptr,dt_true_lb);
+ rreq->dev.OnDataAvail = NULL;
+
+ if (dt_contig)
+ {
+ newmad_iov[0].iov_base = (char*)(rreq->dev.user_buf) + dt_true_lb;
+ newmad_iov[0].iov_len = data_sz;
+ }
+ else
+ {
+ struct iovec *newmad_iov_ptr = &(newmad_iov[0]);
+ MPID_nem_newmad_process_rdtype(&rreq,dt_ptr,data_sz,&newmad_iov_ptr,&num_seg);
+ }
+
+ MPIU_Assert(num_seg <= NMAD_IOV_MAX_DEPTH);
-
-
-
+ ret = nm_sr_irecv_iov_with_ref(mpid_nem_newmad_pcore,VC_FIELD(vc,p_gate),match_info,
+ newmad_iov,num_seg,&(REQ_FIELD(rreq,newmad_req)),(void*)rreq);
+ }
+
fn_exit:
MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_DIRECTRECV);
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
#undef FUNCNAME
-#define FUNCNAME MPID_nem_newmad_poll
+#define FUNCNAME MPID_nem_newmad_poll_recv
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
-int
-MPID_nem_newmad_poll(MPID_nem_poll_dir_t in_or_out)
+static int
+MPID_nem_newmad_poll_recv(void)
{
int mpi_errno = MPI_SUCCESS;
nm_sr_request_t *p_out_req = NULL;
- MPID_Request *rreq = NULL;
+ MPID_Request *req = NULL;
+ int ret;
- // nm_sr_progress(mpid_nem_newmad_pcore);
- nm_sr_recv_success(mpid_nem_newmad_pcore, &p_out_req);
+ ret = nm_sr_recv_success(mpid_nem_newmad_pcore, &p_out_req);
+ if (p_out_req != NULL)
+ {
+ nm_tag_t match_info = 0;
+ MPIR_Context_id_t ctxt;
+ size_t size;
+ MPID_Request *req;
+ void *ref;
+ nm_sr_get_size(mpid_nem_newmad_pcore, p_out_req, &size);
+ nm_sr_get_tag(mpid_nem_newmad_pcore, p_out_req, &match_info);
+ nm_sr_get_ref(mpid_nem_newmad_pcore,p_out_req,&ref);
+ req = (MPID_Request *)ref;
+ MPIU_Assert(req != NULL);
+ NEM_NMAD_MATCH_GET_CTXT(match_info, ctxt);
+ if(ctxt == NEM_NMAD_INTRA_CTXT)
+ {
+ 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);
+ }
+ }
+ else
+ {
+ 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_handle_rreq(req,nmad_request,match_info,size);
+ }
+ 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);
+ }
+ }
+ }
+ fn_exit:
+ return mpi_errno;
+ fn_fail: ATTRIBUTE((unused))
+ goto fn_exit;
+}
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_newmad_poll
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int
+MPID_nem_newmad_poll(MPID_nem_poll_dir_t in_or_out)
+{
+ int mpi_errno = MPI_SUCCESS;
+
+ MPID_nem_newmad_poll_recv();
+
+ /*
+ if (in_or_out)
+ {
+ MPID_nem_newmad_poll_recv();
+ MPID_nem_newmad_poll_send();
+ }
+ else
+ {
+ MPID_nem_newmad_poll_send();
+ MPID_nem_newmad_poll_recv();
+ }
+ */
+
fn_exit:
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
@@ -121,14 +244,25 @@
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
void
-MPID_nem_newmad_handle_sreq(nm_sr_event_t event, nm_sr_event_info_t*info)
+MPID_nem_newmad_handle_sreq(nm_sr_event_t event, const nm_sr_event_info_t*info)
{
+ 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);
- int (*reqFn)(MPIDI_VC_t *, MPID_Request *, int *);
- nm_sr_request_t *p_request = info->send_completed.p_request;
- MPID_Request *req;
- nm_sr_get_ref(mpid_nem_newmad_pcore,p_request,(void *)&req);
- MPIU_Assert(MPIDI_Request_get_type(req) != MPIDI_REQUEST_TYPE_GET_RESP);
+ 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);
@@ -145,23 +279,136 @@
}
}
mpid_nem_newmad_pending_send_req--;
- return;
}
#undef FUNCNAME
+#define FUNCNAME MPID_nem_new_handle_rreq
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+static int
+MPID_nem_newmad_handle_rreq(MPID_Request *req, nm_sr_request_t *nmad_request, nm_tag_t match_info, size_t size)
+{
+ int mpi_errno = MPI_SUCCESS;
+ int complete = FALSE;
+ int dt_contig;
+ MPI_Aint dt_true_lb;
+ MPIDI_msg_sz_t userbuf_sz;
+ MPID_Datatype *dt_ptr;
+ MPIDI_msg_sz_t data_sz;
+ MPIDI_VC_t *vc = NULL;
+
+ if (req->dev.match.parts.rank == MPI_ANY_SOURCE)
+ {
+ mpid_nem_newmad_p_gate_t source;
+ MPIU_Assert(nmad_request != NULL);
+ nm_sr_recv_source(mpid_nem_newmad_pcore,nmad_request,&source);
+ vc = nm_gate_ref_get(source);
+ req->status.MPI_SOURCE = vc->lpid;
+ }
+ else
+ NEM_NMAD_MATCH_GET_RANK(match_info,req->status.MPI_SOURCE);
+
+ NEM_NMAD_MATCH_GET_TAG(match_info,req->status.MPI_TAG);
+ req->status.count = size;
+ req->dev.recv_data_sz = size;
+
+ MPIDI_Datatype_get_info(req->dev.user_count, req->dev.datatype, dt_contig, userbuf_sz, dt_ptr, dt_true_lb);
+
+ if (size <= userbuf_sz) {
+ data_sz = req->dev.recv_data_sz;
+ }
+ else
+ {
+ MPIU_DBG_MSG_FMT(CH3_OTHER,VERBOSE,(MPIU_DBG_FDEST,
+ "receive buffer too small; message truncated, msg_sz="
+ MPIDI_MSG_SZ_FMT ", userbuf_sz="
+ MPIDI_MSG_SZ_FMT,
+ req->dev.recv_data_sz, userbuf_sz));
+ req->status.MPI_ERROR = MPIR_Err_create_code(MPI_SUCCESS,
+ MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_TRUNCATE,
+ "**truncate", "**truncate %d %d %d %d",
+ req->status.MPI_SOURCE, req->status.MPI_TAG,
+ req->dev.recv_data_sz, userbuf_sz );
+ req->status.count = userbuf_sz;
+ data_sz = userbuf_sz;
+ }
+
+ if ((!dt_contig)&&(req->dev.tmpbuf != NULL))
+ {
+ MPIDI_msg_sz_t last;
+ last = req->dev.recv_data_sz;
+ MPID_Segment_unpack( req->dev.segment_ptr, 0, &last, req->dev.tmpbuf);
+ MPIU_Free(req->dev.tmpbuf);
+ if (last != data_sz) {
+ req->status.count = (int)last;
+ if (req->dev.recv_data_sz <= userbuf_sz) {
+ MPIU_ERR_SETSIMPLE(req->status.MPI_ERROR,MPI_ERR_TYPE,"**dtypemismatch");
+ }
+ }
+ }
+
+ MPIDI_Comm_get_vc(req->comm, req->status.MPI_SOURCE, &vc);
+ MPIDI_CH3U_Handle_recv_req(vc, req, &complete);
+ MPIU_Assert(complete == TRUE);
+ fn_exit:
+ return mpi_errno;
+ fn_fail: ATTRIBUTE((unused))
+ goto fn_exit;
+}
+
+
+
+#undef FUNCNAME
#define FUNCNAME MPID_nem_newmad_anysource_posted
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
-int MPID_nem_newmad_anysource_posted(MPID_Request *rreq)
+void MPID_nem_newmad_anysource_posted(MPID_Request *rreq)
{
/* This function is called whenever an anyource request has been
posted to the posted receive queue. */
- int mpi_errno = MPI_SUCCESS;
+ MPIR_Context_id_t context;
+ Nmad_Nem_tag_t tag;
+ nm_tag_t match_info = 0;
+ nm_sr_request_t *newmad_req= MPIU_Malloc(sizeof(nm_sr_request_t));
+ int num_seg = 1;
+ int ret;
+ MPIDI_msg_sz_t data_sz;
+ int dt_contig;
+ MPI_Aint dt_true_lb;
+ MPID_Datatype *dt_ptr;
+ struct iovec newmad_iov[NMAD_IOV_MAX_DEPTH];
+
+ MPIDI_Datatype_get_info(rreq->dev.user_count,rreq->dev.datatype, dt_contig, data_sz, dt_ptr,dt_true_lb);
- fn_exit:
- return mpi_errno;
- fn_fail:
- goto fn_exit;
+ tag = rreq->dev.match.parts.tag;
+ context = rreq->dev.match.parts.context_id;
+ NEM_NMAD_DIRECT_MATCH(match_info,0,0,context);
+ if (tag != MPI_ANY_TAG)
+ {
+ NEM_NMAD_SET_TAG(match_info,tag);
+ }
+ else
+ {
+ MPIU_Assert(0);
+ }
+
+ MPIDI_Datatype_get_info(rreq->dev.user_count,rreq->dev.datatype, dt_contig, data_sz, dt_ptr,dt_true_lb);
+ rreq->dev.OnDataAvail = NULL;
+
+ if (dt_contig)
+ {
+ newmad_iov[0].iov_base = (char*)(rreq->dev.user_buf) + dt_true_lb;
+ newmad_iov[0].iov_len = data_sz;
+ }
+ else
+ {
+ struct iovec *newmad_iov_ptr = &(newmad_iov[0]);
+ MPID_nem_newmad_process_rdtype(&rreq,dt_ptr,data_sz,&newmad_iov_ptr,&num_seg);
+ }
+
+ ret = nm_sr_irecv_iov_with_ref(mpid_nem_newmad_pcore,NM_ANY_GATE,match_info,
+ newmad_iov,num_seg,newmad_req,(void*)rreq);
+ MPID_MEM_NMAD_ADD_REQ_IN_HASH(rreq,newmad_req);
}
#undef FUNCNAME
@@ -172,11 +419,94 @@
{
/* This function is called when an anysource request in the posted
receive queue is matched and dequeued */
- int mpi_errno = MPI_SUCCESS;
+ nm_sr_request_t *nmad_request = NULL;
+ int ret;
+ int matched = FALSE;
+ MPID_NEM_NMAD_GET_REQ_FROM_HASH(rreq,nmad_request);
+ if(nmad_request != NULL)
+ {
+ ret = nm_sr_rcancel(mpid_nem_newmad_pcore,nmad_request);
+ if (ret == NM_ESUCCESS)
+ {
+ size_t size;
+ nm_tag_t match_info;
+ MPIU_Assert(MPIDI_Request_get_type(rreq) != MPIDI_REQUEST_TYPE_GET_RESP);
+ ret = nm_sr_rwait(mpid_nem_newmad_pcore,nmad_request);
+ MPIU_Assert(ret == NM_ESUCCESS);
+ nm_sr_get_tag(mpid_nem_newmad_pcore,nmad_request,&match_info);
+ nm_sr_get_size(mpid_nem_newmad_pcore,nmad_request,&size);
+ MPID_nem_newmad_handle_rreq(rreq, nmad_request,match_info, size);
+ matched = TRUE;
+ }
+ else
+ {
+ MPID_Segment_free(rreq->dev.segment_ptr);
+ }
+ MPIU_Free(nmad_request);
+ }
+ return matched;
+}
+
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_newmad_process_rdtype
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_newmad_process_rdtype(MPID_Request **rreq_p, MPID_Datatype * dt_ptr, MPIDI_msg_sz_t data_sz, struct iovec *newmad_iov[], int *num_iov)
+{
+ MPID_Request *rreq =*rreq_p;
+ MPIDI_msg_sz_t last;
+ MPID_IOV *iov;
+ int iov_num_ub = rreq->dev.user_count * dt_ptr->max_contig_blocks;
+ int n_iov = iov_num_ub;
+ int mpi_errno = MPI_SUCCESS;
+ int index;
+
+ MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_RDTYPE);
+ MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_RDTYPE);
+
+ if (rreq->dev.segment_ptr == NULL)
+ {
+ rreq->dev.segment_ptr = MPID_Segment_alloc( );
+ MPIU_ERR_CHKANDJUMP1((rreq->dev.segment_ptr == NULL), mpi_errno, MPI_ERR_OTHER, "**nomem", "**nomem %s", "MPID_Segment_alloc");
+ }
+ MPID_Segment_init(rreq->dev.user_buf, rreq->dev.user_count, rreq->dev.datatype, rreq->dev.segment_ptr, 0);
+ rreq->dev.segment_first = 0;
+ rreq->dev.segment_size = data_sz;
+ last = rreq->dev.segment_size;
+ iov = MPIU_Malloc(iov_num_ub*sizeof(MPID_IOV));
+ MPID_Segment_unpack_vector(rreq->dev.segment_ptr, rreq->dev.segment_first, &last,iov, &n_iov);
+ MPIU_Assert(last == rreq->dev.segment_size);
+
+ if(n_iov <= NMAD_IOV_MAX_DEPTH)
+ {
+ for(index=0; index < n_iov ; index++)
+ {
+ (*newmad_iov)[index].iov_base = iov[index].MPID_IOV_BUF;
+ (*newmad_iov)[index].iov_len = iov[index].MPID_IOV_LEN;
+ }
+ rreq->dev.tmpbuf = NULL;
+ *num_iov = n_iov;
+ }
+ else
+ {
+ int packsize = 0;
+ NMPI_Pack_size(rreq->dev.user_count, rreq->dev.datatype, rreq->comm->handle, &packsize);
+ rreq->dev.tmpbuf = MPIU_Malloc((size_t) packsize);
+ MPIU_Assert(rreq->dev.tmpbuf);
+ rreq->dev.tmpbuf_sz = packsize;
+ (*newmad_iov)[0].iov_base = (char *) rreq->dev.tmpbuf;
+ (*newmad_iov)[0].iov_len = (uint32_t) packsize;
+ *num_iov = 1 ;
+ }
+ MPIU_Free(iov);
fn_exit:
+ MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_RDTYPE);
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
+
+
Added: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_probe.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_probe.c (rev 0)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_probe.c 2009-03-26 15:16:25 UTC (rev 4198)
@@ -0,0 +1,90 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ * (C) 2006 by Argonne National Laboratory.
+ * See COPYRIGHT in top-level directory.
+ */
+
+#include "newmad_impl.h"
+#include "my_papi_defs.h"
+
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_newmad_probe
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_newmad_probe(MPIDI_VC_t *vc, int source, int tag, MPID_Comm *comm, int context_offset, MPI_Status *status)
+{
+ nm_tag_t match_info = 0;
+ nm_gate_t out_gate;
+ int mpi_errno = MPI_SUCCESS;
+ int ret;
+
+ NEM_NMAD_DIRECT_MATCH(match_info,0,source,comm->context_id + context_offset);
+ if (tag != MPI_ANY_TAG)
+ {
+ NEM_NMAD_SET_TAG(match_info,tag);
+ }
+ else
+ {
+ MPIU_Assert(0);
+ }
+
+ do {
+ ret = nm_sr_probe(mpid_nem_newmad_pcore,VC_FIELD(vc,p_gate),&out_gate,match_info);
+ }
+ while (ret != NM_ESUCCESS);
+
+ status->MPI_SOURCE = source;
+ status->MPI_TAG = tag;
+ status->count = 0; /* FIXME */
+
+ fn_exit:
+ return mpi_errno;
+ fn_fail: ATTRIBUTE((unused))
+ goto fn_exit;
+}
+
+
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_newmad_iprobe
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_newmad_iprobe(MPIDI_VC_t *vc, int source, int tag, MPID_Comm *comm, int context_offset, int *flag, MPI_Status *status)
+{
+ nm_tag_t match_info = 0;
+ nm_gate_t out_gate;
+ int mpi_errno = MPI_SUCCESS;
+ int ret;
+
+ NEM_NMAD_DIRECT_MATCH(match_info,0,source,comm->context_id + context_offset);
+ if (tag != MPI_ANY_TAG)
+ {
+ NEM_NMAD_SET_TAG(match_info,tag);
+ }
+ else
+ {
+ MPIU_Assert(0);
+ }
+
+ ret = nm_sr_probe(mpid_nem_newmad_pcore,VC_FIELD(vc,p_gate),&out_gate,match_info);
+ if (ret == NM_ESUCCESS)
+ {
+ /*
+ size_t size;
+ nm_sr_get_size(mpid_nem_newmad_pcore, p_out_req, &size);
+ */
+
+ status->MPI_SOURCE = source;
+ status->MPI_TAG = tag;
+ status->count = 0; /* FIXME */
+ *flag = TRUE;
+ }
+ else
+ *flag = FALSE;
+
+ fn_exit:
+ return mpi_errno;
+ fn_fail: ATTRIBUTE((unused))
+ goto fn_exit;
+}
Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_send.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_send.c 2009-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_send.c 2009-03-26 15:16:25 UTC (rev 4198)
@@ -22,7 +22,7 @@
MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_NEWMAD_ISENDCONTIG);
MPIU_Assert(hdr_sz <= sizeof(MPIDI_CH3_Pkt_t));
- MPIU_DBG_MSG(CH3_CHANNEL, VERBOSE, "mx_iSendContig");
+ MPIU_DBG_MSG(CH3_CHANNEL, VERBOSE, "newmad_iSendContig");
MPIDI_DBG_Print_packet((MPIDI_CH3_Pkt_t *)hdr);
NEM_NMAD_ADI_MATCH(match_info);
@@ -36,15 +36,15 @@
num_iov += 1;
}
- nm_sr_isend_iov(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info,
- mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)));
+ nm_sr_isend_iov_with_ref(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info,
+ mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)),(void *)sreq);
mpid_nem_newmad_pending_send_req++;
sreq->ch.vc = vc;
fn_exit:
MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_ISENDCONTIG);
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
@@ -63,7 +63,7 @@
MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_NEWMAD_ISTARTCONTIGMSG);
MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_NEWMAD_ISTARTCONTIGMSG);
MPIU_Assert(hdr_sz <= sizeof(MPIDI_CH3_Pkt_t));
- MPIU_DBG_MSG(CH3_CHANNEL, VERBOSE, "mx_iSendContig");
+ MPIU_DBG_MSG(CH3_CHANNEL, VERBOSE, "newmad_iSendContig");
MPIDI_DBG_Print_packet((MPIDI_CH3_Pkt_t *)hdr);
/* create a request */
@@ -84,8 +84,8 @@
num_iov += 1;
}
- nm_sr_isend_iov(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info,
- mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)));
+ nm_sr_isend_iov_with_ref(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info,
+ mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)),(void *)sreq);
mpid_nem_newmad_pending_send_req++;
sreq->ch.vc = vc;
@@ -93,7 +93,7 @@
*sreq_ptr = sreq;
MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_ISTARTCONTIGMSG);
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
@@ -107,7 +107,7 @@
{
int mpi_errno = MPI_SUCCESS;
nm_tag_t match_info = 0;
- struct iovec *mad_iov;
+ struct iovec mad_iov[NMAD_IOV_MAX_DEPTH];
int num_iov = 1;
MPIDI_msg_sz_t data_sz;
int dt_contig;
@@ -123,28 +123,23 @@
if(data_sz)
{
- MPID_nem_mx_process_sdtype(&sreq,sreq->dev.datatype,dt_ptr,sreq->dev.user_buf,
- sreq->dev.user_count,data_sz, &mad_iov,&num_iov,1);
+ struct iovec *mad_iov_ptr = &(mad_iov[0]);
+ MPID_nem_newmad_process_sdtype(&sreq,sreq->dev.datatype,dt_ptr,sreq->dev.user_buf,
+ sreq->dev.user_count,data_sz, &mad_iov_ptr,&num_iov,1);
}
- else
- {
- mad_iov = MPIU_Malloc(sizeof(struct iovec));
- }
-
NEM_NMAD_ADI_MATCH(match_info);
memcpy(&(sreq->dev.pending_pkt),(char *)header,sizeof(MPIDI_CH3_PktGeneric_t));
mad_iov[0].iov_base = (char *)&(sreq->dev.pending_pkt);
mad_iov[0].iov_len = sizeof(MPIDI_CH3_PktGeneric_t);
- nm_sr_isend_iov(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info,
- mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)));
+ nm_sr_isend_iov_with_ref(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info,
+ mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)),(void*)sreq);
+ mpid_nem_newmad_pending_send_req++;
- MPIU_Free(mad_iov); /* FIXME : is this safe ? */
-
fn_exit:
MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_SENDNONCONTIGMSG);
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
@@ -158,7 +153,7 @@
{
MPID_Request *sreq = NULL;
nm_tag_t match_info = 0;
- struct iovec *mad_iov;
+ struct iovec mad_iov[NMAD_IOV_MAX_DEPTH];
int num_iov = 0;
int mpi_errno = MPI_SUCCESS;
MPID_Datatype *dt_ptr;
@@ -178,38 +173,37 @@
MPIDI_Request_set_seqnum(sreq, seqnum);
sreq->ch.vc = vc;
sreq->dev.OnDataAvail = NULL;
-
NEM_NMAD_DIRECT_MATCH(match_info,tag,comm->rank,comm->context_id + context_offset);
if(data_sz)
{
if (dt_contig)
{
- mad_iov = MPIU_Malloc(sizeof(struct iovec));
mad_iov[0].iov_base = (char*)(buf + dt_true_lb);
mad_iov[0].iov_len = data_sz;
- num_iov += 1;
+ num_iov = 1;
}
else
{
- MPID_nem_mx_process_sdtype(&sreq,datatype,dt_ptr,buf,count,data_sz,&mad_iov,&num_iov,0);
+ struct iovec *mad_iov_ptr = &(mad_iov[0]);
+ MPID_nem_newmad_process_sdtype(&sreq,datatype,dt_ptr,buf,count,data_sz,&mad_iov_ptr,&num_iov,0);
}
- nm_sr_isend_iov(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info,
- mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)));
+ MPIU_Assert(num_iov <= NMAD_IOV_MAX_DEPTH);
+ nm_sr_isend_iov_with_ref(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info,
+ mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)),(void*)sreq);
}
else
{
- nm_sr_isend(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info,
- NULL, 0, &(REQ_FIELD(sreq,newmad_req)));
+ nm_sr_isend_with_ref(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info,
+ NULL, 0, &(REQ_FIELD(sreq,newmad_req)),(void*)sreq);
}
mpid_nem_newmad_pending_send_req++;
- MPIU_Free(mad_iov);
fn_exit:
*sreq_p = sreq;
MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_DIRECTSEND);
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
@@ -222,7 +216,7 @@
{
MPID_Request *sreq = NULL;
nm_tag_t match_info = 0;
- struct iovec *mad_iov;
+ struct iovec mad_iov[NMAD_IOV_MAX_DEPTH];
int num_iov = 0;
int mpi_errno = MPI_SUCCESS;
MPID_Datatype *dt_ptr;
@@ -249,14 +243,14 @@
{
if (dt_contig)
{
- mad_iov = MPIU_Malloc(sizeof(struct iovec));
mad_iov[0].iov_base = (char*)(buf + dt_true_lb);
mad_iov[0].iov_len = data_sz;
num_iov += 1;
}
else
{
- MPID_nem_mx_process_sdtype(&sreq,datatype,dt_ptr,buf,count,data_sz,&mad_iov,&num_iov,0);
+ struct iovec *mad_iov_ptr = &(mad_iov[0]);
+ MPID_nem_newmad_process_sdtype(&sreq,datatype,dt_ptr,buf,count,data_sz,&mad_iov_ptr,&num_iov,0);
}
/* FIXME issend !*/
nm_sr_isend_iov(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info,
@@ -269,13 +263,12 @@
NULL, 0, &(REQ_FIELD(sreq,newmad_req)));
}
mpid_nem_newmad_pending_send_req++;
- MPIU_Free(mad_iov);
fn_exit:
*sreq_p = sreq;
MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_DIRECTSSEND);
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
@@ -285,13 +278,16 @@
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
int MPID_nem_newmad_process_sdtype(MPID_Request **sreq_p, MPI_Datatype datatype, MPID_Datatype * dt_ptr, const void *buf,
- int count, MPIDI_msg_sz_t data_sz, struct iovec **mad_iov, int *num_iov, int first_taken)
+ int count, MPIDI_msg_sz_t data_sz, struct iovec *mad_iov[], int *num_iov, int first_taken)
{
MPID_Request *sreq =*sreq_p;
MPIDI_msg_sz_t last;
- int iov_num_ub = count * dt_ptr->max_contig_blocks;
- int n_iov = iov_num_ub;
- int mpi_errno = MPI_SUCCESS;
+ int iov_num_ub = count * dt_ptr->max_contig_blocks;
+ int n_iov = iov_num_ub;
+ MPID_IOV *iov;
+ int num_entries = NMAD_IOV_MAX_DEPTH - first_taken;
+ int mpi_errno = MPI_SUCCESS;
+ int index;
MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_SDTYPE);
MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_SDTYPE);
@@ -302,17 +298,52 @@
sreq->dev.segment_first = 0;
sreq->dev.segment_size = data_sz;
last = sreq->dev.segment_size;
- (*mad_iov) = MPIU_Malloc((iov_num_ub+first_taken)*sizeof(struct iovec));
-
- MPID_Segment_pack_vector(sreq->dev.segment_ptr, sreq->dev.segment_first, &last,
- (MPID_IOV *)((*mad_iov)+(first_taken*sizeof(struct iovec))), &n_iov);
+ iov = MPIU_Malloc(iov_num_ub*sizeof(MPID_IOV));
+ MPID_Segment_pack_vector(sreq->dev.segment_ptr, sreq->dev.segment_first, &last,iov, &n_iov);
MPIU_Assert(last == sreq->dev.segment_size);
- *num_iov = n_iov + first_taken;
+ if(n_iov <= num_entries)
+ {
+ for(index = 0; index < n_iov ; index++)
+ {
+ (*mad_iov)[first_taken+index].iov_base = iov[index].MPID_IOV_BUF;
+ (*mad_iov)[first_taken+index].iov_len = iov[index].MPID_IOV_LEN;
+ }
+ *num_iov = n_iov + first_taken;
+ }
+ else
+ {
+ int size_to_copy = 0;
+ int offset = 0;
+ int last_entry = num_entries - 1;
+ for(index = 0; index < n_iov ; index++)
+ {
+ if (index <= (last_entry-1))
+ {
+ (*mad_iov)[first_taken+index].iov_base = iov[index].MPID_IOV_BUF;
+ (*mad_iov)[first_taken+index].iov_len = iov[index].MPID_IOV_LEN;
+ }
+ else
+ {
+ size_to_copy += iov[index].MPID_IOV_LEN;
+ }
+ }
+ sreq->dev.tmpbuf = MPIU_Malloc(size_to_copy);
+ MPIU_Assert(sreq->dev.tmpbuf);
+ for(index = last_entry; index < n_iov; index++)
+ {
+ memcpy((char *)(sreq->dev.tmpbuf) + offset, iov[index].MPID_IOV_BUF, iov[index].MPID_IOV_LEN);
+ offset += iov[index].MPID_IOV_LEN;
+ }
+ (*mad_iov)[NMAD_IOV_MAX_DEPTH-1].iov_base = sreq->dev.tmpbuf;
+ (*mad_iov)[NMAD_IOV_MAX_DEPTH-1].iov_len = size_to_copy;
+ *num_iov = NMAD_IOV_MAX_DEPTH;
+ }
+ MPIU_Free(iov);
fn_exit:
MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_SDTYPE);
return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
goto fn_exit;
}
More information about the mpich2-commits
mailing list