commits
Threads by month
- ----- 2026 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
August 2014
- 1 participants
- 41 discussions
[mpich] MPICH primary repository branch, master, updated. v3.1.2-131-gfa09f8e
by noreply@mpich.org 29 Aug '14
by noreply@mpich.org 29 Aug '14
29 Aug '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via fa09f8e3f18eb59cfc95e4dbc79bc6be930bb129 (commit)
via fe2bec0fa9f06cb2dc583c2307326813ffad7a70 (commit)
from 644714d0a5ba1b8a21cb2f557714f99bd2e6a1df (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/fa09f8e3f18eb59cfc95e4dbc79bc6be9…
commit fa09f8e3f18eb59cfc95e4dbc79bc6be930bb129
Author: Ken Raffenetti <raffenet(a)mcs.anl.gov>
Date: Thu Aug 14 14:27:30 2014 -0500
testsuite: add library dependencies for tests
Fixes dependency issues in the testsuite. Some tests use functions
that might be located in additional libraries (e.g. on Solaris). Use
AC_SEARCH_LIBS to find and add them when necessary.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/test/mpi/configure.ac b/test/mpi/configure.ac
index 0af3ba0..81cbd95 100644
--- a/test/mpi/configure.ac
+++ b/test/mpi/configure.ac
@@ -664,6 +664,18 @@ if test "x$enable_long_double" = "xyes" && \
AC_DEFINE(USE_LONG_DOUBLE_COMPLEX,1,[Define if tests with long double complex should be included])
fi
+# extra libraries may be necessary on some platforms (solaris) for spawn/join
+if test "$spawndir" = "spawn" ; then
+ PAC_PUSH_FLAG(LIBS)
+ AC_SEARCH_LIBS(socket,socket,socklib=$LIBS)
+ PAC_POP_FLAG(LIBS)
+ PAC_PUSH_FLAG(LIBS)
+ AC_SEARCH_LIBS(gethostbyname,nsl,nslib=$LIBS)
+ PAC_POP_FLAG(LIBS)
+ AC_SUBST(socklib)
+ AC_SUBST(nslib)
+fi
+
# Headers needed for threads tests
if test "$threadsdir" = "threads" ; then
# Check for needed threads headers and needed and optional routines
diff --git a/test/mpi/manual/Makefile.am b/test/mpi/manual/Makefile.am
index 4ba8d9e..040a021 100644
--- a/test/mpi/manual/Makefile.am
+++ b/test/mpi/manual/Makefile.am
@@ -18,5 +18,7 @@ noinst_HEADERS = connectstuff.h
testconnectserial_SOURCES = testconnectserial.c tchandlers.c tcutil.c
testconnectserial_LDADD = $(LDADD) -lm
+singjoin_LDADD = $(LDADD) @socklib@ @nslib@
+
CLEANFILES += test-port
diff --git a/test/mpi/rma/Makefile.am b/test/mpi/rma/Makefile.am
index 67a99b1..99f928a 100644
--- a/test/mpi/rma/Makefile.am
+++ b/test/mpi/rma/Makefile.am
@@ -182,3 +182,5 @@ mutex_bench_shm_ordered_SOURCES = mutex_bench.c mcs-mutex.c mcs-mutex.h
linked_list_bench_lock_shr_nocheck_SOURCES = linked_list_bench_lock_shr.c
linked_list_bench_lock_shr_nocheck_CPPFLAGS = -DUSE_MODE_NOCHECK $(AM_CPPFLAGS)
+
+ircpi_LDADD = $(LDADD) -lm
diff --git a/test/mpi/spawn/Makefile.am b/test/mpi/spawn/Makefile.am
index a7d300d..938271d 100644
--- a/test/mpi/spawn/Makefile.am
+++ b/test/mpi/spawn/Makefile.am
@@ -41,3 +41,4 @@ noinst_PROGRAMS = \
pgroup_intercomm_test \
concurrent_spawns
+join_LDADD = $(LDADD) @socklib@ @nslib@
http://git.mpich.org/mpich.git/commitdiff/fe2bec0fa9f06cb2dc583c2307326813f…
commit fe2bec0fa9f06cb2dc583c2307326813ffad7a70
Author: Ken Raffenetti <raffenet(a)mcs.anl.gov>
Date: Wed Aug 13 17:16:10 2014 -0500
rely on interlib dependencies in compile wrappers
When a platform supports inter-library dependecies, remove MPICH
dependencies from the compile wrappers. Specifying them can confuse
the linker and cause a run-time "library not found" error for the
resulting binary.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/confdb/aclocal_libs.m4 b/confdb/aclocal_libs.m4
index 8400977..9dff742 100644
--- a/confdb/aclocal_libs.m4
+++ b/confdb/aclocal_libs.m4
@@ -38,22 +38,17 @@ AC_DEFUN([PAC_SET_HEADER_LIB_PATH],[
# taking priority
AS_IF([test -n "${with_$1_include}"],
- [PAC_APPEND_FLAG([-I${with_$1_include}],[CPPFLAGS])
- PAC_APPEND_FLAG([-I${with_$1_include}],[WRAPPER_CPPFLAGS])],
+ [PAC_APPEND_FLAG([-I${with_$1_include}],[CPPFLAGS])],
[AS_IF([test -n "${with_$1}"],
- [PAC_APPEND_FLAG([-I${with_$1}/include],[CPPFLAGS])
- PAC_APPEND_FLAG([-I${with_$1}/include],[WRAPPER_CPPFLAGS])])])
+ [PAC_APPEND_FLAG([-I${with_$1}/include],[CPPFLAGS])])])
AS_IF([test -n "${with_$1_lib}"],
- [PAC_APPEND_FLAG([-L${with_$1_lib}],[LDFLAGS])
- PAC_APPEND_FLAG([-L${with_$1_lib}],[WRAPPER_LDFLAGS])],
+ [PAC_APPEND_FLAG([-L${with_$1_lib}],[LDFLAGS])],
[AS_IF([test -n "${with_$1}"],
dnl is adding lib64 by default really the right thing to do? What if
dnl we are on a 32-bit host that happens to have both lib dirs available?
[PAC_APPEND_FLAG([-L${with_$1}/lib64],[LDFLAGS])
- PAC_APPEND_FLAG([-L${with_$1}/lib64],[WRAPPER_LDFLAGS])
- PAC_APPEND_FLAG([-L${with_$1}/lib],[LDFLAGS])
- PAC_APPEND_FLAG([-L${with_$1}/lib],[WRAPPER_LDFLAGS])])])
+ PAC_APPEND_FLAG([-L${with_$1}/lib],[LDFLAGS])])])
])
diff --git a/configure.ac b/configure.ac
index 5164887..18e4868 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5972,9 +5972,12 @@ AC_OUTPUT_COMMANDS([chmod a+x test/commands/cmdtests])
AC_DEFINE(HAVE_MPICHCONF,1,[Define so that we can test whether the mpichconf.h file has been included])
-# Add the LDFLAGS/LIBS we got so far to WRAPPERs
-WRAPPER_LDFLAGS="$WRAPPER_LDFLAGS $LDFLAGS"
-WRAPPER_LIBS="$WRAPPER_LIBS $LIBS"
+# If the platform does not support inter-library dependencies,
+# add the LDFLAGS/LIBS we got so far to WRAPPERs
+if test "$INTERLIB_DEPS" = "no" ; then
+ WRAPPER_LDFLAGS="$WRAPPER_LDFLAGS $LDFLAGS"
+ WRAPPER_LIBS="$WRAPPER_LIBS $LIBS"
+fi
if test "$USE_PMI2_API" = "yes" ; then
AC_DEFINE(USE_PMI2_API, 1, [Define if PMI2 API must be used])
-----------------------------------------------------------------------
Summary of changes:
confdb/aclocal_libs.m4 | 13 ++++---------
configure.ac | 9 ++++++---
test/mpi/configure.ac | 12 ++++++++++++
test/mpi/manual/Makefile.am | 2 ++
test/mpi/rma/Makefile.am | 2 ++
test/mpi/spawn/Makefile.am | 1 +
6 files changed, 27 insertions(+), 12 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.2-129-g644714d
by noreply@mpich.org 29 Aug '14
by noreply@mpich.org 29 Aug '14
29 Aug '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 644714d0a5ba1b8a21cb2f557714f99bd2e6a1df (commit)
from afa6e0c59ff3499809083bbff7301436c02de2fb (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/644714d0a5ba1b8a21cb2f557714f99bd…
commit 644714d0a5ba1b8a21cb2f557714f99bd2e6a1df
Author: Wesley Bland <wbland(a)anl.gov>
Date: Fri Aug 29 07:30:03 2014 -0400
Silence compiler warning about unused variable
I accidentally introduced a compiler warning in `a184bd016`. This checks the
value of mpi_errno after using it to silence the warning.
Signed-off-by: Antonio J. Pena <apenya(a)mcs.anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_recvq.c b/src/mpid/ch3/src/ch3u_recvq.c
index f1f2443..8a76d13 100644
--- a/src/mpid/ch3/src/ch3u_recvq.c
+++ b/src/mpid/ch3/src/ch3u_recvq.c
@@ -813,7 +813,7 @@ MPID_Request * MPIDI_CH3U_Recvq_FDP_or_AEU(MPIDI_Message_match * match,
* anyway. */
{
MPID_Comm *comm_ptr;
- int mpi_errno;
+ int mpi_errno ATTRIBUTE((unused)) = MPI_SUCCESS;
MPIDI_CH3I_Comm_find(match->parts.context_id, &comm_ptr);
@@ -821,6 +821,7 @@ MPID_Request * MPIDI_CH3U_Recvq_FDP_or_AEU(MPIDI_Message_match * match,
comm_ptr->revoked && MPIR_TAG_MASK_ERROR_BIT(match->parts.tag) != MPIR_SHRINK_TAG) {
*foundp = FALSE;
MPIDI_Request_create_null_rreq( rreq, mpi_errno, found=FALSE;goto lock_exit );
+ MPIU_Assert(mpi_errno == MPI_SUCCESS);
MPIU_DBG_MSG_FMT(CH3_OTHER, VERBOSE,
(MPIU_DBG_FDEST, "RECEIVED MESSAGE FOR REVOKED COMM (tag=%d,src=%d,cid=%d)\n", MPIR_TAG_MASK_ERROR_BIT(match->parts.tag), match->parts.rank, comm_ptr->context_id));
-----------------------------------------------------------------------
Summary of changes:
src/mpid/ch3/src/ch3u_recvq.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.2-128-gafa6e0c
by noreply@mpich.org 28 Aug '14
by noreply@mpich.org 28 Aug '14
28 Aug '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via afa6e0c59ff3499809083bbff7301436c02de2fb (commit)
from 511e9a56e7512b5e7866a7094214c04b21736a49 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/afa6e0c59ff3499809083bbff7301436c…
commit afa6e0c59ff3499809083bbff7301436c02de2fb
Author: Antonio J. Pena <apenya(a)mcs.anl.gov>
Date: Wed Aug 27 15:47:18 2014 -0500
Fixed hwloc compile warning
Marked a variable as unused, since the variable is only being used for
an assertion. This is less intrusive than enclosing the affected code
within #ifdefs looking for the definition of the NDEBUG marco.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/pm/hydra/tools/topo/hwloc/hwloc/src/topology.c b/src/pm/hydra/tools/topo/hwloc/hwloc/src/topology.c
index 09545e0..2acad02 100644
--- a/src/pm/hydra/tools/topo/hwloc/hwloc/src/topology.c
+++ b/src/pm/hydra/tools/topo/hwloc/hwloc/src/topology.c
@@ -3046,7 +3046,7 @@ hwloc__check_children(struct hwloc_obj *parent)
*/
if (parent->complete_cpuset) {
int firstchild;
- int prev_firstchild = -1; /* -1 works fine with first comparisons below */
+ int prev_firstchild __hwloc_attribute_unused = -1; /* -1 works fine with first comparisons below */
for(j=0; j<parent->arity; j++) {
if (!parent->children[j]->complete_cpuset
|| hwloc_bitmap_iszero(parent->children[j]->complete_cpuset))
-----------------------------------------------------------------------
Summary of changes:
src/pm/hydra/tools/topo/hwloc/hwloc/src/topology.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.2-127-g511e9a5
by noreply@mpich.org 28 Aug '14
by noreply@mpich.org 28 Aug '14
28 Aug '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 511e9a56e7512b5e7866a7094214c04b21736a49 (commit)
from cd0d41776875ad95fc9ec16fd76aa52f80deb8ee (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/511e9a56e7512b5e7866a7094214c04b2…
commit 511e9a56e7512b5e7866a7094214c04b21736a49
Author: Masamichi Takagi <masamichi.takagi(a)riken.jp>
Date: Tue Aug 26 17:48:39 2014 +0900
Use HCA when unlocking a lock variable for HCAs
Perform CAS on a lock variable for HCAs using IB HCA when unlocking it,
not issue CPU store instruction on it, because CPU cannot safely unlock
it since CAS with PCI device and CPU is not supported with the
combination of Mellanox ConnectX-3 and Intel IvyBridge.
diff --git a/src/mpid/ch3/channels/nemesis/netmod/ib/errnames.txt b/src/mpid/ch3/channels/nemesis/netmod/ib/errnames.txt
index 82f58f8..a7f7adc 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/ib/errnames.txt
+++ b/src/mpid/ch3/channels/nemesis/netmod/ib/errnames.txt
@@ -1,6 +1,8 @@
**MPIDI_PG_GetConnKVSname:MPIDI_PG_GetConnKVSname failed
**MPID_nem_ib_cm_cas:MPID_nem_ib_cm_cas failed
+**MPID_nem_ib_cm_cas_release:MPID_nem_ib_cm_cas_release failed
+**MPID_nem_ib_cm_cas_release_core:MPID_nem_ib_cm_cas_release_core failed
**MPID_nem_ib_cm_connect_cas_core:MPID_nem_ib_cm_connect_cas_core failed
**MPID_nem_ib_cm_drain_rcq:MPID_nem_ib_cm_drain_rcq failed
**MPID_nem_ib_cm_drain_scq:MPID_nem_ib_cm_drain_scq failed
diff --git a/src/mpid/ch3/channels/nemesis/netmod/ib/ib_impl.h b/src/mpid/ch3/channels/nemesis/netmod/ib/ib_impl.h
index 56c917e..2d462eb 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/ib/ib_impl.h
+++ b/src/mpid/ch3/channels/nemesis/netmod/ib/ib_impl.h
@@ -118,13 +118,14 @@ typedef struct {
enum MPID_nem_ib_cm_cmd_types {
MPID_NEM_IB_CM_HEAD_FLAG_ZERO = 0,
MPID_NEM_IB_CM_CAS,
+ MPID_NEM_IB_CM_CAS_RELEASE,
MPID_NEM_IB_CM_SYN,
MPID_NEM_IB_CM_SYNACK,
MPID_NEM_IB_CM_ACK1,
MPID_NEM_IB_CM_ACK2,
MPID_NEM_IB_RINGBUF_ASK_FETCH,
MPID_NEM_IB_RINGBUF_ASK_CAS,
- MPID_NEM_IB_CM_CAS_RELEASE,
+ MPID_NEM_IB_CM_CAS_RELEASE2,
MPID_NEM_IB_CM_ALREADY_ESTABLISHED,
MPID_NEM_IB_CM_RESPONDER_IS_CONNECTING,
MPID_NEM_IB_NOTIFY_OUTSTANDING_TX_EMPTY
@@ -294,8 +295,8 @@ typedef GENERIC_Q_DECL(MPID_nem_ib_cm_notify_send_req_t) MPID_nem_ib_cm_notify_s
(cmd)->tail_flag.tail_flag = MPID_NEM_IB_COM_MAGIC; \
}
-#define MPID_NEM_IB_CM_COMPOSE_CAS_RELEASE(cmd, req) { \
- (cmd)->type = MPID_NEM_IB_CM_CAS_RELEASE; \
+#define MPID_NEM_IB_CM_COMPOSE_CAS_RELEASE2(cmd, req) { \
+ (cmd)->type = MPID_NEM_IB_CM_CAS_RELEASE2; \
(cmd)->initiator_req = (req); \
(cmd)->tail_flag.tail_flag = MPID_NEM_IB_COM_MAGIC; \
}
@@ -580,6 +581,8 @@ int MPID_nem_ib_iStartContigMsg(MPIDI_VC_t * vc, void *hdr, MPIDI_msg_sz_t hdr_s
int MPID_nem_ib_cm_cas_core(int rank, MPID_nem_ib_cm_cmd_shadow_t * shadow);
int MPID_nem_ib_cm_cas(MPIDI_VC_t * vc, uint32_t ask_on_connect);
+int MPID_nem_ib_cm_cas_release_core(int rank, MPID_nem_ib_cm_cmd_shadow_t * shadow);
+int MPID_nem_ib_cm_cas_release(MPIDI_VC_t * vc);
int MPID_nem_ib_cm_cmd_core(int rank, MPID_nem_ib_cm_cmd_shadow_t * shadow, void *buf,
MPIDI_msg_sz_t sz, uint32_t syn, uint16_t ringbuf_index);
int MPID_nem_ib_ringbuf_ask_cas(MPIDI_VC_t * vc, MPID_nem_ib_ringbuf_req_t * req);
diff --git a/src/mpid/ch3/channels/nemesis/netmod/ib/ib_poll.c b/src/mpid/ch3/channels/nemesis/netmod/ib/ib_poll.c
index 8c84026..25b9d57 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/ib/ib_poll.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/ib/ib_poll.c
@@ -2453,12 +2453,30 @@ int MPID_nem_ib_cm_drain_scq()
dprintf("cm_drain_scq,cm_cas,succeeded\n");
if (is_conn_established(shadow_cm->req->responder_rank)) {
+#if 1
+ /* Explicitly release CAS word because
+ * ConnectX-3 doesn't support safe CAS with PCI device and CPU */
+ MPID_nem_ib_cm_cas_release(MPID_nem_ib_conns
+ [shadow_cm->req->responder_rank].vc);
+
+ shadow_cm->req->ibcom->outstanding_connection_tx -= 1;
+ dprintf("cm_drain_scq,cm_cas,established is true,%d->%d,tx=%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank,
+ shadow_cm->req->ibcom->outstanding_connection_tx);
+ /* Let the guard down to let the following connection request go. */
+ VC_FIELD(MPID_nem_ib_conns[shadow_cm->req->responder_rank].vc,
+ connection_guard) = 0;
+ /* free memory : req->ref_count is 3, so call MPIU_Free() directly */
+ //MPID_nem_ib_cm_request_release(shadow_cm->req);
+ MPIU_Free(shadow_cm->req);
+#else
/* Connection is already established.
* In this case, responder may already have performed vc_terminate.
* However, since initiator has to release responder's CAS word,
- * initiator sends CM_CAS_RELEASE. */
-
- shadow_cm->req->state = MPID_NEM_IB_CM_CAS_RELEASE;
+ * initiator sends CM_CAS_RELEASE2. */
+ dprintf("cm_drain_scq,cm_cas,established,%d->%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank);
+ shadow_cm->req->state = MPID_NEM_IB_CM_CAS_RELEASE2;
if (MPID_nem_ib_ncqe_scratch_pad < MPID_NEM_IB_COM_MAX_CQ_CAPACITY &&
shadow_cm->req->ibcom->ncom_scratch_pad <
MPID_NEM_IB_COM_MAX_SQ_CAPACITY) {
@@ -2466,7 +2484,7 @@ int MPID_nem_ib_cm_drain_scq()
MPID_nem_ib_cm_cmd_syn_t *cmd =
(MPID_nem_ib_cm_cmd_syn_t *) shadow_cm->req->ibcom->
icom_mem[MPID_NEM_IB_COM_SCRATCH_PAD_FROM];
- MPID_NEM_IB_CM_COMPOSE_CAS_RELEASE(cmd, shadow_cm->req);
+ MPID_NEM_IB_CM_COMPOSE_CAS_RELEASE2(cmd, shadow_cm->req);
cmd->initiator_rank = MPID_nem_ib_myrank;
MPID_nem_ib_cm_cmd_shadow_t *shadow_syn =
(MPID_nem_ib_cm_cmd_shadow_t *)
@@ -2475,6 +2493,8 @@ int MPID_nem_ib_cm_drain_scq()
shadow_syn->req = shadow_cm->req;
dprintf("shadow_syn=%p,shadow_syn->req=%p\n", shadow_syn,
shadow_syn->req);
+ dprintf("cm_drain_scq,cm_cas,established,sending cas_release2,%d->%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank);
mpi_errno =
MPID_nem_ib_cm_cmd_core(shadow_cm->req->responder_rank, shadow_syn,
(void *) cmd,
@@ -2484,15 +2504,21 @@ int MPID_nem_ib_cm_drain_scq()
"**MPID_nem_ib_cm_send_core");
}
else {
- MPID_NEM_IB_CM_COMPOSE_CAS_RELEASE((MPID_nem_ib_cm_cmd_syn_t *) &
- (shadow_cm->req->cmd),
- shadow_cm->req);
+ MPID_NEM_IB_CM_COMPOSE_CAS_RELEASE2((MPID_nem_ib_cm_cmd_syn_t *) &
+ (shadow_cm->req->cmd),
+ shadow_cm->req);
+ ((MPID_nem_ib_cm_cmd_syn_t *) & shadow_cm->req->cmd)->initiator_rank =
+ MPID_nem_ib_myrank;
MPID_nem_ib_cm_sendq_enqueue(&MPID_nem_ib_cm_sendq, shadow_cm->req);
}
+#endif
}
else {
/* Increment receiving transaction counter. Initiator receives SYNACK and ACK2 */
shadow_cm->req->ibcom->incoming_connection_tx += 2;
+ dprintf("cm_drain_scq,cas succeeded,sending syn,%d->%d,connection_tx=%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank,
+ shadow_cm->req->ibcom->outstanding_connection_tx);
shadow_cm->req->state = MPID_NEM_IB_CM_SYN;
if (MPID_nem_ib_ncqe_scratch_pad < MPID_NEM_IB_COM_MAX_CQ_CAPACITY &&
shadow_cm->req->ibcom->ncom_scratch_pad <
@@ -2530,6 +2556,8 @@ int MPID_nem_ib_cm_drain_scq()
MPID_NEM_IB_CM_COMPOSE_SYN((MPID_nem_ib_cm_cmd_syn_t *) &
(shadow_cm->req->cmd), shadow_cm->req);
MPID_nem_ib_cm_sendq_enqueue(&MPID_nem_ib_cm_sendq, shadow_cm->req);
+ dprintf("cm_drain_scq,enqueue syn,%d->%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank);
}
}
}
@@ -2541,6 +2569,9 @@ int MPID_nem_ib_cm_drain_scq()
MPID_nem_ib_ncqe_scratch_pad_to_drain -= 1;
shadow_cm->req->ibcom->ncom_scratch_pad -= 1;
shadow_cm->req->ibcom->outstanding_connection_tx -= 1;
+ dprintf("cm_drain_scq,cm_cas,cas failed,established is true,%d->%d,tx=%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank,
+ shadow_cm->req->ibcom->outstanding_connection_tx);
MPID_nem_ib_rdmawr_from_free(shadow_cm->buf_from, shadow_cm->buf_from_sz);
/* Let the guard down to let the following connection request go. */
VC_FIELD(MPID_nem_ib_conns[shadow_cm->req->responder_rank].vc,
@@ -2552,14 +2583,14 @@ int MPID_nem_ib_cm_drain_scq()
break;
}
- dprintf("cm_drain_scq,cm_cas,retval=%016lx,backoff=%ld\n", *cas_retval,
- shadow_cm->req->retry_backoff);
shadow_cm->req->retry_backoff =
shadow_cm->req->retry_backoff ? (shadow_cm->req->retry_backoff << 1) : 1;
shadow_cm->req->retry_decided = MPID_nem_ib_progress_engine_vt; /* Schedule retry */
MPID_nem_ib_cm_sendq_enqueue(&MPID_nem_ib_cm_sendq, shadow_cm->req);
- dprintf("cm_drain_scq,cm_cas,failed,decided=%ld,backoff=%ld\n",
- shadow_cm->req->retry_decided, shadow_cm->req->retry_backoff);
+ dprintf
+ ("cm_drain_scq,cm_cas,cas failed,%d->%d,retval=%016lx,decided=%ld,backoff=%ld\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank, *cas_retval,
+ shadow_cm->req->retry_decided, shadow_cm->req->retry_backoff);
}
MPID_nem_ib_ncqe_scratch_pad_to_drain -= 1;
shadow_cm->req->ibcom->ncom_scratch_pad -= 1;
@@ -2567,23 +2598,57 @@ int MPID_nem_ib_cm_drain_scq()
MPIU_Free(shadow_cm);
break;
}
+ case MPID_NEM_IB_CM_CAS_RELEASE:{
+ shadow_cm = (MPID_nem_ib_cm_cmd_shadow_t *) cqe[i].wr_id;
+ dprintf("cm_drain_scq,cm_cas_release,req=%p,responder_rank=%d\n",
+ shadow_cm->req, shadow_cm->req->responder_rank);
+ /* Check if CAS have succeeded */
+ uint64_t *cas_retval = (uint64_t *) shadow_cm->buf_from;
+ if (*cas_retval == MPID_nem_ib_myrank) {
+ /* CAS succeeded */
+ dprintf("cm_drain_scq,cm_cas_release,cas succeeded,%d->%d,retval=%016lx\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank, *cas_retval);
+ shadow_cm->req->ibcom->outstanding_connection_tx -= 1;
+ MPID_nem_ib_cm_request_release(shadow_cm->req);
+ }
+ else {
+
+ shadow_cm->req->retry_backoff =
+ shadow_cm->req->retry_backoff ? (shadow_cm->req->retry_backoff << 1) : 1;
+ shadow_cm->req->retry_decided = MPID_nem_ib_progress_engine_vt; /* Schedule retry */
+ MPID_nem_ib_cm_sendq_enqueue(&MPID_nem_ib_cm_sendq, shadow_cm->req);
+ dprintf
+ ("cm_drain_scq,cm_cas_release,cas failed,%d->%d,retval=%016lx,decided=%ld,backoff=%ld\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank, *cas_retval,
+ shadow_cm->req->retry_decided, shadow_cm->req->retry_backoff);
+ }
+
+ shadow_cm->req->ibcom->ncom_scratch_pad -= 1;
+ MPID_nem_ib_rdmawr_from_free(shadow_cm->buf_from, shadow_cm->buf_from_sz);
+ MPIU_Free(shadow_cm);
+ break;
+ }
case MPID_NEM_IB_CM_SYN:
dprintf("cm_drain_scq,syn sent\n");
shadow_cm = (MPID_nem_ib_cm_cmd_shadow_t *) cqe[i].wr_id;
shadow_cm->req->ibcom->ncom_scratch_pad -= 1;
- dprintf("cm_drain_scq,tx=%d\n", shadow_cm->req->ibcom->outstanding_connection_tx);
+ dprintf("cm_drain_scq,syn sent,%d->%d,connection_tx=%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank,
+ shadow_cm->req->ibcom->outstanding_connection_tx);
dprintf("cm_drain_scq,syn,buf_from=%p,sz=%d\n", shadow_cm->buf_from,
shadow_cm->buf_from_sz);
MPID_nem_ib_cm_request_release(shadow_cm->req);
MPID_nem_ib_rdmawr_from_free(shadow_cm->buf_from, shadow_cm->buf_from_sz);
MPIU_Free(shadow_cm);
break;
- case MPID_NEM_IB_CM_CAS_RELEASE:
- dprintf("cm_drain_scq,syn sent\n");
+ case MPID_NEM_IB_CM_CAS_RELEASE2:
+ dprintf("cm_drain_scq,release2 sent\n");
shadow_cm = (MPID_nem_ib_cm_cmd_shadow_t *) cqe[i].wr_id;
shadow_cm->req->ibcom->ncom_scratch_pad -= 1;
shadow_cm->req->ibcom->outstanding_connection_tx -= 1;
- dprintf("cm_drain_scq,tx=%d\n", shadow_cm->req->ibcom->outstanding_connection_tx);
+ dprintf("cm_drain_scq,cas_release2 sent,%d->%d,connection_tx=%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank,
+ shadow_cm->req->ibcom->outstanding_connection_tx);
dprintf("cm_drain_scq,syn,buf_from=%p,sz=%d\n", shadow_cm->buf_from,
shadow_cm->buf_from_sz);
MPID_nem_ib_rdmawr_from_free(shadow_cm->buf_from, shadow_cm->buf_from_sz);
@@ -2597,7 +2662,9 @@ int MPID_nem_ib_cm_drain_scq()
dprintf("cm_drain_scq,synack sent,req=%p,initiator_rank=%d\n", shadow_cm->req,
shadow_cm->req->initiator_rank);
shadow_cm->req->ibcom->ncom_scratch_pad -= 1;
- dprintf("cm_drain_scq,tx=%d\n", shadow_cm->req->ibcom->outstanding_connection_tx);
+ dprintf("cm_drain_scq,synack sent,%d->%d,tx=%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->initiator_rank,
+ shadow_cm->req->ibcom->outstanding_connection_tx);
dprintf("cm_drain_scq,synack,buf_from=%p,sz=%d\n", shadow_cm->buf_from,
shadow_cm->buf_from_sz);
MPID_nem_ib_rdmawr_from_free(shadow_cm->buf_from, shadow_cm->buf_from_sz);
@@ -2608,7 +2675,9 @@ int MPID_nem_ib_cm_drain_scq()
shadow_cm = (MPID_nem_ib_cm_cmd_shadow_t *) cqe[i].wr_id;
shadow_cm->req->ibcom->ncom_scratch_pad -= 1;
shadow_cm->req->ibcom->outstanding_connection_tx -= 1;
- dprintf("cm_drain_scq,tx=%d\n", shadow_cm->req->ibcom->outstanding_connection_tx);
+ dprintf("cm_drain_scq,ack1,%d->%d,connection_tx=%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->responder_rank,
+ shadow_cm->req->ibcom->outstanding_connection_tx);
dprintf("cm_drain_scq,ack1,buf_from=%p,sz=%d\n", shadow_cm->buf_from,
shadow_cm->buf_from_sz);
MPID_nem_ib_rdmawr_from_free(shadow_cm->buf_from, shadow_cm->buf_from_sz);
@@ -2624,7 +2693,9 @@ int MPID_nem_ib_cm_drain_scq()
shadow_cm->req->initiator_rank);
shadow_cm->req->ibcom->ncom_scratch_pad -= 1;
shadow_cm->req->ibcom->outstanding_connection_tx -= 1;
- dprintf("cm_drain_scq,tx=%d\n", shadow_cm->req->ibcom->outstanding_connection_tx);
+ dprintf("cm_drain_scq,ack2,%d->%d,tx=%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->initiator_rank,
+ shadow_cm->req->ibcom->outstanding_connection_tx);
dprintf("cm_drain_scq,ack2,buf_from=%p,sz=%d\n", shadow_cm->buf_from,
shadow_cm->buf_from_sz);
MPID_nem_ib_rdmawr_from_free(shadow_cm->buf_from, shadow_cm->buf_from_sz);
@@ -2644,7 +2715,9 @@ int MPID_nem_ib_cm_drain_scq()
shadow_cm->req, &shadow_cm->req->initiator_rank, shadow_cm->req->initiator_rank);
shadow_cm->req->ibcom->ncom_scratch_pad -= 1;
shadow_cm->req->ibcom->outstanding_connection_tx -= 1;
- dprintf("cm_drain_scq,tx=%d\n", shadow_cm->req->ibcom->outstanding_connection_tx);
+ dprintf("cm_drain_scq,established or connecting sent,%d->%d,connection_tx=%d,type=%d\n",
+ MPID_nem_ib_myrank, shadow_cm->req->initiator_rank,
+ shadow_cm->req->ibcom->outstanding_connection_tx, *type);
shadow_cm->req->ibcom->incoming_connection_tx -= 1;
MPID_nem_ib_rdmawr_from_free(shadow_cm->buf_from, shadow_cm->buf_from_sz);
/* Let the guard down to let the following connection request go. */
@@ -2658,11 +2731,10 @@ int MPID_nem_ib_cm_drain_scq()
shadow_ringbuf = (MPID_nem_ib_ringbuf_cmd_shadow_t *) cqe[i].wr_id;
memcpy(&shadow_ringbuf->req->fetched,
shadow_ringbuf->buf_from, sizeof(MPID_nem_ib_ringbuf_headtail_t));
- dprintf
- ("cm_drain_scq,ask_fetch sent,%d->%d,req=%p,fetched->head=%ld,tail=%d\n",
- MPID_nem_ib_myrank, shadow_ringbuf->req->vc->pg_rank,
- shadow_ringbuf->req, shadow_ringbuf->req->fetched.head,
- shadow_ringbuf->req->fetched.tail);
+ dprintf("cm_drain_scq,ask_fetch sent,%d->%d,req=%p,fetched->head=%ld,tail=%d\n",
+ MPID_nem_ib_myrank, shadow_ringbuf->req->vc->pg_rank,
+ shadow_ringbuf->req, shadow_ringbuf->req->fetched.head,
+ shadow_ringbuf->req->fetched.tail);
/* Proceed to cas */
MPID_nem_ib_ringbuf_ask_cas(shadow_ringbuf->req->vc, shadow_ringbuf->req);
MPID_nem_ib_ncqe_scratch_pad_to_drain -= 1;
@@ -2742,7 +2814,7 @@ int MPID_nem_ib_cm_drain_scq()
}
else {
/* CAS failed */
- printf("ask-cas,failed\n");
+ dprintf("ask-cas,failed\n");
MPID_nem_ib_segv;
/* Let the guard down so that this ask-fetch can be issued in ringbuf_progress */
VC_FIELD(shadow_ringbuf->req->vc, ibcom->ask_guard) = 0;
@@ -2880,6 +2952,15 @@ int MPID_nem_ib_cm_poll_syn()
goto fn_exit;
}
+ /* Make the following store instruction onto the CAS word switch
+ * the value from "acquired" to "released" by
+ * waiting until modification on CAS word by a PCIe device
+ * propagated to the cache tag. */
+ volatile uint64_t *cas_word = (uint64_t *) (MPID_nem_ib_scratch_pad);
+ if (*cas_word == MPID_NEM_IB_CM_RELEASED) {
+ goto fn_exit;
+ }
+
/* Memory layout is (CAS-word:SYN#0:SYN#1:...:SYN#N:CMD#0:CMD#1:...CMD#M) */
void *slot = (MPID_nem_ib_scratch_pad + MPID_NEM_IB_CM_OFF_SYN +
sizeof(MPID_nem_ib_cm_cmd_t) * (0 % MPID_NEM_IB_CM_NSEG));
@@ -2888,18 +2969,18 @@ int MPID_nem_ib_cm_poll_syn()
goto fn_exit;
} /* Incoming message hasn't arrived */
+ volatile MPID_nem_ib_cm_cmd_syn_t *syn_tail_flag = (MPID_nem_ib_cm_cmd_syn_t *) slot;
+
switch (*head_flag) {
case MPID_NEM_IB_CM_SYN:{
int is_synack = 0;
- volatile MPID_nem_ib_cm_cmd_syn_t *syn_tail_flag = (MPID_nem_ib_cm_cmd_syn_t *) slot;
while (syn_tail_flag->tail_flag.tail_flag != MPID_NEM_IB_COM_MAGIC) {
/* __asm__ __volatile__("pause;":::"memory"); */
}
- volatile uint64_t *cas_word = (uint64_t *) (MPID_nem_ib_scratch_pad);
MPID_nem_ib_cm_cmd_syn_t *syn = (MPID_nem_ib_cm_cmd_syn_t *) slot;
- dprintf("cm_poll_syn,syn detected!,initiator_rank=%d,ringbuf_index=%d\n",
- syn->initiator_rank, syn->responder_ringbuf_index);
+ dprintf("cm_poll_syn,syn detected!,%d->%d,ringbuf_index given=%d\n",
+ syn->initiator_rank, MPID_nem_ib_myrank, syn->responder_ringbuf_index);
MPID_nem_ib_cm_req_t *req = MPIU_Malloc(sizeof(MPID_nem_ib_cm_req_t));
MPIU_ERR_CHKANDJUMP(!req, mpi_errno, MPI_ERR_OTHER, "**malloc");
req->ref_count = 1; /* Released when draining SCQ of ACK2 */
@@ -2912,10 +2993,16 @@ int MPID_nem_ib_cm_poll_syn()
MPIU_ERR_CHKANDJUMP(ibcom_errno, mpi_errno, MPI_ERR_OTHER,
"**MPID_nem_ib_com_obtain_pointer");
if (is_conn_established(syn->initiator_rank)) {
+ dprintf("cm_poll_syn,established is true,%d->%d,connection_tx=%d\n",
+ syn->initiator_rank, MPID_nem_ib_myrank,
+ req->ibcom->outstanding_connection_tx);
req->state = MPID_NEM_IB_CM_ALREADY_ESTABLISHED;
}
else if ((MPID_nem_ib_myrank > syn->initiator_rank) &&
- (req->ibcom->outstanding_connection_tx == 1)) {
+ (req->ibcom->outstanding_connection_tx > 0)) {
+ dprintf("cm_poll_syn,connection_tx>0,%d->%d,connection_tx=%d\n",
+ syn->initiator_rank, MPID_nem_ib_myrank,
+ req->ibcom->outstanding_connection_tx);
req->state = MPID_NEM_IB_CM_RESPONDER_IS_CONNECTING;
}
else {
@@ -2954,7 +3041,6 @@ int MPID_nem_ib_cm_poll_syn()
/* Increment transaction counter here because this path is executed only once */
req->ibcom->outstanding_connection_tx += 1;
- dprintf("cm_poll_syn,tx=%d\n", req->ibcom->outstanding_connection_tx);
/* Increment receiving transaction counter.
* In the case of SYNACK, Responder receives ack1
* In the case of ALREADY_ESTABLISHED or RESPONDER_IS_CONNECTING,
@@ -2970,6 +3056,9 @@ int MPID_nem_ib_cm_poll_syn()
(MPID_nem_ib_cm_cmd_synack_t *) req->ibcom->
icom_mem[MPID_NEM_IB_COM_SCRATCH_PAD_FROM];
if (is_synack) {
+ dprintf("cm_poll_syn,sending synack,%d->%d[%d],connection_tx=%d\n",
+ MPID_nem_ib_myrank, syn->initiator_rank, req->ringbuf_index,
+ req->ibcom->outstanding_connection_tx);
MPID_NEM_IB_CM_COMPOSE_SYNACK(cmd, req, syn->initiator_req);
dprintf
("cm_poll_syn,composing synack,responder_req=%p,cmd->rmem=%p,rkey=%08x,ringbuf_nslot=%d,remote_vc=%p\n",
@@ -2981,13 +3070,17 @@ int MPID_nem_ib_cm_poll_syn()
MPID_nem_ib_cm_ringbuf_head++;
}
else {
+ dprintf
+ ("cm_poll_syn,sending established or connecting,%d->%d[%d],connection_tx=%d,state=%d\n",
+ MPID_nem_ib_myrank, syn->initiator_rank, req->ringbuf_index,
+ req->ibcom->outstanding_connection_tx, req->state);
MPID_NEM_IB_CM_COMPOSE_END_CM(cmd, req, syn->initiator_req, req->state);
}
MPID_nem_ib_cm_cmd_shadow_t *shadow = (MPID_nem_ib_cm_cmd_shadow_t *)
MPIU_Malloc(sizeof(MPID_nem_ib_cm_cmd_shadow_t));
shadow->type = req->state;
shadow->req = req;
- dprintf("shadow=%p,shadow->req=%p\n", shadow, shadow->req);
+ dprintf("cm_poll_syn,shadow=%p,shadow->req=%p\n", shadow, shadow->req);
mpi_errno =
MPID_nem_ib_cm_cmd_core(req->initiator_rank, shadow, (void *) cmd,
sizeof(MPID_nem_ib_cm_cmd_synack_t), 0,
@@ -3000,39 +3093,60 @@ int MPID_nem_ib_cm_poll_syn()
MPID_nem_ib_ncqe_scratch_pad, req->ibcom->ncom_scratch_pad,
MPID_nem_ib_cm_ringbuf_head, MPID_nem_ib_cm_ringbuf_tail);
if (is_synack) {
+ dprintf("cm_poll_syn,queueing syn,%d->%d,connection_tx=%d\n",
+ MPID_nem_ib_myrank, syn->initiator_rank,
+ req->ibcom->outstanding_connection_tx);
MPID_NEM_IB_CM_COMPOSE_SYNACK((MPID_nem_ib_cm_cmd_synack_t *) &
(req->cmd), req, syn->initiator_req);
}
else {
- MPID_NEM_IB_CM_COMPOSE_END_CM((MPID_nem_ib_cm_cmd_synack_t *) &
- (req->cmd), req, syn->initiator_req, req->state);
+ dprintf
+ ("cm_poll_syn,queueing established or connecting,%d->%d,connection_tx=%d,state=%d\n",
+ MPID_nem_ib_myrank, syn->initiator_rank,
+ req->ibcom->outstanding_connection_tx, req->state);
+ MPID_NEM_IB_CM_COMPOSE_END_CM((MPID_nem_ib_cm_cmd_synack_t *) & (req->cmd), req,
+ syn->initiator_req, req->state);
}
MPID_nem_ib_cm_sendq_enqueue(&MPID_nem_ib_cm_sendq, req);
}
- /* Release CAS word because there's no next write on this syn slot */
- *cas_word = MPID_NEM_IB_CM_RELEASED;
}
goto common_tail;
break;
- case MPID_NEM_IB_CM_CAS_RELEASE:{
+ case MPID_NEM_IB_CM_CAS_RELEASE2:{
+ MPID_nem_ib_segv;
/* Initiator requests to release CAS word.
* Because connection is already established.
* In this case, responder may already have performed vc_terminate. */
- volatile MPID_nem_ib_cm_cmd_syn_t *syn_tail_flag = (MPID_nem_ib_cm_cmd_syn_t *) slot;
while (syn_tail_flag->tail_flag.tail_flag != MPID_NEM_IB_COM_MAGIC) {
/* __asm__ __volatile__("pause;":::"memory"); */
}
- volatile uint64_t *cas_word = (uint64_t *) (MPID_nem_ib_scratch_pad);
- /* release */
- *cas_word = MPID_NEM_IB_CM_RELEASED;
+#ifdef MPID_NEM_IB_DEBUG_POLL
+ MPID_nem_ib_cm_cmd_syn_t *syn = (MPID_nem_ib_cm_cmd_syn_t *) slot;
+#endif
+ dprintf("cm_poll_syn,release2 detected,%d->%d\n",
+ syn->initiator_rank, MPID_nem_ib_myrank);
}
common_tail:
- *head_flag = MPID_NEM_IB_CM_HEAD_FLAG_ZERO; /* Clear head-flag */
- /* Clear all possible tail-flag slots */
- ((MPID_nem_ib_cm_cmd_syn_t *) slot)->tail_flag.tail_flag = 0;
+
+ /* Clear head-flag */
+ *head_flag = MPID_NEM_IB_CM_HEAD_FLAG_ZERO;
+
+ /* Clear tail-flag */
+ syn_tail_flag->tail_flag.tail_flag = 0;
+
+ /* Release CAS word.
+ * Note that the following store instruction switches the value from "acquired" to "released"
+ * because the load instruction above made the cache tag for the CAS word
+ * reflect the switch of the value from "released" to "acquired".
+ * We want to prevent the case where the store instruction switches the value from
+ * "released" to "released" then a write command from a PCI device arrives
+ * and switches the value from "released" to "acquired")
+ */
+ //*cas_word = MPID_NEM_IB_CM_RELEASED;
+ dprintf("cm_poll_syn,exit,%d,cas_word,%p,%lx\n", MPID_nem_ib_myrank, cas_word, *cas_word);
break;
default:
printf("unknown connection command\n");
@@ -3128,11 +3242,12 @@ int MPID_nem_ib_cm_poll()
MPID_nem_ib_cm_cmd_synack_t *synack = (MPID_nem_ib_cm_cmd_synack_t *) slot;
MPID_nem_ib_cm_req_t *req = (MPID_nem_ib_cm_req_t *) synack->initiator_req;
req->ringbuf_index = synack->initiator_ringbuf_index;
+ req->ibcom->incoming_connection_tx -= 1; /* SYNACK */
dprintf
- ("cm_poll,synack detected!,responder_req=%p,responder_rank=%d,ringbuf_index=%d,tx=%d\n",
- synack->responder_req, req->responder_rank, synack->initiator_ringbuf_index,
+ ("cm_poll,synack detected!,%d->%d[%d],responder_req=%p,ringbuf_index=%d,tx=%d\n",
+ req->responder_rank, MPID_nem_ib_myrank, i,
+ synack->responder_req, synack->initiator_ringbuf_index,
req->ibcom->outstanding_connection_tx);
- req->ibcom->incoming_connection_tx -= 1; /* SYNACK */
/* Deduct it from the packet */
VC_FIELD(MPID_nem_ib_conns[req->responder_rank].vc,
connection_state) |= MPID_NEM_IB_CM_REMOTE_QP_RESET;
@@ -3203,13 +3318,16 @@ int MPID_nem_ib_cm_poll()
(req->cmd), req, synack->responder_req);
MPID_nem_ib_cm_sendq_enqueue(&MPID_nem_ib_cm_sendq, req);
}
- }
- *head_flag = MPID_NEM_IB_CM_HEAD_FLAG_ZERO; /* Clear head-flag */
- /* Clear all possible tail-flag slots */
- MPID_NEM_IB_CM_CLEAR_TAIL_FLAGS(slot);
- //goto common_tail;
- break;
+ *head_flag = MPID_NEM_IB_CM_HEAD_FLAG_ZERO; /* Clear head-flag */
+ /* Clear all possible tail-flag slots */
+ MPID_NEM_IB_CM_CLEAR_TAIL_FLAGS(slot);
+
+ /* Explicitly release CAS word because
+ * ConnectX-3 doesn't support safe CAS with PCI device and CPU */
+ MPID_nem_ib_cm_cas_release(MPID_nem_ib_conns[req->responder_rank].vc);
+ break;
+ }
case MPID_NEM_IB_CM_ALREADY_ESTABLISHED:
case MPID_NEM_IB_CM_RESPONDER_IS_CONNECTING:
{
@@ -3221,13 +3339,14 @@ int MPID_nem_ib_cm_poll()
MPID_nem_ib_cm_cmd_synack_t *synack = (MPID_nem_ib_cm_cmd_synack_t *) slot;
MPID_nem_ib_cm_req_t *req = (MPID_nem_ib_cm_req_t *) synack->initiator_req;
- dprintf
- ("cm_poll,synack detected!,responder_req=%p,responder_rank=%d,ringbuf_index=%d,tx=%d\n",
- synack->responder_req, req->responder_rank, synack->initiator_ringbuf_index,
- req->ibcom->outstanding_connection_tx);
/* These mean the end of CM-op, so decrement here. */
req->ibcom->outstanding_connection_tx -= 1;
req->ibcom->incoming_connection_tx -= 2;
+ dprintf
+ ("cm_poll,established or connecting detected!,%d->%d[%d],responder_req=%p,ringbuf_index=%d,tx=%d\n",
+ req->responder_rank, MPID_nem_ib_myrank, i,
+ synack->responder_req, synack->initiator_ringbuf_index,
+ req->ibcom->outstanding_connection_tx);
/* cm_release calls cm_progress, so we have to clear scratch_pad here. */
*head_flag = MPID_NEM_IB_CM_HEAD_FLAG_ZERO; /* Clear head-flag */
/* Clear all possible tail-flag slots */
@@ -3247,9 +3366,12 @@ int MPID_nem_ib_cm_poll()
* If ref_count == 3, the memory of request will be released on draining SCQ of SYN. */
MPID_nem_ib_cm_request_release(req);
MPID_nem_ib_cm_request_release(req);
+
+ /* Explicitly release CAS word because
+ * ConnectX-3 doesn't support safe CAS with PCI device and CPU */
+ MPID_nem_ib_cm_cas_release(MPID_nem_ib_conns[req->responder_rank].vc);
+ break;
}
- //goto common_tail;
- break;
case MPID_NEM_IB_CM_ACK1:{
volatile MPID_nem_ib_cm_cmd_ack1_t *ack1_tail_flag =
(MPID_nem_ib_cm_cmd_ack1_t *) slot;
@@ -3259,10 +3381,10 @@ int MPID_nem_ib_cm_poll()
MPID_nem_ib_cm_cmd_ack1_t *ack1 = (MPID_nem_ib_cm_cmd_ack1_t *) slot;
MPID_nem_ib_cm_req_t *req = (MPID_nem_ib_cm_req_t *) ack1->responder_req;
- dprintf("cm_poll,ack1 detected!,responder_req=%p,initiator_rank=%d,tx=%d\n",
- ack1->responder_req, req->initiator_rank,
- req->ibcom->outstanding_connection_tx);
req->ibcom->incoming_connection_tx -= 1; /* ACK1 */
+ dprintf("cm_poll,ack1 detected!,%d->%d[%d],responder_req=%p,tx=%d\n",
+ req->initiator_rank, MPID_nem_ib_myrank, i,
+ ack1->responder_req, req->ibcom->outstanding_connection_tx);
/* Deduct it from the packet */
VC_FIELD(MPID_nem_ib_conns[req->initiator_rank].vc,
connection_state) |=
@@ -3357,8 +3479,9 @@ int MPID_nem_ib_cm_poll()
}
MPID_nem_ib_cm_cmd_ack2_t *ack2 = (MPID_nem_ib_cm_cmd_ack2_t *) slot;
MPID_nem_ib_cm_req_t *req = (MPID_nem_ib_cm_req_t *) ack2->initiator_req;
- dprintf("cm_poll,ack2 detected!,req=%p,responder_rank=%d,tx=%d\n", req,
- req->responder_rank, req->ibcom->outstanding_connection_tx);
+ dprintf("cm_poll,ack2 detected!,%d->%d[%d],connection_tx=%d\n",
+ req->responder_rank, MPID_nem_ib_myrank, i,
+ req->ibcom->outstanding_connection_tx);
req->ibcom->incoming_connection_tx -= 1; /* ACK2 */
/* Deduct it from the packet */
if (!
diff --git a/src/mpid/ch3/channels/nemesis/netmod/ib/ib_send.c b/src/mpid/ch3/channels/nemesis/netmod/ib/ib_send.c
index 901dbd8..1ab307b 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/ib/ib_send.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/ib/ib_send.c
@@ -1430,13 +1430,38 @@ int MPID_nem_ib_cm_progress()
MPIU_ERR_CHKANDJUMP(mpi_errno, mpi_errno, MPI_ERR_OTHER,
"**MPID_nem_ib_cm_connect_cas_core");
break;
+ case MPID_NEM_IB_CM_CAS_RELEASE:
+ dprintf
+ ("cm_progress,retry CAS_RELEASE,responder_rank=%d,req=%p,decided=%ld,vt=%ld,backoff=%ld\n",
+ sreq->responder_rank, sreq, sreq->retry_decided,
+ MPID_nem_ib_progress_engine_vt, sreq->retry_backoff);
+ shadow =
+ (MPID_nem_ib_cm_cmd_shadow_t *)
+ MPIU_Malloc(sizeof(MPID_nem_ib_cm_cmd_shadow_t));
+ shadow->type = sreq->state;
+ shadow->req = sreq;
+ mpi_errno = MPID_nem_ib_cm_cas_release_core(sreq->responder_rank, shadow);
+ MPIU_ERR_CHKANDJUMP(mpi_errno, mpi_errno, MPI_ERR_OTHER, "**MPID_nem_ib_cm_cas_release_core");
+ break;
case MPID_NEM_IB_CM_SYN:
if (is_conn_established(sreq->responder_rank)) {
+#if 1
+ /* Explicitly release CAS word because
+ * ConnectX-3 doesn't support safe CAS with PCI device and CPU */
+ MPID_nem_ib_cm_cas_release(MPID_nem_ib_conns[sreq->responder_rank].vc);
+ dprintf("cm_progress,syn,established is true,%d->%d,connection_tx=%d\n",
+ MPID_nem_ib_myrank, sreq->responder_rank,
+ sreq->ibcom->outstanding_connection_tx);
+ is_established = 1;
+ break;
+#else
+ dprintf("cm_progress,syn,switching to cas_release,%d->%d\n",
+ MPID_nem_ib_myrank, sreq->responder_rank);
/* Connection was established while SYN command was enqueued.
* So we replace SYN with CAS_RELEASE, and send. */
/* override req->type */
- ((MPID_nem_ib_cm_cmd_syn_t *) & sreq->cmd)->type = MPID_NEM_IB_CM_CAS_RELEASE;
+ ((MPID_nem_ib_cm_cmd_syn_t *) & sreq->cmd)->type = MPID_NEM_IB_CM_CAS_RELEASE2;
((MPID_nem_ib_cm_cmd_syn_t *) & sreq->cmd)->initiator_rank = MPID_nem_ib_myrank;
/* Initiator does not receive SYNACK and ACK2, so we decrement incoming counter here. */
@@ -1447,7 +1472,7 @@ int MPID_nem_ib_cm_progress()
MPIU_Malloc(sizeof(MPID_nem_ib_cm_cmd_shadow_t));
/* override req->state */
- shadow->type = sreq->state = MPID_NEM_IB_CM_CAS_RELEASE;
+ shadow->type = sreq->state = MPID_NEM_IB_CM_CAS_RELEASE2;
shadow->req = sreq;
dprintf("shadow=%p,shadow->req=%p\n", shadow, shadow->req);
mpi_errno =
@@ -1457,6 +1482,7 @@ int MPID_nem_ib_cm_progress()
0);
MPIU_ERR_CHKANDJUMP(mpi_errno, mpi_errno, MPI_ERR_OTHER,
"**MPID_nem_ib_cm_send_core");
+#endif
break;
}
@@ -1484,7 +1510,10 @@ int MPID_nem_ib_cm_progress()
MPIU_ERR_CHKANDJUMP(mpi_errno, mpi_errno, MPI_ERR_OTHER,
"**MPID_nem_ib_cm_send_core");
break;
- case MPID_NEM_IB_CM_CAS_RELEASE:
+ case MPID_NEM_IB_CM_CAS_RELEASE2:
+ dprintf("cm_progress,sending cas_release2,%d->%d\n", MPID_nem_ib_myrank,
+ sreq->responder_rank);
+
((MPID_nem_ib_cm_cmd_syn_t *) & sreq->cmd)->initiator_rank = MPID_nem_ib_myrank;
shadow =
@@ -1635,14 +1664,20 @@ int MPID_nem_ib_cm_cas_core(int rank, MPID_nem_ib_cm_cmd_shadow_t * shadow)
MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_IB_CM_CAS_CORE);
MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_IB_CM_CAS_CORE);
- dprintf("cm_cas_core,enter\n");
+ MPID_nem_ib_com_t *conp;
+ ibcom_errno = MPID_nem_ib_com_obtain_pointer(MPID_nem_ib_scratch_pad_fds[rank], &conp);
+ MPIU_ERR_CHKANDJUMP(ibcom_errno, mpi_errno, MPI_ERR_OTHER, "**MPID_nem_ib_com_cas_scratch_pad");
+ dprintf("cm_cas_core,%d->%d,conp=%p,remote_addr=%lx\n",
+ MPID_nem_ib_myrank, rank, conp,
+ (unsigned long) conp->icom_rmem[MPID_NEM_IB_COM_SCRATCH_PAD_TO] + 0);
/* Compare-and-swap rank to acquire communication manager port */
ibcom_errno =
MPID_nem_ib_com_cas_scratch_pad(MPID_nem_ib_scratch_pad_fds[rank],
(uint64_t) shadow,
0,
- MPID_NEM_IB_CM_RELEASED, rank,
+ MPID_NEM_IB_CM_RELEASED,
+ MPID_nem_ib_myrank/*rank*/, /*debug*/
&shadow->buf_from, &shadow->buf_from_sz);
MPIU_ERR_CHKANDJUMP(ibcom_errno, mpi_errno, MPI_ERR_OTHER, "**MPID_nem_ib_com_cas_scratch_pad");
MPID_nem_ib_ncqe_scratch_pad += 1;
@@ -1690,7 +1725,8 @@ int MPID_nem_ib_cm_cas(MPIDI_VC_t * vc, uint32_t ask_on_connect)
/* Increment transaction counter here because cm_cas is called only once
* (cm_cas_core might be called more than once when retrying) */
req->ibcom->outstanding_connection_tx += 1;
- dprintf("cm_cas,tx=%d\n", req->ibcom->outstanding_connection_tx);
+ dprintf("cm_cas,%d->%d,connection_tx=%d\n", MPID_nem_ib_myrank, vc->pg_rank,
+ req->ibcom->outstanding_connection_tx);
/* Acquire remote scratch pad */
if (MPID_nem_ib_ncqe_scratch_pad < MPID_NEM_IB_COM_MAX_CQ_CAPACITY &&
@@ -1718,6 +1754,101 @@ int MPID_nem_ib_cm_cas(MPIDI_VC_t * vc, uint32_t ask_on_connect)
goto fn_exit;
}
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_ib_cm_cas_release_core
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_ib_cm_cas_release_core(int rank, MPID_nem_ib_cm_cmd_shadow_t * shadow)
+{
+ int mpi_errno = MPI_SUCCESS;
+ int ibcom_errno;
+
+ MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_IB_CM_CAS_RELEASE_CORE);
+ MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_IB_CM_CAS_RELEASE_CORE);
+
+ MPID_nem_ib_com_t *conp;
+ ibcom_errno = MPID_nem_ib_com_obtain_pointer(MPID_nem_ib_scratch_pad_fds[rank], &conp);
+ MPIU_ERR_CHKANDJUMP(ibcom_errno, mpi_errno, MPI_ERR_OTHER, "**MPID_nem_ib_com_cas_scratch_pad");
+ dprintf("cm_cas_release_core,%d->%d,conp=%p,remote_addr=%lx\n",
+ MPID_nem_ib_myrank, rank, conp,
+ (unsigned long) conp->icom_rmem[MPID_NEM_IB_COM_SCRATCH_PAD_TO] + 0);
+
+ /* Compare-and-swap rank to acquire communication manager port */
+ ibcom_errno =
+ MPID_nem_ib_com_cas_scratch_pad(MPID_nem_ib_scratch_pad_fds[rank],
+ (uint64_t) shadow,
+ 0,
+ MPID_nem_ib_myrank,
+ MPID_NEM_IB_CM_RELEASED/*rank*/, /*debug*/
+ &shadow->buf_from, &shadow->buf_from_sz);
+ MPIU_ERR_CHKANDJUMP(ibcom_errno, mpi_errno, MPI_ERR_OTHER, "**MPID_nem_ib_com_cas_scratch_pad");
+ MPID_nem_ib_ncqe_scratch_pad += 1;
+
+ fn_exit:
+ MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_IB_CM_CAS_RELEASE_CORE);
+ return mpi_errno;
+ fn_fail:
+ goto fn_exit;
+}
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_ib_cm_cas_release
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_ib_cm_cas_release(MPIDI_VC_t * vc)
+{
+ int mpi_errno = MPI_SUCCESS;
+ int ibcom_errno;
+
+ MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_IB_CM_CAS_RELEASE);
+ MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_IB_CM_CAS_RELEASE);
+
+ dprintf("cm_cas_release,enter\n");
+
+ /* Prepare request structure for enqueued case */
+ MPID_nem_ib_cm_req_t *req = MPIU_Malloc(sizeof(MPID_nem_ib_cm_req_t));
+ MPIU_ERR_CHKANDJUMP(!req, mpi_errno, MPI_ERR_OTHER, "**malloc");
+ dprintf("req=%p\n", req);
+ req->state = MPID_NEM_IB_CM_CAS_RELEASE;
+ req->ref_count = 1; /* Released on draining SCQ */
+ req->retry_backoff = 0;
+ req->initiator_rank = MPID_nem_ib_myrank;
+ req->responder_rank = vc->pg_rank;
+ ibcom_errno =
+ MPID_nem_ib_com_obtain_pointer(MPID_nem_ib_scratch_pad_fds[vc->pg_rank], &req->ibcom);
+ MPIU_ERR_CHKANDJUMP(ibcom_errno, mpi_errno, MPI_ERR_OTHER, "**MPID_nem_ib_com_obtain_pointer");
+ dprintf("req->ibcom=%p\n", req->ibcom);
+
+ /* Increment transaction counter here because cm_cas_release is called only once
+ * (cm_cas_release_core might be called more than once when retrying) */
+ req->ibcom->outstanding_connection_tx += 1;
+ dprintf("cm_cas_release,%d->%d,connection_tx=%d\n", MPID_nem_ib_myrank, vc->pg_rank,
+ req->ibcom->outstanding_connection_tx);
+
+ /* Acquire remote scratch pad */
+ if (MPID_nem_ib_ncqe_scratch_pad < MPID_NEM_IB_COM_MAX_CQ_CAPACITY &&
+ req->ibcom->ncom_scratch_pad < MPID_NEM_IB_COM_MAX_SQ_CAPACITY) {
+ MPID_nem_ib_cm_cmd_shadow_t *shadow =
+ (MPID_nem_ib_cm_cmd_shadow_t *) MPIU_Malloc(sizeof(MPID_nem_ib_cm_cmd_shadow_t));
+ shadow->type = req->state;
+ shadow->req = req;
+
+ mpi_errno = MPID_nem_ib_cm_cas_release_core(req->responder_rank, shadow);
+ MPIU_ERR_CHKANDJUMP(mpi_errno, mpi_errno, MPI_ERR_OTHER, "**MPID_nem_ib_cm_cas_release");
+ }
+ else {
+ dprintf("cm_cas_release,enqueue\n");
+ req->retry_decided = MPID_nem_ib_progress_engine_vt;
+ MPID_nem_ib_cm_sendq_enqueue(&MPID_nem_ib_cm_sendq, req);
+ }
+
+ fn_exit:
+ MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_IB_CM_CAS_RELEASE);
+ return mpi_errno;
+ fn_fail:
+ goto fn_exit;
+}
+
/* We're trying to send SYN when syn is one */
#undef FUNCNAME
#define FUNCNAME MPID_nem_ib_cm_cmd_core
-----------------------------------------------------------------------
Summary of changes:
.../ch3/channels/nemesis/netmod/ib/errnames.txt | 2 +
src/mpid/ch3/channels/nemesis/netmod/ib/ib_impl.h | 9 +-
src/mpid/ch3/channels/nemesis/netmod/ib/ib_poll.c | 251 +++++++++++++++-----
src/mpid/ch3/channels/nemesis/netmod/ib/ib_send.c | 143 +++++++++++-
4 files changed, 332 insertions(+), 73 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.2-126-gcd0d417
by noreply@mpich.org 27 Aug '14
by noreply@mpich.org 27 Aug '14
27 Aug '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via cd0d41776875ad95fc9ec16fd76aa52f80deb8ee (commit)
from 1db6b019ed9a9181092ed1168b2cdfa5af65c44b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/cd0d41776875ad95fc9ec16fd76aa52f8…
commit cd0d41776875ad95fc9ec16fd76aa52f80deb8ee
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Wed Aug 20 16:31:23 2014 -0500
Add a failed test for RMA on SHM.
The added test mutex_bench_shm_ordered causes deadlock when
MPIR_PARAM_CH3_ODD_EVEN_CLIQUES is set to 1. It is modified
from mutex_bench_shm by changing the work distribution pattern
from odd/even ranks to continuous ranks.
See #2127.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/test/mpi/rma/Makefile.am b/test/mpi/rma/Makefile.am
index b2bf942..67a99b1 100644
--- a/test/mpi/rma/Makefile.am
+++ b/test/mpi/rma/Makefile.am
@@ -120,6 +120,7 @@ noinst_PROGRAMS = \
mutex_bench \
mutex_bench_shared \
mutex_bench_shm \
+ mutex_bench_shm_ordered\
rma-contig \
badrma \
nb_test \
@@ -176,6 +177,8 @@ mutex_bench_shared_CPPFLAGS = -DUSE_WIN_SHARED $(AM_CPPFLAGS)
mutex_bench_shared_SOURCES = mutex_bench.c mcs-mutex.c mcs-mutex.h
mutex_bench_shm_CPPFLAGS = -DUSE_WIN_ALLOC_SHM $(AM_CPPFLAGS)
mutex_bench_shm_SOURCES = mutex_bench.c mcs-mutex.c mcs-mutex.h
+mutex_bench_shm_ordered_CPPFLAGS = -DUSE_WIN_ALLOC_SHM -DUSE_CONTIGUOUS_RANK $(AM_CPPFLAGS)
+mutex_bench_shm_ordered_SOURCES = mutex_bench.c mcs-mutex.c mcs-mutex.h
linked_list_bench_lock_shr_nocheck_SOURCES = linked_list_bench_lock_shr.c
linked_list_bench_lock_shr_nocheck_CPPFLAGS = -DUSE_MODE_NOCHECK $(AM_CPPFLAGS)
diff --git a/test/mpi/rma/mutex_bench.c b/test/mpi/rma/mutex_bench.c
index 3d2c846..d8a65e8 100644
--- a/test/mpi/rma/mutex_bench.c
+++ b/test/mpi/rma/mutex_bench.c
@@ -45,7 +45,11 @@ int main(int argc, char ** argv) {
for (i = 0; i < NUM_ITER; i++) {
/* Combining trylock and lock here is helpful for testing because it makes
* CAS and Fetch-and-op contend for the tail pointer. */
+#ifdef USE_CONTIGUOUS_RANK
+ if (rank < nproc / 2) {
+#else
if (rank % 2) {
+#endif
int success = 0;
while (!success) {
MCS_Mutex_trylock(mcs_mtx, &success);
diff --git a/test/mpi/rma/testlist.in b/test/mpi/rma/testlist.in
index c1acd24..9e9d3b7 100644
--- a/test/mpi/rma/testlist.in
+++ b/test/mpi/rma/testlist.in
@@ -104,6 +104,7 @@ linked_list_bench_lock_shr_nocheck 4 mpiversion=3.0
mutex_bench 4 mpiversion=3.0
mutex_bench_shared 4 mpiversion=3.0
mutex_bench_shm 4 mpiversion=3.0
+mutex_bench_shm_ordered 4 mpiversion=3.0 xfail=ticket2127
rma-contig 2 mpiversion=3.0 timeLimit=600
badrma 2 mpiversion=3.0
acc-loc 4
-----------------------------------------------------------------------
Summary of changes:
test/mpi/rma/Makefile.am | 3 +++
test/mpi/rma/mutex_bench.c | 4 ++++
test/mpi/rma/testlist.in | 1 +
3 files changed, 8 insertions(+), 0 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.2-125-g1db6b01
by noreply@mpich.org 27 Aug '14
by noreply@mpich.org 27 Aug '14
27 Aug '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 1db6b019ed9a9181092ed1168b2cdfa5af65c44b (commit)
from 665c2db7b2fe4bd6d208278fc3a28a210a18445c (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/1db6b019ed9a9181092ed1168b2cdfa5a…
commit 1db6b019ed9a9181092ed1168b2cdfa5af65c44b
Author: Antonio J. Pena <apenya(a)mcs.anl.gov>
Date: Wed Aug 27 13:54:53 2014 -0500
Change buffers in mprobe's test from static to dynamic
This was making our FreeBSD 32 bit platform unhappy, causing segfaults.
Fixes #2160
Signed-off-by: Ken Raffenetti <raffenet(a)mcs.anl.gov>
diff --git a/test/mpi/pt2pt/mprobe.c b/test/mpi/pt2pt/mprobe.c
index 07edde1..f9abdc6 100644
--- a/test/mpi/pt2pt/mprobe.c
+++ b/test/mpi/pt2pt/mprobe.c
@@ -36,7 +36,7 @@ int main(int argc, char **argv)
int errs = 0;
int found, completed;
int rank, size;
- int sendbuf[LARGE_SZ], recvbuf[LARGE_SZ];
+ int *sendbuf = NULL, *recvbuf = NULL;
int count, i;
#ifdef TEST_MPROBE_ROUTINES
MPI_Message msg;
@@ -61,6 +61,13 @@ int main(int argc, char **argv)
}
#ifdef TEST_MPROBE_ROUTINES
+ sendbuf = (int *) malloc(LARGE_SZ * sizeof(int));
+ recvbuf = (int *) malloc(LARGE_SZ * sizeof(int));
+ if (sendbuf == NULL || recvbuf == NULL) {
+ printf("Error in memory allocation\n");
+ MPI_Abort(MPI_COMM_WORLD, 1);
+ }
+
/* test 0: simple send & mprobe+mrecv */
if (rank == 0) {
sendbuf[0] = 0xdeadbeef;
@@ -515,6 +522,9 @@ int main(int argc, char **argv)
}
MPI_Type_free(&vectype);
+ free(sendbuf);
+ free(recvbuf);
+
/* TODO MPI_ANY_SOURCE and MPI_ANY_TAG should be tested as well */
/* TODO a full range of message sizes should be tested too */
/* TODO threaded tests are also needed, but they should go in a separate
-----------------------------------------------------------------------
Summary of changes:
test/mpi/pt2pt/mprobe.c | 12 +++++++++++-
1 files changed, 11 insertions(+), 1 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.2-124-g665c2db
by noreply@mpich.org 27 Aug '14
by noreply@mpich.org 27 Aug '14
27 Aug '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 665c2db7b2fe4bd6d208278fc3a28a210a18445c (commit)
from 0b5e9027d6e9d0978ec1cf46f07e64057011d3ab (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/665c2db7b2fe4bd6d208278fc3a28a210…
commit 665c2db7b2fe4bd6d208278fc3a28a210a18445c
Author: Norio Yamaguchi <norio.yamaguchi(a)riken.jp>
Date: Tue Aug 19 14:46:33 2014 +0900
Bug-fix: avoid processing unissued ops at end of synchronization calls
After one thread finishes processing all operations in the ops list,
a new RMA operation may be enqueued by another thread in
MPID_Progress_wait(). In such case, it has not got issued yet and we
should avoid processing it at end of synchronization calls.
This situation occurred when running
test/mpi/threads/rma/multirma.c
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpidrma.h b/src/mpid/ch3/include/mpidrma.h
index 1fd76fa..02c0b9c 100644
--- a/src/mpid/ch3/include/mpidrma.h
+++ b/src/mpid/ch3/include/mpidrma.h
@@ -193,6 +193,7 @@ static inline int MPIDI_CH3I_RMA_Ops_alloc_tail(MPIDI_RMA_Ops_list_t *list,
tmp_ptr->next = NULL;
tmp_ptr->dataloop = NULL;
+ tmp_ptr->request = NULL;
MPL_DL_APPEND(*list, tmp_ptr);
diff --git a/src/mpid/ch3/src/ch3u_rma_sync.c b/src/mpid/ch3/src/ch3u_rma_sync.c
index 1f54473..b3c5342 100644
--- a/src/mpid/ch3/src/ch3u_rma_sync.c
+++ b/src/mpid/ch3/src/ch3u_rma_sync.c
@@ -1371,8 +1371,14 @@ int MPIDI_Win_fence(int assert, MPID_Win *win_ptr)
if (mpi_errno != MPI_SUCCESS) MPIU_ERR_POP(mpi_errno);
}
+ /* MT: avoid processing unissued operations enqueued by other threads
+ in rma_list_complete() */
+ curr_ptr = MPIDI_CH3I_RMA_Ops_head(ops_list);
+ if (curr_ptr && !curr_ptr->request)
+ goto finish_up;
MPIU_Assert(MPIDI_CH3I_RMA_Ops_isempty(ops_list));
+ finish_up:
/* wait for all operations from other processes to finish */
if (win_ptr->my_counter)
{
@@ -3768,6 +3774,11 @@ static int do_passive_target_rma(MPID_Win *win_ptr, int target_rank,
/* NOTE: Flush -- If RMA ops are issued eagerly, Send_flush_msg should be
called here and wait_for_rma_done_pkt should be set. */
+ /* MT: avoid processing unissued operations enqueued by other threads
+ in rma_list_complete() */
+ curr_ptr = MPIDI_CH3I_RMA_Ops_head(&win_ptr->targets[target_rank].rma_ops_list);
+ if (curr_ptr && !curr_ptr->request)
+ goto fn_exit;
MPIU_Assert(MPIDI_CH3I_RMA_Ops_isempty(&win_ptr->targets[target_rank].rma_ops_list));
fn_exit:
@@ -5924,6 +5935,13 @@ static inline int rma_list_complete( MPID_Win *win_ptr,
/* In some tests, this hung unless the test ensured that
there was an incomplete request. */
curr_ptr = MPIDI_CH3I_RMA_Ops_head(ops_list);
+
+ /* MT: avoid processing unissued operations enqueued by other
+ threads in MPID_Progress_wait() */
+ if (curr_ptr && !curr_ptr->request) {
+ /* This RMA operation has not been issued yet. */
+ break;
+ }
if (curr_ptr && !MPID_Request_is_complete(curr_ptr->request) ) {
MPIR_T_PVAR_TIMER_START_VAR(RMA, list_block_timer);
mpi_errno = MPID_Progress_wait(&progress_state);
@@ -5964,6 +5982,12 @@ static inline int rma_list_gc( MPID_Win *win_ptr,
curr_ptr = MPIDI_CH3I_RMA_Ops_head(ops_list);
do {
+ /* MT: avoid processing unissued operations enqueued by other threads
+ in rma_list_complete() */
+ if (curr_ptr && !curr_ptr->request) {
+ /* This RMA operation has not been issued yet. */
+ break;
+ }
if (MPID_Request_is_complete(curr_ptr->request)) {
/* Once we find a complete request, we complete
as many as possible until we find an incomplete
@@ -5979,6 +6003,13 @@ static inline int rma_list_gc( MPID_Win *win_ptr,
MPID_Request_release(curr_ptr->request);
MPIDI_CH3I_RMA_Ops_free_and_next(ops_list, &curr_ptr);
nVisit++;
+
+ /* MT: avoid processing unissued operations enqueued by other
+ threads in rma_list_complete() */
+ if (curr_ptr && !curr_ptr->request) {
+ /* This RMA operation has not been issued yet. */
+ break;
+ }
}
while (curr_ptr && curr_ptr != last_elm &&
MPID_Request_is_complete(curr_ptr->request)) ;
-----------------------------------------------------------------------
Summary of changes:
src/mpid/ch3/include/mpidrma.h | 1 +
src/mpid/ch3/src/ch3u_rma_sync.c | 31 +++++++++++++++++++++++++++++++
2 files changed, 32 insertions(+), 0 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.2-123-g0b5e902
by noreply@mpich.org 27 Aug '14
by noreply@mpich.org 27 Aug '14
27 Aug '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 0b5e9027d6e9d0978ec1cf46f07e64057011d3ab (commit)
via fdd179c17c7b943e19f3a0ea7c99d78eabd7a83d (commit)
from e9a4e1c69b0439c56829726203acefc35456e076 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/0b5e9027d6e9d0978ec1cf46f07e64057…
commit 0b5e9027d6e9d0978ec1cf46f07e64057011d3ab
Author: Ken Raffenetti <raffenet(a)mcs.anl.gov>
Date: Tue Aug 19 15:48:26 2014 -0500
portals4: get interface limits at init
PtlNIInit can optionally return the limitations of a network interface.
Get these limits so we can account for things like the max_msg_size.
Signed-off-by: Antonio Pena Monferrer <apenya(a)mcs.anl.gov>
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h
index 9681bae..6130d98 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h
@@ -21,6 +21,7 @@ extern ptl_pt_index_t MPIDI_nem_ptl_control_pt; /* portal for MPICH control mes
extern ptl_handle_eq_t MPIDI_nem_ptl_eq;
extern ptl_handle_md_t MPIDI_nem_ptl_global_md;
+extern ptl_ni_limits_t MPIDI_nem_ptl_ni_limits;
#define MPID_NEM_PTL_MAX_OVERFLOW_DATA 32 /* that's way more than we need */
typedef struct MPID_nem_ptl_pack_overflow
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_init.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_init.c
index f5161db..984f8c1 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_init.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_init.c
@@ -24,6 +24,7 @@ ptl_pt_index_t MPIDI_nem_ptl_get_pt; /* portal for gets by receiver */
ptl_pt_index_t MPIDI_nem_ptl_control_pt; /* portal for MPICH control messages */
ptl_handle_eq_t MPIDI_nem_ptl_eq;
ptl_handle_md_t MPIDI_nem_ptl_global_md;
+ptl_ni_limits_t MPIDI_nem_ptl_ni_limits;
static int ptl_init(MPIDI_PG_t *pg_p, int pg_rank, char **bc_val_p, int *val_max_sz_p);
static int ptl_finalize(void);
@@ -105,7 +106,7 @@ static int ptl_init(MPIDI_PG_t *pg_p, int pg_rank, char **bc_val_p, int *val_max
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlinit", "**ptlinit %s", MPID_nem_ptl_strerror(ret));
ret = PtlNIInit(PTL_IFACE_DEFAULT, PTL_NI_MATCHING | PTL_NI_PHYSICAL,
- PTL_PID_ANY, NULL, NULL, &MPIDI_nem_ptl_ni);
+ PTL_PID_ANY, NULL, &MPIDI_nem_ptl_ni_limits, &MPIDI_nem_ptl_ni);
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlniinit", "**ptlniinit %s", MPID_nem_ptl_strerror(ret));
ret = PtlEQAlloc(MPIDI_nem_ptl_ni, EQ_COUNT, &MPIDI_nem_ptl_eq);
http://git.mpich.org/mpich.git/commitdiff/fdd179c17c7b943e19f3a0ea7c99d78ea…
commit fdd179c17c7b943e19f3a0ea7c99d78eabd7a83d
Author: Ken Raffenetti <raffenet(a)mcs.anl.gov>
Date: Tue Aug 19 15:38:12 2014 -0500
portals4: use datatype lower bounds for non-contig
Similar to [494f597b], take the datatype offset into account during
non-contiguous operations in the Portals4 netmod.
Signed-off-by: Antonio Pena Monferrer <apenya(a)mcs.anl.gov>
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c
index 4e97a8d..3db3bbe 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c
@@ -106,7 +106,7 @@ static int handler_recv_dequeue_complete(const ptl_event_t *e)
MPIU_Memcpy((char *)rreq->dev.user_buf + dt_true_lb, e->start, e->mlength);
} else {
last = e->mlength;
- MPID_Segment_unpack(rreq->dev.segment_ptr, 0, &last, e->start);
+ MPID_Segment_unpack(rreq->dev.segment_ptr, dt_true_lb, &last, e->start);
MPIU_ERR_CHKANDJUMP(last != e->mlength, mpi_errno, MPI_ERR_OTHER, "**dtypemismatch");
}
}
@@ -213,7 +213,7 @@ static int handler_recv_dequeue_large(const ptl_event_t *e)
if (dt_contig) {
MPIU_Memcpy((char *)rreq->dev.user_buf + dt_true_lb, e->start, e->mlength);
} else {
- rreq->dev.segment_first = 0;
+ rreq->dev.segment_first = dt_true_lb;
last = e->mlength;
MPID_Segment_unpack(rreq->dev.segment_ptr, rreq->dev.segment_first, &last, e->start);
MPIU_Assert(last == e->mlength);
@@ -408,13 +408,13 @@ int MPID_nem_ptl_recv_posted(MPIDI_VC_t *vc, MPID_Request *rreq)
MPIU_DBG_MSG(CH3_CHANNEL, VERBOSE, "Small noncontig message");
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;
+ MPID_Segment_init((char *)rreq->dev.user_buf, rreq->dev.user_count, rreq->dev.datatype, rreq->dev.segment_ptr, 0);
+ rreq->dev.segment_first = dt_true_lb;
rreq->dev.segment_size = data_sz;
last = rreq->dev.segment_size;
rreq->dev.iov_count = MPID_IOV_LIMIT;
- MPID_Segment_pack_vector(rreq->dev.segment_ptr, 0, &last, rreq->dev.iov, &rreq->dev.iov_count);
+ MPID_Segment_pack_vector(rreq->dev.segment_ptr, rreq->dev.segment_first, &last, rreq->dev.iov, &rreq->dev.iov_count);
if (last == rreq->dev.segment_size) {
/* entire message fits in IOV */
@@ -447,12 +447,12 @@ int MPID_nem_ptl_recv_posted(MPIDI_VC_t *vc, MPID_Request *rreq)
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_first = dt_true_lb;
rreq->dev.segment_size = data_sz;
last = PTL_LARGE_THRESHOLD;
rreq->dev.iov_count = MPID_IOV_LIMIT;
- MPID_Segment_pack_vector(rreq->dev.segment_ptr, 0, &last, rreq->dev.iov, &rreq->dev.iov_count);
+ MPID_Segment_pack_vector(rreq->dev.segment_ptr, rreq->dev.segment_first, &last, rreq->dev.iov, &rreq->dev.iov_count);
if (last == PTL_LARGE_THRESHOLD) {
/* first chunk fits in IOV */
@@ -659,7 +659,7 @@ int MPID_nem_ptl_lmt_start_recv(MPIDI_VC_t *vc, MPID_Request *rreq, MPID_IOV s_
"**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_first = dt_true_lb;
rreq->dev.segment_size = data_sz - PTL_LARGE_THRESHOLD;
last = PTL_LARGE_THRESHOLD;
MPID_Segment_unpack(rreq->dev.segment_ptr, rreq->dev.segment_first, &last, rreq->dev.tmpbuf);
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c
index 88ff54e..2bb592c 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c
@@ -226,7 +226,7 @@ static int send_msg(ptl_hdr_data_t ssend_flag, struct MPIDI_VC *vc, const void *
sreq->dev.segment_ptr = MPID_Segment_alloc();
MPIU_ERR_CHKANDJUMP1(sreq->dev.segment_ptr == NULL, mpi_errno, MPI_ERR_OTHER, "**nomem", "**nomem %s", "MPID_Segment_alloc");
MPID_Segment_init(buf, count, datatype, sreq->dev.segment_ptr, 0);
- sreq->dev.segment_first = 0;
+ sreq->dev.segment_first = dt_true_lb;
sreq->dev.segment_size = data_sz;
last = sreq->dev.segment_size;
@@ -256,7 +256,7 @@ static int send_msg(ptl_hdr_data_t ssend_flag, struct MPIDI_VC *vc, const void *
/* IOV is not long enough to describe entire message */
MPIU_DBG_MSG(CH3_CHANNEL, VERBOSE, " IOV too long: using bounce buffer");
MPIU_CHKPMEM_MALLOC(REQ_PTL(sreq)->chunk_buffer[0], void *, data_sz, mpi_errno, "chunk_buffer");
- sreq->dev.segment_first = 0;
+ sreq->dev.segment_first = dt_true_lb;
last = data_sz;
MPID_Segment_pack(sreq->dev.segment_ptr, sreq->dev.segment_first, &last, REQ_PTL(sreq)->chunk_buffer[0]);
MPIU_Assert(last == sreq->dev.segment_size);
@@ -304,7 +304,7 @@ static int send_msg(ptl_hdr_data_t ssend_flag, struct MPIDI_VC *vc, const void *
sreq->dev.segment_ptr = MPID_Segment_alloc();
MPIU_ERR_CHKANDJUMP1(sreq->dev.segment_ptr == NULL, mpi_errno, MPI_ERR_OTHER, "**nomem", "**nomem %s", "MPID_Segment_alloc");
MPID_Segment_init(buf, count, datatype, sreq->dev.segment_ptr, 0);
- sreq->dev.segment_first = 0;
+ sreq->dev.segment_first = dt_true_lb;
sreq->dev.segment_size = data_sz;
last = PTL_LARGE_THRESHOLD;
-----------------------------------------------------------------------
Summary of changes:
.../channels/nemesis/netmod/portals4/ptl_impl.h | 1 +
.../channels/nemesis/netmod/portals4/ptl_init.c | 3 ++-
.../channels/nemesis/netmod/portals4/ptl_recv.c | 16 ++++++++--------
.../channels/nemesis/netmod/portals4/ptl_send.c | 6 +++---
4 files changed, 14 insertions(+), 12 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.2-121-ge9a4e1c
by noreply@mpich.org 27 Aug '14
by noreply@mpich.org 27 Aug '14
27 Aug '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via e9a4e1c69b0439c56829726203acefc35456e076 (commit)
via 3a6de022076fc2863eae2daf14c283fc99c3e065 (commit)
from 9c3e5475e4e3006e1db1f112805bdb48e1130075 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/e9a4e1c69b0439c56829726203acefc35…
commit e9a4e1c69b0439c56829726203acefc35456e076
Author: Pavan Balaji <balaji(a)anl.gov>
Date: Fri Aug 22 18:29:14 2014 -0500
Cleanup uninstall-local.
We were not cleaning up some of the soft links created during make
uninstall.
Signed-off-by: Antonio J. Pena <apenya(a)mcs.anl.gov>
diff --git a/Makefile.am b/Makefile.am
index d2b798f..118005c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -264,7 +264,12 @@ DISTCLEANFILES += config.system
clean-local: $(CLEAN_LOCAL_TARGETS)
uninstall-local:
- rm -f ${DESTDIR}${bindir}/@MPICPP_NAME@
+ for x in @MPICPP_NAME@ @MPIF90_NAME@ @MPIF77_NAME@ ; do \
+ rm -f ${DESTDIR}${bindir}/$$x ; \
+ done ; \
+ for x in mpl opa mpich fmpich mpichf90 mpichcxx ; do \
+ rm -f ${DESTDIR}${libdir}/lib$$x@SHLIB_EXT@ ; \
+ done
# --------------------------------------------------------------------------
# coverage rules
http://git.mpich.org/mpich.git/commitdiff/3a6de022076fc2863eae2daf14c283fc9…
commit 3a6de022076fc2863eae2daf14c283fc99c3e065
Author: Pavan Balaji <balaji(a)anl.gov>
Date: Fri Aug 22 15:53:57 2014 -0500
Move removal of mpic++ to uninstall-local.
We were trying to clean up mpic++ (which is a soft link to mpicxx)
during "make clean". This is incorrect since mpic++ is located in the
install directory, which we should not touch during make clean. This
patch moves such cleanup to make uninstall.
Signed-off-by: Antonio J. Pena <apenya(a)mcs.anl.gov>
diff --git a/Makefile.am b/Makefile.am
index 6af4b62..d2b798f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -262,6 +262,8 @@ DISTCLEANFILES += config.system
# we can only have one clean-local, so we hook into it via conditionally
# defined variables in the dependencies section
clean-local: $(CLEAN_LOCAL_TARGETS)
+
+uninstall-local:
rm -f ${DESTDIR}${bindir}/@MPICPP_NAME@
# --------------------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
Makefile.am | 9 ++++++++-
1 files changed, 8 insertions(+), 1 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.2-119-g9c3e547
by noreply@mpich.org 27 Aug '14
by noreply@mpich.org 27 Aug '14
27 Aug '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 9c3e5475e4e3006e1db1f112805bdb48e1130075 (commit)
from ffa9c6d675c8463f903aa0b186f883f7c5cd218f (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/9c3e5475e4e3006e1db1f112805bdb48e…
commit 9c3e5475e4e3006e1db1f112805bdb48e1130075
Author: Pavan Balaji <balaji(a)anl.gov>
Date: Tue Aug 26 16:26:50 2014 -0500
Initial HCOLL integration.
Most of the hcoll code is in a separate directory, expect for a few
changes in mainline mpich.
1. The comm structure stores some hcoll specific data structures.
2. The nemesis and sock progress engines need to poke the hcoll progress.
3. CH3 added comm creation hooks into hcoll.
Signed-off-by: Devendar Bureddy <devendar(a)mellanox.com>
Signed-off-by: Antonio J. Pena <apenya(a)mcs.anl.gov>
diff --git a/src/include/mpiimpl.h b/src/include/mpiimpl.h
index 64043e4..f3ede9e 100644
--- a/src/include/mpiimpl.h
+++ b/src/include/mpiimpl.h
@@ -237,6 +237,10 @@ static MPIU_DBG_INLINE_KEYWORD void MPIUI_Memcpy(void * dst, const void * src, s
/* Routines for memory management */
#include "mpimem.h"
+#if defined HAVE_LIBHCOLL
+#include "../mpid/common/hcoll/hcollpre.h"
+#endif
+
/*
* Use MPIU_SYSCALL to wrap system calls; this provides a convenient point
* for timing the calls and keeping track of the use of system calls.
@@ -1250,6 +1254,11 @@ typedef struct MPID_Comm {
#ifdef MPID_HAS_HETERO
int is_hetero;
#endif
+
+#if defined HAVE_LIBHCOLL
+ hcoll_comm_priv_t hcoll_priv;
+#endif /* HAVE_LIBHCOLL */
+
/* Other, device-specific information */
#ifdef MPID_DEV_COMM_DECL
MPID_DEV_COMM_DECL
diff --git a/src/mpid/ch3/channels/nemesis/src/ch3_progress.c b/src/mpid/ch3/channels/nemesis/src/ch3_progress.c
index 7232361..13c2fa5 100644
--- a/src/mpid/ch3/channels/nemesis/src/ch3_progress.c
+++ b/src/mpid/ch3/channels/nemesis/src/ch3_progress.c
@@ -464,6 +464,13 @@ int MPIDI_CH3I_Progress (MPID_Progress_state *progress_state, int is_blocking)
MPIDI_CH3_Progress_signal_completion();
}
+#if defined HAVE_LIBHCOLL
+ if (MPIR_CVAR_CH3_ENABLE_HCOLL) {
+ mpi_errno = hcoll_do_progress();
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+ }
+#endif /* HAVE_LIBHCOLL */
+
/* in the case of progress_wait, bail out if anything completed (CC-1) */
if (is_blocking) {
int completion_count = OPA_load_int(&MPIDI_CH3I_progress_completion_count);
diff --git a/src/mpid/ch3/channels/sock/src/ch3_progress.c b/src/mpid/ch3/channels/sock/src/ch3_progress.c
index fec55f7..bfe2c21 100644
--- a/src/mpid/ch3/channels/sock/src/ch3_progress.c
+++ b/src/mpid/ch3/channels/sock/src/ch3_progress.c
@@ -88,6 +88,13 @@ static int MPIDI_CH3i_Progress_test(void)
mpi_errno = MPIDU_Sched_progress(&made_progress);
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+#if defined HAVE_LIBHCOLL
+ if (MPIR_CVAR_CH3_ENABLE_HCOLL) {
+ mpi_errno = hcoll_do_progress();
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+ }
+#endif /* HAVE_LIBHCOLL */
+
mpi_errno = MPIDU_Sock_wait(MPIDI_CH3I_sock_set, 0, &event);
if (mpi_errno == MPI_SUCCESS)
@@ -184,6 +191,18 @@ static int MPIDI_CH3i_Progress_wait(MPID_Progress_state * progress_state)
break;
}
+#if defined HAVE_LIBHCOLL
+ if (MPIR_CVAR_CH3_ENABLE_HCOLL) {
+ mpi_errno = hcoll_do_progress();
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+
+ /* if hcoll completed any pending requests, break. Else,
+ * we are expecting at least one more socket event */
+ if (progress_state->ch.completion_count != MPIDI_CH3I_progress_completion_count)
+ break;
+ }
+#endif /* HAVE_LIBHCOLL */
+
# ifdef MPICH_IS_THREADED
/* The logic for this case is just complicated enough that
diff --git a/src/mpid/ch3/src/ch3u_comm.c b/src/mpid/ch3/src/ch3u_comm.c
index 0ceb952..fc3278a 100644
--- a/src/mpid/ch3/src/ch3u_comm.c
+++ b/src/mpid/ch3/src/ch3u_comm.c
@@ -6,6 +6,26 @@
#include "mpidimpl.h"
#include "mpl_utlist.h"
+#if defined HAVE_LIBHCOLL
+#include "../../common/hcoll/hcoll.h"
+#endif
+
+/*
+=== BEGIN_MPI_T_CVAR_INFO_BLOCK ===
+
+cvars:
+ - name : MPIR_CVAR_CH3_ENABLE_HCOLL
+ category : CH3
+ type : boolean
+ default : false
+ class : none
+ verbosity : MPI_T_VERBOSITY_USER_BASIC
+ scope : MPI_T_SCOPE_ALL_EQ
+ description : >-
+ If true, enable HCOLL collectives.
+
+=== END_MPI_T_CVAR_INFO_BLOCK ===
+*/
static int register_hook_finalize(void *param);
static int comm_created(MPID_Comm *comm, void *param);
@@ -44,6 +64,16 @@ int MPIDI_CH3I_Comm_init(void)
/* register hooks for keeping track of communicators */
mpi_errno = MPIDI_CH3U_Comm_register_create_hook(comm_created, NULL);
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+
+#if defined HAVE_LIBHCOLL
+ if (MPIR_CVAR_CH3_ENABLE_HCOLL) {
+ mpi_errno = MPIDI_CH3U_Comm_register_create_hook(hcoll_comm_create, NULL);
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+ mpi_errno = MPIDI_CH3U_Comm_register_destroy_hook(hcoll_comm_destroy, NULL);
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+ }
+#endif
+
mpi_errno = MPIDI_CH3U_Comm_register_destroy_hook(comm_destroyed, NULL);
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
diff --git a/src/mpid/common/Makefile.mk b/src/mpid/common/Makefile.mk
index bed34a5..e33e7ae 100644
--- a/src/mpid/common/Makefile.mk
+++ b/src/mpid/common/Makefile.mk
@@ -2,6 +2,7 @@
## vim: set ft=automake :
##
## (C) 2011 by Argonne National Laboratory.
+## (C) 2014 by Mellanox Technologies, Inc.
## See COPYRIGHT in top-level directory.
##
@@ -9,4 +10,4 @@ include $(top_srcdir)/src/mpid/common/datatype/Makefile.mk
include $(top_srcdir)/src/mpid/common/sched/Makefile.mk
include $(top_srcdir)/src/mpid/common/sock/Makefile.mk
include $(top_srcdir)/src/mpid/common/thread/Makefile.mk
-
+include $(top_srcdir)/src/mpid/common/hcoll/Makefile.mk
diff --git a/src/mpid/common/hcoll/Makefile.mk b/src/mpid/common/hcoll/Makefile.mk
new file mode 100644
index 0000000..405292a
--- /dev/null
+++ b/src/mpid/common/hcoll/Makefile.mk
@@ -0,0 +1,19 @@
+## -*- Mode: Makefile; -*-
+## vim: set ft=automake :
+##
+## (C) 2014 Mellanox Technologies, Inc.
+## See COPYRIGHT in top-level directory.
+##
+
+if BUILD_HCOLL
+
+mpi_core_sources += \
+ src/mpid/common/hcoll/hcoll_init.c \
+ src/mpid/common/hcoll/hcoll_ops.c \
+ src/mpid/common/hcoll/hcoll_rte.c
+
+noinst_HEADERS += \
+ src/mpid/common/hcoll/hcoll.h \
+ src/mpid/common/hcoll/hcoll_dtypes.h
+
+endif BUILD_HCOLL
diff --git a/src/mpid/common/hcoll/errnames.txt b/src/mpid/common/hcoll/errnames.txt
new file mode 100644
index 0000000..3eee82f
--- /dev/null
+++ b/src/mpid/common/hcoll/errnames.txt
@@ -0,0 +1,6 @@
+#
+# HCOLL errors
+#
+**hcoll_wrong_arg:Error in hcolrte api: wrong null argument
+**hcoll_wrong_arg %p %d:Error in hcolrte api: wrong null argument (ec_h.handle = %p, ec_h.rank = %d)
+**null_buff_ptr:Error in hcolrte api: buffer pointer is NULL for non DTE_ZERO INLINE data representation
diff --git a/src/mpid/common/hcoll/hcoll.h b/src/mpid/common/hcoll/hcoll.h
new file mode 100644
index 0000000..2c09320
--- /dev/null
+++ b/src/mpid/common/hcoll/hcoll.h
@@ -0,0 +1,31 @@
+#ifndef _HCOLL_H_
+#define _HCOLL_H_
+
+#include "mpidimpl.h"
+#include "hcoll/api/hcoll_api.h"
+#include "hcoll/api/hcoll_constants.h"
+
+extern int world_comm_destroying;
+
+int hcoll_comm_create(MPID_Comm * comm, void *param);
+int hcoll_comm_destroy(MPID_Comm * comm, void *param);
+
+int hcoll_Barrier(MPID_Comm * comm_ptr, int *err);
+int hcoll_Bcast(void *buffer, int count, MPI_Datatype datatype, int root,
+ MPID_Comm * comm_ptr, int *err);
+int hcoll_Allgather(const void *sbuf, int scount, MPI_Datatype sdtype,
+ void *rbuf, int rcount, MPI_Datatype rdtype, MPID_Comm * comm_ptr, int *err);
+int hcoll_Allreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
+ MPI_Op op, MPID_Comm * comm_ptr, int *err);
+
+int hcoll_Ibarrier_req(MPID_Comm * comm_ptr, MPID_Request ** request);
+int hcoll_Ibcast_req(void *buffer, int count, MPI_Datatype datatype, int root,
+ MPID_Comm * comm_ptr, MPID_Request ** request);
+int hcoll_Iallgather_req(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
+ int recvcount, MPI_Datatype recvtype, MPID_Comm * comm_ptr,
+ MPID_Request ** request);
+int hcoll_Iallreduce_req(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
+ MPI_Op op, MPID_Comm * comm_ptr, MPID_Request ** request);
+int hcoll_do_progress(void);
+
+#endif
diff --git a/src/mpid/common/hcoll/hcoll_dtypes.h b/src/mpid/common/hcoll/hcoll_dtypes.h
new file mode 100644
index 0000000..65ef6e3
--- /dev/null
+++ b/src/mpid/common/hcoll/hcoll_dtypes.h
@@ -0,0 +1,67 @@
+#ifndef _HCOLL_DTYPES_H_
+#define _HCOLL_DTYPES_H_
+#include "hcoll/api/hcoll_dte.h"
+
+static dte_data_representation_t mpi_dtype_2_dte_dtype(MPI_Datatype datatype)
+{
+ switch (datatype) {
+ case MPI_SIGNED_CHAR:
+ return DTE_BYTE;
+ case MPI_SHORT:
+ return DTE_INT16;
+ case MPI_INT:
+ return DTE_INT32;
+ case MPI_LONG:
+ case MPI_LONG_LONG:
+ return DTE_INT64;
+ /* return DTE_INT128; */
+ case MPI_BYTE:
+ case MPI_UNSIGNED_CHAR:
+ return DTE_UBYTE;
+ case MPI_UNSIGNED_SHORT:
+ return DTE_UINT16;
+ case MPI_UNSIGNED:
+ return DTE_UINT32;
+ case MPI_UNSIGNED_LONG:
+ case MPI_UNSIGNED_LONG_LONG:
+ return DTE_UINT64;
+ /* return DTE_UINT128; */
+ case MPI_FLOAT:
+ return DTE_FLOAT32;
+ case MPI_DOUBLE:
+ return DTE_FLOAT64;
+ case MPI_LONG_DOUBLE:
+ return DTE_FLOAT128;
+ default:
+ return DTE_ZERO;
+ }
+}
+
+static hcoll_dte_op_t *mpi_op_2_dte_op(MPI_Op op)
+{
+ switch (op) {
+ case MPI_MAX:
+ return &hcoll_dte_op_max;
+ case MPI_MIN:
+ return &hcoll_dte_op_min;
+ case MPI_SUM:
+ return &hcoll_dte_op_sum;
+ case MPI_PROD:
+ return &hcoll_dte_op_prod;
+ case MPI_LAND:
+ return &hcoll_dte_op_land;
+ case MPI_BAND:
+ return &hcoll_dte_op_band;
+ case MPI_LOR:
+ return &hcoll_dte_op_lor;
+ case MPI_BOR:
+ return &hcoll_dte_op_bor;
+ case MPI_LXOR:
+ return &hcoll_dte_op_lxor;
+ case MPI_BXOR:
+ return &hcoll_dte_op_bxor;
+ default:
+ return &hcoll_dte_op_null;
+ }
+}
+#endif
diff --git a/src/mpid/common/hcoll/hcoll_init.c b/src/mpid/common/hcoll/hcoll_init.c
new file mode 100644
index 0000000..2bae31d
--- /dev/null
+++ b/src/mpid/common/hcoll/hcoll_init.c
@@ -0,0 +1,212 @@
+#include "hcoll.h"
+
+static int hcoll_initialized = 0;
+int hcoll_enable = 1;
+int hcoll_enable_barrier = 1;
+int hcoll_enable_bcast = 1;
+int hcoll_enable_allgather = 1;
+int hcoll_enable_allreduce = 1;
+int hcoll_enable_ibarrier = 1;
+int hcoll_enable_ibcast = 1;
+int hcoll_enable_iallgather = 1;
+int hcoll_enable_iallreduce = 1;
+int hcoll_comm_attr_keyval = MPI_KEYVAL_INVALID;
+int world_comm_destroying = 0;
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_destroy
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+
+int hcoll_destroy(void *param ATTRIBUTE((unused)))
+{
+ if (1 == hcoll_initialized) {
+ hcoll_finalize();
+ if (MPI_KEYVAL_INVALID != hcoll_comm_attr_keyval) {
+ MPIR_Comm_free_keyval_impl(hcoll_comm_attr_keyval);
+ hcoll_comm_attr_keyval = MPI_KEYVAL_INVALID;
+ }
+ }
+ hcoll_initialized = 0;
+ return 0;
+}
+
+static int hcoll_comm_attr_del_fn(MPI_Comm comm, int keyval, void *attr_val, void *extra_data)
+{
+ int mpi_errno;
+ if (MPI_COMM_WORLD == comm) {
+ world_comm_destroying = 1;
+ }
+ mpi_errno = hcoll_group_destroy_notify(attr_val);
+ return mpi_errno;
+}
+
+#define CHECK_ENABLE_ENV_VARS(nameEnv, name) \
+ do { \
+ envar = getenv("HCOLL_ENABLE_" #nameEnv); \
+ if (NULL != envar) { \
+ hcoll_enable_##name = atoi(envar); \
+ MPIU_DBG_MSG_D(CH3_OTHER, VERBOSE, "HCOLL_ENABLE_" #nameEnv " = %d\n", hcoll_enable_##name); \
+ } \
+ } while (0)
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_initialize
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int hcoll_initialize(void)
+{
+ int mpi_errno;
+ char *envar;
+ mpi_errno = MPI_SUCCESS;
+ envar = getenv("HCOLL_ENABLE");
+ if (NULL != envar) {
+ hcoll_enable = atoi(envar);
+ }
+ if (0 == hcoll_enable) {
+ goto fn_exit;
+ }
+ hcoll_rte_fns_setup();
+ /*set INT_MAX/2 as tag_base here by the moment.
+ * Need to think more about it.
+ * The tag space should be positive, from > ~30 to MPI_TAG_UB value.
+ * It looks reasonable to set MPI_TAG_UB as base but it doesn't work for ofacm tags
+ * (probably due to wrong conversions from uint to int). That's why I set INT_MAX/2 instead of MPI_TAG_UB.
+ * BUT: it won't work for collectives whose sequence number reaches INT_MAX/2 number. In that case tags become negative.
+ * Moreover, it even won't work than 0 < (INT_MAX/2 - sequence number) < 30 because it can interleave with internal mpich coll tags.
+ */
+ hcoll_set_runtime_tag_offset(INT_MAX / 2, MPI_TAG_UB);
+ if (mpi_errno)
+ MPIU_ERR_POP(mpi_errno);
+ mpi_errno = hcoll_init();
+ if (mpi_errno)
+ MPIU_ERR_POP(mpi_errno);
+
+ hcoll_initialized = 1;
+ MPIR_Add_finalize(hcoll_destroy, 0, 0);
+
+ mpi_errno =
+ MPIR_Comm_create_keyval_impl(MPI_NULL_COPY_FN, hcoll_comm_attr_del_fn,
+ &hcoll_comm_attr_keyval, NULL);
+ if (mpi_errno)
+ MPIU_ERR_POP(mpi_errno);
+
+ CHECK_ENABLE_ENV_VARS(BARRIER, barrier);
+ CHECK_ENABLE_ENV_VARS(BCAST, bcast);
+ CHECK_ENABLE_ENV_VARS(ALLGATHER, allgather);
+ CHECK_ENABLE_ENV_VARS(ALLREDUCE, allreduce);
+ CHECK_ENABLE_ENV_VARS(IBARRIER, ibarrier);
+ CHECK_ENABLE_ENV_VARS(IBCAST, ibcast);
+ CHECK_ENABLE_ENV_VARS(IALLGATHER, iallgather);
+ CHECK_ENABLE_ENV_VARS(IALLREDUCE, iallreduce);
+ fn_exit:
+ return mpi_errno;
+ fn_fail:
+ goto fn_exit;
+}
+
+
+#define INSTALL_COLL_WRAPPER(check_name, name) \
+ if (hcoll_enable_##check_name && (NULL != hcoll_collectives.coll_##check_name)) { \
+ comm_ptr->coll_fns->name = hcoll_##name; \
+ MPIU_DBG_MSG(CH3_OTHER,VERBOSE, #name " wrapper installed"); \
+ }
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_comm_create
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int hcoll_comm_create(MPID_Comm * comm_ptr, void *param)
+{
+ int mpi_errno;
+ int num_ranks;
+ int context_destroyed;
+ mpi_errno = MPI_SUCCESS;
+ if (0 == hcoll_initialized) {
+ mpi_errno = hcoll_initialize();
+ if (mpi_errno)
+ MPIU_ERR_POP(mpi_errno);
+ }
+ if (0 == hcoll_enable) {
+ goto fn_exit;
+ }
+ num_ranks = comm_ptr->local_size;
+ if ((MPID_INTRACOMM != comm_ptr->comm_kind) || (2 > num_ranks)) {
+ comm_ptr->hcoll_priv.is_hcoll_init = 0;
+ goto fn_exit;
+ }
+ comm_ptr->hcoll_priv.hcoll_context = hcoll_create_context((rte_grp_handle_t) comm_ptr);
+ if (NULL == comm_ptr->hcoll_priv.hcoll_context) {
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "Couldn't create hcoll context.");
+ goto fn_fail;
+ }
+ mpi_errno =
+ MPIR_Comm_set_attr_impl(comm_ptr, hcoll_comm_attr_keyval,
+ (void *) (comm_ptr->hcoll_priv.hcoll_context), MPIR_ATTR_PTR);
+ if (mpi_errno) {
+ hcoll_destroy_context(comm_ptr->hcoll_priv.hcoll_context,
+ (rte_grp_handle_t) comm_ptr, &context_destroyed);
+ MPIU_Assert(context_destroyed);
+ comm_ptr->hcoll_priv.is_hcoll_init = 0;
+ MPIU_ERR_POP(mpi_errno);
+ }
+ comm_ptr->hcoll_priv.hcoll_origin_coll_fns = comm_ptr->coll_fns;
+ comm_ptr->coll_fns = (MPID_Collops *) MPIU_Malloc(sizeof(MPID_Collops));
+ memset(comm_ptr->coll_fns, 0, sizeof(MPID_Collops));
+ if (comm_ptr->hcoll_priv.hcoll_origin_coll_fns != 0) {
+ memcpy(comm_ptr->coll_fns, comm_ptr->hcoll_priv.hcoll_origin_coll_fns,
+ sizeof(MPID_Collops));
+ }
+ INSTALL_COLL_WRAPPER(barrier, Barrier);
+ INSTALL_COLL_WRAPPER(bcast, Bcast);
+ INSTALL_COLL_WRAPPER(allreduce, Allreduce);
+ INSTALL_COLL_WRAPPER(allgather, Allgather);
+ INSTALL_COLL_WRAPPER(ibarrier, Ibarrier_req);
+ INSTALL_COLL_WRAPPER(ibcast, Ibcast_req);
+ INSTALL_COLL_WRAPPER(iallreduce, Iallreduce_req);
+ INSTALL_COLL_WRAPPER(iallgather, Iallgather_req);
+
+ comm_ptr->hcoll_priv.is_hcoll_init = 1;
+ fn_exit:
+ return mpi_errno;
+ fn_fail:
+ goto fn_exit;
+}
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_comm_destroy
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int hcoll_comm_destroy(MPID_Comm * comm_ptr, void *param)
+{
+ int mpi_errno;
+ int context_destroyed;
+ if (0 == hcoll_enable) {
+ goto fn_exit;
+ }
+ mpi_errno = MPI_SUCCESS;
+ context_destroyed = 0;
+ if ((NULL != comm_ptr) && (0 != comm_ptr->hcoll_priv.is_hcoll_init)) {
+ if (NULL != comm_ptr->coll_fns) {
+ MPIU_Free(comm_ptr->coll_fns);
+ }
+ comm_ptr->coll_fns = comm_ptr->hcoll_priv.hcoll_origin_coll_fns;
+ hcoll_destroy_context(comm_ptr->hcoll_priv.hcoll_context,
+ (rte_grp_handle_t) comm_ptr, &context_destroyed);
+ MPIU_Assert(context_destroyed);
+ comm_ptr->hcoll_priv.is_hcoll_init = 0;
+ }
+ fn_exit:
+ return mpi_errno;
+ fn_fail:
+ goto fn_exit;
+}
+
+int hcoll_do_progress(void)
+{
+ if (1 == hcoll_initialized) {
+ hcoll_progress_fn();
+ }
+
+ return MPI_SUCCESS;
+}
diff --git a/src/mpid/common/hcoll/hcoll_ops.c b/src/mpid/common/hcoll/hcoll_ops.c
new file mode 100644
index 0000000..0719ff6
--- /dev/null
+++ b/src/mpid/common/hcoll/hcoll_ops.c
@@ -0,0 +1,361 @@
+#include "hcoll.h"
+#include "hcoll_dtypes.h"
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_Barrier
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int hcoll_Barrier(MPID_Comm * comm_ptr, int *err)
+{
+ int rc;
+ MPI_Comm comm = comm_ptr->handle;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING HCOL BARRIER.");
+ rc = hcoll_collectives.coll_barrier(comm_ptr->hcoll_priv.hcoll_context);
+ if (HCOLL_SUCCESS != rc) {
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK BARRIER.");
+ void *ptr = comm_ptr->coll_fns->Barrier;
+ comm_ptr->coll_fns->Barrier =
+ (NULL != comm_ptr->hcoll_priv.hcoll_origin_coll_fns) ?
+ comm_ptr->hcoll_priv.hcoll_origin_coll_fns->Barrier : NULL;
+ rc = MPI_Barrier(comm);
+ comm_ptr->coll_fns->Barrier = ptr;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK BARRIER - done.");
+ }
+ return rc;
+}
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_Bcast
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int hcoll_Bcast(void *buffer, int count, MPI_Datatype datatype, int root,
+ MPID_Comm * comm_ptr, int *err)
+{
+ dte_data_representation_t dtype;
+ int rc;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING HCOLL BCAST.");
+ dtype = mpi_dtype_2_dte_dtype(datatype);
+ int is_homogeneous = 1, use_fallback = 0;
+ MPI_Comm comm = comm_ptr->handle;
+#ifdef MPID_HAS_HETERO
+ if (comm_ptr->is_hetero)
+ is_homogeneous = 0;
+#endif
+ if (HCOL_DTE_IS_COMPLEX(dtype) || HCOL_DTE_IS_ZERO(dtype) || (0 == is_homogeneous)) {
+ /*If we are here then datatype is not simple predefined datatype */
+ /*In future we need to add more complex mapping to the dte_data_representation_t */
+ /* Now use fallback */
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "unsupported data layout, calling fallback bcast.");
+ use_fallback = 1;
+ }
+ else {
+ rc = hcoll_collectives.coll_bcast(buffer, count, dtype, root,
+ comm_ptr->hcoll_priv.hcoll_context);
+ if (HCOLL_SUCCESS != rc) {
+ use_fallback = 1;
+ }
+ }
+ if (1 == use_fallback) {
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK BCAST - done.");
+ void *ptr = comm_ptr->coll_fns->Bcast;
+ comm_ptr->coll_fns->Bcast =
+ (NULL != comm_ptr->hcoll_priv.hcoll_origin_coll_fns) ?
+ comm_ptr->hcoll_priv.hcoll_origin_coll_fns->Bcast : NULL;
+ rc = MPI_Bcast(buffer, count, datatype, root, comm);
+ comm_ptr->coll_fns->Bcast = ptr;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK BCAST - done.");
+ }
+ return rc;
+}
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_Allreduce
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int hcoll_Allreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
+ MPI_Op op, MPID_Comm * comm_ptr, int *err)
+{
+ dte_data_representation_t Dtype;
+ hcoll_dte_op_t *Op;
+ int rc;
+ int is_homogeneous = 1, use_fallback = 0;
+ MPI_Comm comm = comm_ptr->handle;
+#ifdef MPID_HAS_HETERO
+ if (comm_ptr->is_hetero)
+ is_homogeneous = 0;
+#endif
+
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING HCOL ALLREDUCE.");
+ Dtype = mpi_dtype_2_dte_dtype(datatype);
+ Op = mpi_op_2_dte_op(op);
+ if (MPI_IN_PLACE == sendbuf) {
+ sendbuf = HCOLL_IN_PLACE;
+ }
+ if (HCOL_DTE_IS_COMPLEX(Dtype) || HCOL_DTE_IS_ZERO(Dtype) || (0 == is_homogeneous) ||
+ (HCOL_DTE_OP_NULL == Op->id)) {
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "unsupported data layout, calling fallback allreduce.");
+ use_fallback = 1;
+ }
+ else {
+ rc = hcoll_collectives.coll_allreduce(sendbuf, recvbuf, count, Dtype, Op,
+ comm_ptr->hcoll_priv.hcoll_context);
+ if (HCOLL_SUCCESS != rc) {
+ use_fallback = 1;
+ }
+ }
+ if (1 == use_fallback) {
+ if (HCOLL_IN_PLACE == sendbuf) {
+ sendbuf = MPI_IN_PLACE;
+ }
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK ALLREDUCE.");
+ void *ptr = comm_ptr->coll_fns->Allreduce;
+ comm_ptr->coll_fns->Allreduce =
+ (NULL != comm_ptr->hcoll_priv.hcoll_origin_coll_fns) ?
+ comm_ptr->hcoll_priv.hcoll_origin_coll_fns->Allreduce : NULL;
+ rc = MPI_Allreduce(sendbuf, recvbuf, count, datatype, op, comm);
+ comm_ptr->coll_fns->Allreduce = ptr;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK ALLREDUCE done.");
+ }
+ return rc;
+}
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_Allgather
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int hcoll_Allgather(const void *sbuf, int scount, MPI_Datatype sdtype,
+ void *rbuf, int rcount, MPI_Datatype rdtype, MPID_Comm * comm_ptr, int *err)
+{
+ int is_homogeneous = 1, use_fallback = 0;
+ MPI_Comm comm = comm_ptr->handle;
+ dte_data_representation_t stype;
+ dte_data_representation_t rtype;
+ int rc;
+ is_homogeneous = 1;
+#ifdef MPID_HAS_HETERO
+ if (comm_ptr->is_hetero)
+ is_homogeneous = 0;
+#endif
+
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING HCOLL ALLGATHER.");
+ stype = mpi_dtype_2_dte_dtype(sdtype);
+ rtype = mpi_dtype_2_dte_dtype(rdtype);
+ if (MPI_IN_PLACE == sbuf) {
+ sbuf = HCOLL_IN_PLACE;
+ }
+ if (HCOL_DTE_IS_COMPLEX(stype) || HCOL_DTE_IS_ZERO(stype) || HCOL_DTE_IS_ZERO(rtype) ||
+ HCOL_DTE_IS_COMPLEX(rtype) || is_homogeneous == 0) {
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "unsupported data layout; calling fallback allgather.");
+ use_fallback = 1;
+ }
+ else {
+ rc = hcoll_collectives.coll_allgather(sbuf, scount, stype, rbuf, rcount, rtype,
+ comm_ptr->hcoll_priv.hcoll_context);
+ if (HCOLL_SUCCESS != rc) {
+ use_fallback = 1;
+ }
+ }
+ if (1 == use_fallback) {
+ if (HCOLL_IN_PLACE == sbuf) {
+ sbuf = MPI_IN_PLACE;
+ }
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK ALLGATHER.");
+ void *ptr = comm_ptr->coll_fns->Allgather;
+ comm_ptr->coll_fns->Allgather =
+ (NULL != comm_ptr->hcoll_priv.hcoll_origin_coll_fns) ?
+ comm_ptr->hcoll_priv.hcoll_origin_coll_fns->Allgather : NULL;
+ rc = MPI_Allgather(sbuf, scount, sdtype, rbuf, rcount, rdtype, comm);
+ comm_ptr->coll_fns->Allgather = ptr;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK ALLGATHER - done.");
+ }
+ return rc;
+}
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_Ibarrier_req
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int hcoll_Ibarrier_req(MPID_Comm * comm_ptr, MPID_Request ** request)
+{
+ int rc;
+ void **rt_handle;
+ MPI_Comm comm;
+ MPI_Request req;
+ comm = comm_ptr->handle;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING HCOL IBARRIER.");
+ rt_handle = (void **) request;
+ rc = hcoll_collectives.coll_ibarrier(comm_ptr->hcoll_priv.hcoll_context, rt_handle);
+ if (HCOLL_SUCCESS != rc) {
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK IBARRIER.");
+ void *ptr = comm_ptr->coll_fns->Ibarrier_req;
+ comm_ptr->coll_fns->Ibarrier_req =
+ (comm_ptr->hcoll_priv.hcoll_origin_coll_fns !=
+ NULL) ? comm_ptr->hcoll_priv.hcoll_origin_coll_fns->Ibarrier_req : NULL;
+ rc = MPI_Ibarrier(comm, &req);
+ MPID_Request_get_ptr(req, *request);
+ comm_ptr->coll_fns->Ibarrier_req = ptr;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK IBARRIER - done.");
+ }
+ return rc;
+}
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_Ibcast_req
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int hcoll_Ibcast_req(void *buffer, int count, MPI_Datatype datatype, int root,
+ MPID_Comm * comm_ptr, MPID_Request ** request)
+{
+ int rc;
+ void **rt_handle;
+ dte_data_representation_t dtype;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING HCOLL IBCAST.");
+ dtype = mpi_dtype_2_dte_dtype(datatype);
+ int is_homogeneous = 1, use_fallback = 0;
+ MPI_Comm comm = comm_ptr->handle;
+ MPI_Request req;
+ rt_handle = (void **) request;
+#ifdef MPID_HAS_HETERO
+ if (comm_ptr->is_hetero)
+ is_homogeneous = 0;
+#endif
+ if (HCOL_DTE_IS_COMPLEX(dtype) || HCOL_DTE_IS_ZERO(dtype) || (0 == is_homogeneous)) {
+ /*If we are here then datatype is not simple predefined datatype */
+ /*In future we need to add more complex mapping to the dte_data_representation_t */
+ /* Now use fallback */
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "unsupported data layout, calling fallback ibcast.");
+ use_fallback = 1;
+ }
+ else {
+ rc = hcoll_collectives.coll_ibcast(buffer, count, dtype, root, rt_handle,
+ comm_ptr->hcoll_priv.hcoll_context);
+ if (HCOLL_SUCCESS != rc) {
+ use_fallback = 1;
+ }
+ }
+ if (1 == use_fallback) {
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK IBCAST - done.");
+ void *ptr = comm_ptr->coll_fns->Ibcast_req;
+ comm_ptr->coll_fns->Ibcast_req =
+ (comm_ptr->hcoll_priv.hcoll_origin_coll_fns !=
+ NULL) ? comm_ptr->hcoll_priv.hcoll_origin_coll_fns->Ibcast_req : NULL;
+ rc = MPI_Ibcast(buffer, count, datatype, root, comm, &req);
+ MPID_Request_get_ptr(req, *request);
+ comm_ptr->coll_fns->Ibcast_req = ptr;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK IBCAST - done.");
+ }
+ return rc;
+}
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_Iallgather_req
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int hcoll_Iallgather_req(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
+ int recvcount, MPI_Datatype recvtype, MPID_Comm * comm_ptr,
+ MPID_Request ** request)
+{
+ int is_homogeneous = 1, use_fallback = 0;
+ MPI_Comm comm = comm_ptr->handle;
+ dte_data_representation_t stype;
+ dte_data_representation_t rtype;
+ int rc;
+ void **rt_handle;
+ MPI_Request req;
+ rt_handle = (void **) request;
+
+ is_homogeneous = 1;
+#ifdef MPID_HAS_HETERO
+ if (comm_ptr->is_hetero)
+ is_homogeneous = 0;
+#endif
+
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING HCOLL IALLGATHER.");
+ stype = mpi_dtype_2_dte_dtype(sendtype);
+ rtype = mpi_dtype_2_dte_dtype(recvtype);
+ if (MPI_IN_PLACE == sendbuf) {
+ sendbuf = HCOLL_IN_PLACE;
+ }
+ if (HCOL_DTE_IS_COMPLEX(stype) || HCOL_DTE_IS_ZERO(stype) || HCOL_DTE_IS_ZERO(rtype) ||
+ HCOL_DTE_IS_COMPLEX(rtype) || is_homogeneous == 0) {
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "unsupported data layout; calling fallback iallgather.");
+ use_fallback = 1;
+ }
+ else {
+ rc = hcoll_collectives.coll_iallgather(sendbuf, sendcount, stype, recvbuf, recvcount, rtype,
+ comm_ptr->hcoll_priv.hcoll_context, rt_handle);
+ if (HCOLL_SUCCESS != rc) {
+ use_fallback = 1;
+ }
+ }
+ if (1 == use_fallback) {
+ if (HCOLL_IN_PLACE == sendbuf) {
+ sendbuf = MPI_IN_PLACE;
+ }
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK IALLGATHER.");
+ void *ptr = comm_ptr->coll_fns->Iallgather_req;
+ comm_ptr->coll_fns->Iallgather_req =
+ (comm_ptr->hcoll_priv.hcoll_origin_coll_fns !=
+ NULL) ? comm_ptr->hcoll_priv.hcoll_origin_coll_fns->Iallgather_req : NULL;
+ rc = MPI_Iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, &req);
+ MPID_Request_get_ptr(req, *request);
+ comm_ptr->coll_fns->Iallgather_req = ptr;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK IALLGATHER - done.");
+ }
+ return rc;
+}
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_Iallreduce_req
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int hcoll_Iallreduce_req(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
+ MPI_Op op, MPID_Comm * comm_ptr, MPID_Request ** request)
+{
+ dte_data_representation_t Dtype;
+ hcoll_dte_op_t *Op;
+ int rc;
+ void **rt_handle;
+ MPI_Request req;
+ int is_homogeneous = 1, use_fallback = 0;
+ MPI_Comm comm = comm_ptr->handle;
+ rt_handle = (void **) request;
+#ifdef MPID_HAS_HETERO
+ if (comm_ptr->is_hetero)
+ is_homogeneous = 0;
+#endif
+
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING HCOL IALLREDUCE.");
+ Dtype = mpi_dtype_2_dte_dtype(datatype);
+ Op = mpi_op_2_dte_op(op);
+ if (MPI_IN_PLACE == sendbuf) {
+ sendbuf = HCOLL_IN_PLACE;
+ }
+ if (HCOL_DTE_IS_COMPLEX(Dtype) || HCOL_DTE_IS_ZERO(Dtype) || (0 == is_homogeneous) ||
+ (HCOL_DTE_OP_NULL == Op->id)) {
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "unsupported data layout, calling fallback iallreduce.");
+ use_fallback = 1;
+ }
+ else {
+ rc = hcoll_collectives.coll_iallreduce(sendbuf, recvbuf, count, Dtype, Op,
+ comm_ptr->hcoll_priv.hcoll_context, rt_handle);
+ if (HCOLL_SUCCESS != rc) {
+ use_fallback = 1;
+ }
+ }
+ if (1 == use_fallback) {
+ if (HCOLL_IN_PLACE == sendbuf) {
+ sendbuf = MPI_IN_PLACE;
+ }
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK IALLREDUCE.");
+ void *ptr = comm_ptr->coll_fns->Iallreduce_req;
+ comm_ptr->coll_fns->Iallreduce_req =
+ (comm_ptr->hcoll_priv.hcoll_origin_coll_fns !=
+ NULL) ? comm_ptr->hcoll_priv.hcoll_origin_coll_fns->Iallreduce_req : NULL;
+ rc = MPI_Iallreduce(sendbuf, recvbuf, count, datatype, op, comm, &req);
+ MPID_Request_get_ptr(req, *request);
+ comm_ptr->coll_fns->Iallreduce_req = ptr;
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "RUNNING FALLBACK IALLREDUCE done.");
+ }
+ return rc;
+}
diff --git a/src/mpid/common/hcoll/hcoll_rte.c b/src/mpid/common/hcoll/hcoll_rte.c
new file mode 100644
index 0000000..b6a3ea7
--- /dev/null
+++ b/src/mpid/common/hcoll/hcoll_rte.c
@@ -0,0 +1,434 @@
+#include "hcoll.h"
+#include "hcoll/api/hcoll_dte.h"
+#include <assert.h>
+
+static int recv_nb(dte_data_representation_t data,
+ uint32_t count,
+ void *buffer,
+ rte_ec_handle_t, rte_grp_handle_t, uint32_t tag, rte_request_handle_t * req);
+
+static int send_nb(dte_data_representation_t data,
+ uint32_t count,
+ void *buffer,
+ rte_ec_handle_t ec_h,
+ rte_grp_handle_t grp_h, uint32_t tag, rte_request_handle_t * req);
+
+static int test(rte_request_handle_t * request, int *completed);
+
+static int ec_handle_compare(rte_ec_handle_t handle_1,
+ rte_grp_handle_t
+ group_handle_1,
+ rte_ec_handle_t handle_2, rte_grp_handle_t group_handle_2);
+
+static int get_ec_handles(int num_ec,
+ int *ec_indexes, rte_grp_handle_t, rte_ec_handle_t * ec_handles);
+
+static int get_my_ec(rte_grp_handle_t, rte_ec_handle_t * ec_handle);
+
+static int group_size(rte_grp_handle_t group);
+static int my_rank(rte_grp_handle_t grp_h);
+static int ec_on_local_node(rte_ec_handle_t ec, rte_grp_handle_t group);
+static rte_grp_handle_t get_world_group_handle(void);
+static uint32_t jobid(void);
+
+static void *get_coll_handle(void);
+static int coll_handle_test(void *handle);
+static void coll_handle_free(void *handle);
+static void coll_handle_complete(void *handle);
+static int group_id(rte_grp_handle_t group);
+
+static int world_rank(rte_grp_handle_t grp_h, rte_ec_handle_t ec);
+
+#undef FUNCNAME
+#define FUNCNAME progress
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static void progress(void)
+{
+ int ret;
+
+ if (0 == world_comm_destroying) {
+ MPID_Progress_test();
+ }
+ else {
+ /* FIXME: The hcoll library needs to be updated to return
+ * error codes. The progress function pointer right now
+ * expects that the function returns void. */
+ ret = hcoll_do_progress();
+ assert(ret == MPI_SUCCESS);
+ }
+}
+
+#undef FUNCNAME
+#define FUNCNAME init_module_fns
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static void init_module_fns(void)
+{
+ hcoll_rte_functions.send_fn = send_nb;
+ hcoll_rte_functions.recv_fn = recv_nb;
+ hcoll_rte_functions.ec_cmp_fn = ec_handle_compare;
+ hcoll_rte_functions.get_ec_handles_fn = get_ec_handles;
+ hcoll_rte_functions.rte_group_size_fn = group_size;
+ hcoll_rte_functions.test_fn = test;
+ hcoll_rte_functions.rte_my_rank_fn = my_rank;
+ hcoll_rte_functions.rte_ec_on_local_node_fn = ec_on_local_node;
+ hcoll_rte_functions.rte_world_group_fn = get_world_group_handle;
+ hcoll_rte_functions.rte_jobid_fn = jobid;
+ hcoll_rte_functions.rte_progress_fn = progress;
+ hcoll_rte_functions.rte_get_coll_handle_fn = get_coll_handle;
+ hcoll_rte_functions.rte_coll_handle_test_fn = coll_handle_test;
+ hcoll_rte_functions.rte_coll_handle_free_fn = coll_handle_free;
+ hcoll_rte_functions.rte_coll_handle_complete_fn = coll_handle_complete;
+ hcoll_rte_functions.rte_group_id_fn = group_id;
+ hcoll_rte_functions.rte_world_rank_fn = world_rank;
+}
+
+#undef FUNCNAME
+#define FUNCNAME hcoll_rte_fns_setup
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+void hcoll_rte_fns_setup(void)
+{
+ init_module_fns();
+}
+
+/* This function converts dte_general_representation data into regular iovec array which is
+ used in rml
+ */
+static inline int count_total_dte_repeat_entries(struct dte_data_representation_t *data)
+{
+ unsigned int i;
+
+ struct dte_generalized_iovec_t *dte_iovec = data->rep.general_rep->data_representation.data;
+ int total_entries_number = 0;
+ for (i = 0; i < dte_iovec->repeat_count; i++) {
+ total_entries_number += dte_iovec->repeat[i].n_elements;
+ }
+ return total_entries_number;
+}
+
+#undef FUNCNAME
+#define FUNCNAME recv_nb
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int recv_nb(struct dte_data_representation_t data,
+ uint32_t count,
+ void *buffer,
+ rte_ec_handle_t ec_h,
+ rte_grp_handle_t grp_h, uint32_t tag, rte_request_handle_t * req)
+{
+ int mpi_errno;
+ MPI_Datatype dtype;
+ MPID_Request *request;
+ MPID_Comm *comm;
+ int context_offset;
+ size_t size;
+ mpi_errno = MPI_SUCCESS;
+ context_offset = MPID_CONTEXT_INTRA_COLL;
+ comm = (MPID_Comm *) grp_h;
+ if (!ec_h.handle) {
+ MPIU_ERR_SETANDJUMP2(mpi_errno, MPI_ERR_OTHER, "**hcoll_wrong_arg",
+ "**hcoll_wrong_arg %p %d", ec_h.handle, ec_h.rank);
+ }
+
+ if (HCOL_DTE_IS_INLINE(data)) {
+ if (!buffer && !HCOL_DTE_IS_ZERO(data)) {
+ MPIU_ERR_SETANDJUMP(mpi_errno, MPI_ERR_OTHER, "**null_buff_ptr");
+ }
+ size = (size_t) data.rep.in_line_rep.data_handle.in_line.packed_size * count / 8;
+ dtype = MPI_CHAR;
+ mpi_errno = MPID_Irecv(buffer, size, dtype, ec_h.rank, tag, comm, context_offset, &request);
+ req->data = (void *) request;
+ req->status = HCOLRTE_REQUEST_ACTIVE;
+ }
+ else {
+ int total_entries_number;
+ int i;
+ unsigned int j;
+ void *buf;
+ uint64_t len;
+ int repeat_count;
+ struct dte_struct_t *repeat;
+ if (NULL != buffer) {
+ /* We have a full data description & buffer pointer simultaneously.
+ * It is ambiguous. Throw a warning since the user might have made a
+ * mistake with data reps */
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "Warning: buffer_pointer != NULL for NON-inline data "
+ "representation: buffer_pointer is ignored");
+ }
+ total_entries_number = count_total_dte_repeat_entries(&data);
+ repeat = data.rep.general_rep->data_representation.data->repeat;
+ repeat_count = data.rep.general_rep->data_representation.data->repeat_count;
+ for (i = 0; i < repeat_count; i++) {
+ for (j = 0; j < repeat[i].n_elements; j++) {
+ char *repeat_unit = (char *) &repeat[i];
+ buf = (void *) (repeat_unit + repeat[i].elements[j].base_offset);
+ len = repeat[i].elements[j].packed_size;
+ recv_nb(DTE_BYTE, len, buf, ec_h, grp_h, tag, req);
+ }
+ }
+ }
+ fn_exit:
+ return mpi_errno;
+ fn_fail:
+ return HCOLL_ERROR;
+}
+
+#undef FUNCNAME
+#define FUNCNAME send_nb
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int send_nb(dte_data_representation_t data,
+ uint32_t count,
+ void *buffer,
+ rte_ec_handle_t ec_h,
+ rte_grp_handle_t grp_h, uint32_t tag, rte_request_handle_t * req)
+{
+ int mpi_errno;
+ MPI_Datatype dtype;
+ MPID_Request *request;
+ MPID_Comm *comm;
+ int context_offset;
+ size_t size;
+ mpi_errno = MPI_SUCCESS;
+ context_offset = MPID_CONTEXT_INTRA_COLL;
+ comm = (MPID_Comm *) grp_h;
+ if (!ec_h.handle) {
+ MPIU_ERR_SETANDJUMP2(mpi_errno, MPI_ERR_OTHER, "**hcoll_wrong_arg",
+ "**hcoll_wrong_arg %p %d", ec_h.handle, ec_h.rank);
+ }
+
+ if (HCOL_DTE_IS_INLINE(data)) {
+ if (!buffer && !HCOL_DTE_IS_ZERO(data)) {
+ MPIU_ERR_SETANDJUMP(mpi_errno, MPI_ERR_OTHER, "**null_buff_ptr");
+ }
+ size = (size_t) data.rep.in_line_rep.data_handle.in_line.packed_size * count / 8;
+ dtype = MPI_CHAR;
+ mpi_errno = MPID_Isend(buffer, size, dtype, ec_h.rank, tag, comm, context_offset, &request);
+ req->data = (void *) request;
+ req->status = HCOLRTE_REQUEST_ACTIVE;
+ }
+ else {
+ int total_entries_number;
+ int i;
+ unsigned int j;
+ void *buf;
+ uint64_t len;
+ int repeat_count;
+ struct dte_struct_t *repeat;
+ if (NULL != buffer) {
+ /* We have a full data description & buffer pointer simultaneously.
+ * It is ambiguous. Throw a warning since the user might have made a
+ * mistake with data reps */
+ MPIU_DBG_MSG(CH3_OTHER, VERBOSE, "Warning: buffer_pointer != NULL for NON-inline data "
+ "representation: buffer_pointer is ignored");
+ }
+ total_entries_number = count_total_dte_repeat_entries(&data);
+ repeat = data.rep.general_rep->data_representation.data->repeat;
+ repeat_count = data.rep.general_rep->data_representation.data->repeat_count;
+ for (i = 0; i < repeat_count; i++) {
+ for (j = 0; j < repeat[i].n_elements; j++) {
+ char *repeat_unit = (char *) &repeat[i];
+ buf = (void *) (repeat_unit + repeat[i].elements[j].base_offset);
+ len = repeat[i].elements[j].packed_size;
+ send_nb(DTE_BYTE, len, buf, ec_h, grp_h, tag, req);
+ }
+ }
+ }
+ fn_exit:
+ return mpi_errno;
+ fn_fail:
+ return HCOLL_ERROR;
+}
+
+#undef FUNCNAME
+#define FUNCNAME test
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int test(rte_request_handle_t * request, int *completed)
+{
+ MPID_Request *req;
+ req = (MPID_Request *) request->data;
+ if (HCOLRTE_REQUEST_ACTIVE != request->status) {
+ *completed = true;
+ return HCOLL_SUCCESS;
+ }
+
+ *completed = (int) MPID_Request_is_complete(req);
+ if (*completed) {
+ MPID_Request_release(req);
+ request->status = HCOLRTE_REQUEST_DONE;
+ }
+
+ return HCOLL_SUCCESS;
+}
+
+#undef FUNCNAME
+#define FUNCNAME ec_handle_compare
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int ec_handle_compare(rte_ec_handle_t handle_1,
+ rte_grp_handle_t
+ group_handle_1,
+ rte_ec_handle_t handle_2, rte_grp_handle_t group_handle_2)
+{
+ return handle_1.handle == handle_2.handle;
+}
+
+#undef FUNCNAME
+#define FUNCNAME get_ec_handles
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int get_ec_handles(int num_ec,
+ int *ec_indexes, rte_grp_handle_t grp_h, rte_ec_handle_t * ec_handles)
+{
+ int i;
+ MPID_Comm *comm;
+ comm = (MPID_Comm *) grp_h;
+ for (i = 0; i < num_ec; i++) {
+ ec_handles[i].rank = ec_indexes[i];
+ ec_handles[i].handle = (void *) (comm->vcr[ec_indexes[i]]);
+ }
+ return HCOLL_SUCCESS;
+}
+
+#undef FUNCNAME
+#define FUNCNAME get_my_ec
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int get_my_ec(rte_grp_handle_t grp_h, rte_ec_handle_t * ec_handle)
+{
+ MPID_Comm *comm;
+ comm = (MPID_Comm *) grp_h;
+ int my_rank = MPIR_Comm_rank(comm);
+ ec_handle->handle = (void *) (comm->vcr[my_rank]);
+ ec_handle->rank = my_rank;
+ return HCOLL_SUCCESS;
+}
+
+
+#undef FUNCNAME
+#define FUNCNAME group_size
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int group_size(rte_grp_handle_t grp_h)
+{
+ return MPIR_Comm_size((MPID_Comm *) grp_h);
+}
+
+#undef FUNCNAME
+#define FUNCNAME my_rank
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int my_rank(rte_grp_handle_t grp_h)
+{
+ return MPIR_Comm_rank((MPID_Comm *) grp_h);
+}
+
+#undef FUNCNAME
+#define FUNCNAME ec_on_local_node
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int ec_on_local_node(rte_ec_handle_t ec, rte_grp_handle_t group)
+{
+ MPID_Comm *comm;
+ MPID_Node_id_t nodeid, my_nodeid;
+ int my_rank;
+ comm = (MPID_Comm *) group;
+ MPID_Get_node_id(comm, ec.rank, &nodeid);
+ my_rank = MPIR_Comm_rank(comm);
+ MPID_Get_node_id(comm, my_rank, &my_nodeid);
+ return (nodeid == my_nodeid);
+}
+
+
+#undef FUNCNAME
+#define FUNCNAME get_world_group_handle
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static rte_grp_handle_t get_world_group_handle(void)
+{
+ return (rte_grp_handle_t) (MPIR_Process.comm_world);
+}
+
+#undef FUNCNAME
+#define FUNCNAME jobid
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static uint32_t jobid(void)
+{
+ /* not used currently */
+ return 0;
+}
+
+#undef FUNCNAME
+#define FUNCNAME group_id
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int group_id(rte_grp_handle_t group)
+{
+ MPID_Comm *comm;
+ comm = (MPID_Comm *) group;
+ return comm->context_id;
+}
+
+#undef FUNCNAME
+#define FUNCNAME get_coll_handle
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static void *get_coll_handle(void)
+{
+ MPID_Request *req;
+ req = MPID_Request_create();
+ req->kind = MPID_COLL_REQUEST;
+ return (void *) req;
+}
+
+#undef FUNCNAME
+#define FUNCNAME coll_handle_test
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int coll_handle_test(void *handle)
+{
+ int completed;
+ MPID_Request *req;
+ req = (MPID_Request *) handle;
+ completed = (int) MPID_Request_is_complete(req);
+ return completed;
+}
+
+#undef FUNCNAME
+#define FUNCNAME coll_handle_free
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static void coll_handle_free(void *handle)
+{
+ MPID_Request *req;
+ if (NULL != handle) {
+ req = (MPID_Request *) handle;
+ MPID_Request_release(req);
+ }
+}
+
+#undef FUNCNAME
+#define FUNCNAME coll_handle_complete
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static void coll_handle_complete(void *handle)
+{
+ MPID_Request *req;
+ if (NULL != handle) {
+ req = (MPID_Request *) handle;
+ MPID_Request_set_completed(req);
+ }
+}
+
+#undef FUNCNAME
+#define FUNCNAME world_rank
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+static int world_rank(rte_grp_handle_t grp_h, rte_ec_handle_t ec)
+{
+ return ((MPID_VCR) ec.handle)->pg_rank;
+}
diff --git a/src/mpid/common/hcoll/hcollpre.h b/src/mpid/common/hcoll/hcollpre.h
new file mode 100644
index 0000000..03ec11d
--- /dev/null
+++ b/src/mpid/common/hcoll/hcollpre.h
@@ -0,0 +1,10 @@
+#ifndef _HCOLLPRE_H_
+#define _HCOLLPRE_H_
+
+typedef struct {
+ int is_hcoll_init;
+ struct MPID_Collops *hcoll_origin_coll_fns;
+ void *hcoll_context;
+} hcoll_comm_priv_t;
+
+#endif
diff --git a/src/mpid/common/hcoll/subconfigure.m4 b/src/mpid/common/hcoll/subconfigure.m4
new file mode 100644
index 0000000..a55e5dd
--- /dev/null
+++ b/src/mpid/common/hcoll/subconfigure.m4
@@ -0,0 +1,13 @@
+[#] start of __file__
+
+AC_DEFUN([PAC_SUBCFG_PREREQ_]PAC_SUBCFG_AUTO_SUFFIX,[
+ PAC_SET_HEADER_LIB_PATH(hcoll)
+ PAC_CHECK_HEADER_LIB([hcoll/api/hcoll_api.h],[hcoll],[hcoll_init],[have_hcoll=yes],[have_hcoll=no])
+ AM_CONDITIONAL([BUILD_HCOLL],[test "$have_hcoll" = "yes"])
+])dnl end PREREQ
+
+AC_DEFUN([PAC_SUBCFG_BODY_]PAC_SUBCFG_AUTO_SUFFIX,[
+# nothing to do
+])dnl end _BODY
+
+[#] end of __file__
-----------------------------------------------------------------------
Summary of changes:
src/include/mpiimpl.h | 9 +
src/mpid/ch3/channels/nemesis/src/ch3_progress.c | 7 +
src/mpid/ch3/channels/sock/src/ch3_progress.c | 19 +
src/mpid/ch3/src/ch3u_comm.c | 30 ++
src/mpid/common/Makefile.mk | 3 +-
src/mpid/common/hcoll/Makefile.mk | 19 +
src/mpid/common/hcoll/errnames.txt | 6 +
src/mpid/common/hcoll/hcoll.h | 31 ++
src/mpid/common/hcoll/hcoll_dtypes.h | 67 ++++
src/mpid/common/hcoll/hcoll_init.c | 212 +++++++++++
src/mpid/common/hcoll/hcoll_ops.c | 361 ++++++++++++++++++
src/mpid/common/hcoll/hcoll_rte.c | 434 ++++++++++++++++++++++
src/mpid/common/hcoll/hcollpre.h | 10 +
src/mpid/common/hcoll/subconfigure.m4 | 13 +
14 files changed, 1220 insertions(+), 1 deletions(-)
create mode 100644 src/mpid/common/hcoll/Makefile.mk
create mode 100644 src/mpid/common/hcoll/errnames.txt
create mode 100644 src/mpid/common/hcoll/hcoll.h
create mode 100644 src/mpid/common/hcoll/hcoll_dtypes.h
create mode 100644 src/mpid/common/hcoll/hcoll_init.c
create mode 100644 src/mpid/common/hcoll/hcoll_ops.c
create mode 100644 src/mpid/common/hcoll/hcoll_rte.c
create mode 100644 src/mpid/common/hcoll/hcollpre.h
create mode 100644 src/mpid/common/hcoll/subconfigure.m4
hooks/post-receive
--
MPICH primary repository
1
0