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
June 2015
- 1 participants
- 58 discussions
[mpich] MPICH primary repository branch, master, updated. v3.2b3-100-g394d46b
by noreply@mpich.org 16 Jun '15
by noreply@mpich.org 16 Jun '15
16 Jun '15
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 394d46b764838dc9193efc012ea297cab3a33aac (commit)
via c80f2c4e3ab28ac8b80c88d670a4a424bd2c49d4 (commit)
from 93b114e3437d991eed22af6b9e2aede3d330401b (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/394d46b764838dc9193efc012ea297cab…
commit 394d46b764838dc9193efc012ea297cab3a33aac
Author: Ken Raffenetti <raffenet(a)mcs.anl.gov>
Date: Mon Jun 15 08:33:56 2015 -0500
netmod/portals4: fix per target event counting
Ignore local completion events (SENDs) when counting outstanding
ops to remote targets.
No reviewer.
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/rptl.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/rptl.c
index c3742fc..0a3294b 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/rptl.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/rptl.c
@@ -547,7 +547,8 @@ static int get_event_info(ptl_event_t * event, struct rptl **ret_rptl, struct rp
op = (struct rptl_op *) event->user_ptr;
rptl_info.origin_events_left++;
- op->target->issued_data_ops--;
+ if (event->type != PTL_EVENT_SEND)
+ op->target->issued_data_ops--;
/* see if there are any pending ops to be issued */
ret = poke_progress();
http://git.mpich.org/mpich.git/commitdiff/c80f2c4e3ab28ac8b80c88d670a4a424b…
commit c80f2c4e3ab28ac8b80c88d670a4a424bd2c49d4
Author: Ken Raffenetti <raffenet(a)mcs.anl.gov>
Date: Mon Jun 15 08:33:05 2015 -0500
netmod/portals4: remove unused variable
No reviewer.
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 8647a8c..0e136c7 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h
@@ -43,7 +43,6 @@ typedef int (* event_handler_fn)(const ptl_event_t *e);
typedef struct {
struct MPID_nem_ptl_pack_overflow overflow[MPID_NEM_PTL_NUM_CHUNK_BUFFERS];
- int noncontig;
int large;
ptl_handle_md_t md;
ptl_handle_me_t put_me;
@@ -68,7 +67,6 @@ static inline MPID_nem_ptl_req_area * REQ_PTL(MPID_Request *req) {
REQ_PTL(req_)->overflow[i].len = 0; \
REQ_PTL(req_)->chunk_buffer[i] = NULL; \
} \
- REQ_PTL(req_)->noncontig = FALSE; \
REQ_PTL(req_)->large = FALSE; \
REQ_PTL(req_)->md = PTL_INVALID_HANDLE; \
REQ_PTL(req_)->put_me = PTL_INVALID_HANDLE; \
-----------------------------------------------------------------------
Summary of changes:
.../channels/nemesis/netmod/portals4/ptl_impl.h | 2 --
.../ch3/channels/nemesis/netmod/portals4/rptl.c | 3 ++-
2 files changed, 2 insertions(+), 3 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.2b3-98-g93b114e
by noreply@mpich.org 15 Jun '15
by noreply@mpich.org 15 Jun '15
15 Jun '15
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 93b114e3437d991eed22af6b9e2aede3d330401b (commit)
via 9d3ddf8a530bf146228acd36a866a138fbf6966b (commit)
via 2ae64ae52299d5448ab500659dc3ac6f6f146ed4 (commit)
via 266a3adfb88d3338b4b2a9b61aff02a018997250 (commit)
from 9d508d5d83f35978ffaaae1557280969ff47201c (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/93b114e3437d991eed22af6b9e2aede3d…
commit 93b114e3437d991eed22af6b9e2aede3d330401b
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Sun Jun 14 14:58:35 2015 -0500
Bug-fix in Request_load_recv_iov() when initial value of segment_first is not 0.
Originally Request_load_recv_iov() function assumes that
the initial value of req->dev.segment_first is always zero,
which is not correct if we set it to a non-zero value for
streaming the RMA operations.
The way Request_load_recv_iov() works is that, it is triggered
multiple times for the same receiving request until all data is
received. During this process, req->dev.segment_first is rewritten
to the current offset value. When the initial value of
req->dev.segment_first is non-zero, we need another variable
to store that value until the receiving process for this request
is finished. Here we use a static variable in this function to
reach the purpose.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_request.c b/src/mpid/ch3/src/ch3u_request.c
index 0be196d..b2cd014 100644
--- a/src/mpid/ch3/src/ch3u_request.c
+++ b/src/mpid/ch3/src/ch3u_request.c
@@ -300,6 +300,8 @@ int MPIDI_CH3U_Request_load_send_iov(MPID_Request * const sreq,
return mpi_errno;
}
+#define MPIDI_LOAD_RECV_IOV_ORIG_SEGMENT_FIRST_UNSET (-1)
+
/*
* MPIDI_CH3U_Request_load_recv_iov()
*
@@ -315,10 +317,16 @@ int MPIDI_CH3U_Request_load_send_iov(MPID_Request * const sreq,
int MPIDI_CH3U_Request_load_recv_iov(MPID_Request * const rreq)
{
MPI_Aint last;
+ static MPIDI_msg_sz_t orig_segment_first = MPIDI_LOAD_RECV_IOV_ORIG_SEGMENT_FIRST_UNSET;
int mpi_errno = MPI_SUCCESS;
MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3U_REQUEST_LOAD_RECV_IOV);
MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3U_REQUEST_LOAD_RECV_IOV);
+
+ if (orig_segment_first == MPIDI_LOAD_RECV_IOV_ORIG_SEGMENT_FIRST_UNSET) {
+ orig_segment_first = rreq->dev.segment_first;
+ }
+
if (rreq->dev.segment_first < rreq->dev.segment_size)
{
/* still reading data that needs to go into the user buffer */
@@ -351,14 +359,15 @@ int MPIDI_CH3U_Request_load_recv_iov(MPID_Request * const rreq)
rreq->dev.iov[0].MPID_IOV_LEN = data_sz;
rreq->dev.iov_offset = 0;
rreq->dev.iov_count = 1;
- MPIU_Assert(rreq->dev.segment_first + data_sz +
+ MPIU_Assert(rreq->dev.segment_first - orig_segment_first + data_sz +
rreq->dev.tmpbuf_off <= rreq->dev.recv_data_sz);
- if (rreq->dev.segment_first + data_sz + rreq->dev.tmpbuf_off ==
+ if (rreq->dev.segment_first - orig_segment_first + data_sz + rreq->dev.tmpbuf_off ==
rreq->dev.recv_data_sz)
{
MPIU_DBG_MSG(CH3_CHANNEL,VERBOSE,
"updating rreq to read the remaining data into the SRBuf");
rreq->dev.OnDataAvail = MPIDI_CH3_ReqHandler_UnpackSRBufComplete;
+ orig_segment_first = MPIDI_LOAD_RECV_IOV_ORIG_SEGMENT_FIRST_UNSET;
}
else
{
@@ -407,12 +416,13 @@ int MPIDI_CH3U_Request_load_recv_iov(MPID_Request * const rreq)
}
/* --END ERROR HANDLING-- */
- if (last == rreq->dev.recv_data_sz)
+ if (last == rreq->dev.recv_data_sz + orig_segment_first)
{
MPIU_DBG_MSG(CH3_CHANNEL,VERBOSE,
"updating rreq to read the remaining data directly into the user buffer");
/* Eventually, use OnFinal for this instead */
rreq->dev.OnDataAvail = rreq->dev.OnFinal;
+ orig_segment_first = MPIDI_LOAD_RECV_IOV_ORIG_SEGMENT_FIRST_UNSET;
}
else if (MPIDI_Request_get_type(rreq) == MPIDI_REQUEST_TYPE_ACCUM_RECV ||
MPIDI_Request_get_type(rreq) == MPIDI_REQUEST_TYPE_GET_ACCUM_RECV ||
@@ -484,6 +494,7 @@ int MPIDI_CH3U_Request_load_recv_iov(MPID_Request * const rreq)
MPIU_Assert(MPIDI_Request_get_type(rreq) == MPIDI_REQUEST_TYPE_RECV);
/* Eventually, use OnFinal for this instead */
rreq->dev.OnDataAvail = rreq->dev.OnFinal;
+ orig_segment_first = MPIDI_LOAD_RECV_IOV_ORIG_SEGMENT_FIRST_UNSET;
}
else
{
http://git.mpich.org/mpich.git/commitdiff/9d3ddf8a530bf146228acd36a866a138f…
commit 9d3ddf8a530bf146228acd36a866a138fbf6966b
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Sun Jun 14 11:37:17 2015 -0500
Bug-fix in calculating streaming size in GetAccumulate pkt handler.
In this patch, we fix the mistakes in calculating the streaming
size in GetAccumulate pkt handler on the target side. The original
code has two mistakes here:
1. The original code use the size and extent of the target datatype,
which is wrong. Here we should use the size / extent of the basic
type in the target datatype.
2. The original code always use the total data size to calculate
the current streaming size, which is wrong. Here we should use
the current rest data size to calculate.
This patch fixes these two issues.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_handle_recv_req.c b/src/mpid/ch3/src/ch3u_handle_recv_req.c
index 2eddc41..981f877 100644
--- a/src/mpid/ch3/src/ch3u_handle_recv_req.c
+++ b/src/mpid/ch3/src/ch3u_handle_recv_req.c
@@ -264,13 +264,22 @@ int MPIDI_CH3_ReqHandler_GaccumRecvComplete(MPIDI_VC_t * vc, MPID_Request * rreq
}
MPIU_Assert(basic_type != MPI_DATATYPE_NULL);
+ if (rreq->dev.flags & MPIDI_CH3_PKT_FLAG_RMA_STREAM) {
+ MPIU_Assert(rreq->dev.ext_hdr_ptr != NULL);
+ stream_offset = ((MPIDI_CH3_Ext_pkt_get_accum_t *) rreq->dev.ext_hdr_ptr)->stream_offset;
+ }
+ else {
+ stream_offset = 0;
+ }
+
/* Use target data to calculate current stream unit size */
MPID_Datatype_get_size_macro(rreq->dev.datatype, type_size);
total_len = type_size * rreq->dev.user_count;
- MPID_Datatype_get_extent_macro(rreq->dev.datatype, extent);
- stream_data_len = MPIR_MIN(total_len, (MPIDI_CH3U_SRBuf_size / extent) * type_size);
-
MPID_Datatype_get_size_macro(basic_type, predef_dtp_size);
+ MPID_Datatype_get_extent_macro(basic_type, extent);
+ stream_data_len = MPIR_MIN(total_len - (stream_offset / extent) * predef_dtp_size,
+ (MPIDI_CH3U_SRBuf_size / extent) * predef_dtp_size);
+
predef_count = stream_data_len / predef_dtp_size;
MPIU_Assert(predef_count > 0);
@@ -285,14 +294,6 @@ int MPIDI_CH3_ReqHandler_GaccumRecvComplete(MPIDI_VC_t * vc, MPID_Request * rreq
(rreq->dev.flags & MPIDI_CH3_PKT_FLAG_RMA_UNLOCK))
get_accum_resp_pkt->flags |= MPIDI_CH3_PKT_FLAG_RMA_FLUSH_ACK;
- if (rreq->dev.flags & MPIDI_CH3_PKT_FLAG_RMA_STREAM) {
- MPIU_Assert(rreq->dev.ext_hdr_ptr != NULL);
- stream_offset = ((MPIDI_CH3_Ext_pkt_get_accum_t *) rreq->dev.ext_hdr_ptr)->stream_offset;
- }
- else {
- stream_offset = 0;
- }
-
/* check if data is contiguous and get true lb */
MPID_Datatype_is_contig(rreq->dev.datatype, &is_contig);
MPID_Datatype_get_true_lb(rreq->dev.datatype, &dt_true_lb);
http://git.mpich.org/mpich.git/commitdiff/2ae64ae52299d5448ab500659dc3ac6f6…
commit 2ae64ae52299d5448ab500659dc3ac6f6f146ed4
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Sun Jun 14 11:48:58 2015 -0500
Use MPIDI_msg_sz_t instead of int for orig_segment_first.
Here we assign req->dev.segment_first to orig_segment_first.
Since req->dev.segment_first is a MPIDI_msg_sz_t type, we should
use the same type for orig_segment_first.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/channels/nemesis/src/ch3i_eagernoncontig.c b/src/mpid/ch3/channels/nemesis/src/ch3i_eagernoncontig.c
index fb14c55..b7770fb 100644
--- a/src/mpid/ch3/channels/nemesis/src/ch3i_eagernoncontig.c
+++ b/src/mpid/ch3/channels/nemesis/src/ch3i_eagernoncontig.c
@@ -22,7 +22,7 @@ int MPIDI_CH3I_SendNoncontig( MPIDI_VC_t *vc, MPID_Request *sreq, void *header,
{
int mpi_errno = MPI_SUCCESS;
int again = 0;
- int orig_segment_first = sreq->dev.segment_first;
+ MPIDI_msg_sz_t orig_segment_first = sreq->dev.segment_first;
MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SENDNONCONTIG);
MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SENDNONCONTIG);
http://git.mpich.org/mpich.git/commitdiff/266a3adfb88d3338b4b2a9b61aff02a01…
commit 266a3adfb88d3338b4b2a9b61aff02a018997250
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Sun Jun 14 21:31:30 2015 -0500
Increase time limit of test/mpi/rma/atomic_get test to 5 min.
This test occasionally run more than 3 min (default time limit)
on OFI platform. This patch increases the time limit to 5 min.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/test/mpi/rma/testlist.in b/test/mpi/rma/testlist.in
index 475cc43..fbf65cc 100644
--- a/test/mpi/rma/testlist.in
+++ b/test/mpi/rma/testlist.in
@@ -131,7 +131,7 @@ at_complete 2
atomic_rmw_fop 3
atomic_rmw_cas 3
atomic_rmw_gacc 3
-atomic_get 3 mpiversion=3.0
+atomic_get 3 mpiversion=3.0 timeLimit=300
aint 2 mpiversion=3.1
acc-pairtype 2
manyget 2
-----------------------------------------------------------------------
Summary of changes:
.../ch3/channels/nemesis/src/ch3i_eagernoncontig.c | 2 +-
src/mpid/ch3/src/ch3u_handle_recv_req.c | 23 ++++++++++---------
src/mpid/ch3/src/ch3u_request.c | 17 ++++++++++++--
test/mpi/rma/testlist.in | 2 +-
4 files changed, 28 insertions(+), 16 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.2b3-94-g9d508d5
by noreply@mpich.org 15 Jun '15
by noreply@mpich.org 15 Jun '15
15 Jun '15
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 9d508d5d83f35978ffaaae1557280969ff47201c (commit)
from 5324a41f661085fdcd6c6365635accf9fa65839a (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/9d508d5d83f35978ffaaae1557280969f…
commit 9d508d5d83f35978ffaaae1557280969ff47201c
Author: Lena Oden <loden(a)anl.gov>
Date: Wed Jun 10 12:43:37 2015 -0500
Add a isend-irecv test for multiple processors
This test uses irecv and isend to transfer data in
an alltoall manner between multiple processes.
The idea of this test is testing, if MPI can handle
multiple processes trying to connect to each other from
both sides at the same time.
Signed-off-by: Antonio J. Pena <apenya(a)mcs.anl.gov>
diff --git a/test/mpi/pt2pt/Makefile.am b/test/mpi/pt2pt/Makefile.am
index 9c5d352..d31d31c 100644
--- a/test/mpi/pt2pt/Makefile.am
+++ b/test/mpi/pt2pt/Makefile.am
@@ -25,6 +25,7 @@ noinst_PROGRAMS = \
cancelanysrc \
isendself \
issendselfcancel \
+ isendirecv \
sendself \
eagerdt \
isendselfprobe \
diff --git a/test/mpi/pt2pt/isendirecv.c b/test/mpi/pt2pt/isendirecv.c
new file mode 100644
index 0000000..e2fccf6
--- /dev/null
+++ b/test/mpi/pt2pt/isendirecv.c
@@ -0,0 +1,48 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ * (C) 2015 by Argonne National Laboratory.
+ * See COPYRIGHT in top-level directory.
+ */
+
+#include "mpi.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include "mpitest.h"
+
+int main(int argc, char *argv[])
+{
+ int errors = 0;
+ int elems = 20;
+ int rank, nproc, dest, i;
+ float *in_buf, *out_buf;
+ MPI_Comm comm;
+ MPI_Request *reqs;
+
+ MTest_Init(&argc, &argv);
+
+ comm = MPI_COMM_WORLD;
+ MPI_Comm_rank(comm, &rank);
+ MPI_Comm_size(comm, &nproc);
+
+ reqs = (MPI_Request *)malloc(2 * nproc * sizeof(MPI_Request));
+ in_buf = (float *)malloc(elems * nproc * sizeof(float));
+ out_buf = (float *)malloc(elems * nproc * sizeof(float));
+
+ for (i=0; i<nproc; i++) {
+ MPI_Irecv(&in_buf[elems*i], elems, MPI_FLOAT, i,
+ 0, comm, &reqs[i]);
+ }
+
+ for (i=0; i<nproc; i++) {
+ MPI_Isend(&out_buf[elems*i], elems, MPI_FLOAT, i, 0,
+ comm, &reqs[i+nproc]);
+ }
+
+ MPI_Waitall(nproc*2,reqs, MPI_STATUSES_IGNORE);
+
+ MTest_Finalize(errors);
+ MPI_Finalize();
+ return 0;
+
+}
diff --git a/test/mpi/pt2pt/testlist b/test/mpi/pt2pt/testlist
index 8f5afbb..aa45f32 100644
--- a/test/mpi/pt2pt/testlist
+++ b/test/mpi/pt2pt/testlist
@@ -17,6 +17,7 @@ bsendalign 2
bsendpending 2
isendself 1
issendselfcancel 1
+isendirecv 10
bsendfrag 2
icsend 4
rqstatus 2
-----------------------------------------------------------------------
Summary of changes:
test/mpi/pt2pt/Makefile.am | 1 +
test/mpi/pt2pt/isendirecv.c | 48 +++++++++++++++++++++++++++++++++++++++++++
test/mpi/pt2pt/testlist | 1 +
3 files changed, 50 insertions(+), 0 deletions(-)
create mode 100644 test/mpi/pt2pt/isendirecv.c
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.2b3-93-g5324a41
by noreply@mpich.org 14 Jun '15
by noreply@mpich.org 14 Jun '15
14 Jun '15
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 5324a41f661085fdcd6c6365635accf9fa65839a (commit)
via c83b6b2dbb34238ab371a08b2233bd84d2b463ce (commit)
via eef0c70ac80ae06d88314c7f0174d18a25f97c16 (commit)
from 82c2d6523528b56309beada7f76d28f866cd6ab1 (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/5324a41f661085fdcd6c6365635accf9f…
commit 5324a41f661085fdcd6c6365635accf9fa65839a
Author: Min Si <msi(a)il.is.s.u-tokyo.ac.jp>
Date: Wed Jun 10 12:00:03 2015 -0500
Expose AM flush ordering and issue per OP flush if unordered.
This patch includes three changes:
(1) Added netmod API get_ordering to allow netmod to expose the network
ordering. A netmod may issue some packets via multiple connections in
parallel if those packets (such as RMA) do not require ordering, and
thus the packets may be unordered. This patch sets the network ordering
in every existing netmod (tcp|mxm|ofi|portals|llc) to true, since all
packets are sent orderly via one connection.
(2) Nemesis exposes the window packet orderings such as AM flush
ordering at init time. It supports ordered packets only when netmod
supports ordered network.
(3) If AM flush is ordered (flush must be finished after all previous
operations), then CH3 RMA only requests FLUSH ACK on the last operation.
Otherwise, CH3 must request per-OP FLUSH ACK to ensure all operations
are remotely completed.
Signed-off-by: Xin Zhao <xinzhao3(a)illinois.edu>
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/channels/nemesis/include/mpid_nem_nets.h b/src/mpid/ch3/channels/nemesis/include/mpid_nem_nets.h
index 350a887..91975fd 100644
--- a/src/mpid/ch3/channels/nemesis/include/mpid_nem_nets.h
+++ b/src/mpid/ch3/channels/nemesis/include/mpid_nem_nets.h
@@ -27,6 +27,7 @@ typedef int (* MPID_nem_net_module_anysource_improbe_t)(int tag, MPID_Comm *comm
MPID_Request **message, MPI_Status *status);
typedef void (* MPID_nem_net_module_vc_dbg_print_sendq_t)(FILE *stream, MPIDI_VC_t *vc);
+typedef int (* MPID_nem_net_module_get_ordering_t)(int *ordering);
typedef struct MPID_nem_netmod_funcs
{
@@ -45,6 +46,7 @@ typedef struct MPID_nem_netmod_funcs
MPID_nem_net_module_vc_terminate_t vc_terminate;
MPID_nem_net_module_anysource_iprobe_t anysource_iprobe;
MPID_nem_net_module_anysource_improbe_t anysource_improbe;
+ MPID_nem_net_module_get_ordering_t get_ordering;
} MPID_nem_netmod_funcs_t;
extern MPID_nem_net_module_vc_dbg_print_sendq_t MPID_nem_net_module_vc_dbg_print_sendq;
diff --git a/src/mpid/ch3/channels/nemesis/netmod/llc/llc_impl.h b/src/mpid/ch3/channels/nemesis/netmod/llc/llc_impl.h
index 421fc0c..9eb64be 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/llc/llc_impl.h
+++ b/src/mpid/ch3/channels/nemesis/netmod/llc/llc_impl.h
@@ -81,6 +81,7 @@ int MPID_nem_llc_anysource_iprobe(int tag, MPID_Comm * comm, int context_offset,
MPI_Status * status);
int MPID_nem_llc_anysource_improbe(int tag, MPID_Comm * comm, int context_offset, int *flag,
MPID_Request ** message, MPI_Status * status);
+int MPID_nem_llc_get_ordering(int *ordering);
int MPID_nem_llc_iSendContig(MPIDI_VC_t * vc, MPID_Request * sreq, void *hdr, MPIDI_msg_sz_t hdr_sz,
void *data, MPIDI_msg_sz_t data_sz);
diff --git a/src/mpid/ch3/channels/nemesis/netmod/llc/llc_init.c b/src/mpid/ch3/channels/nemesis/netmod/llc/llc_init.c
index 366940a..11acfbd 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/llc/llc_init.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/llc/llc_init.c
@@ -36,6 +36,7 @@ MPID_nem_netmod_funcs_t MPIDI_nem_llc_funcs = {
.vc_terminate = MPID_nem_llc_vc_terminate,
.anysource_iprobe = MPID_nem_llc_anysource_iprobe,
.anysource_improbe = MPID_nem_llc_anysource_improbe,
+ .get_ordering = MPID_nem_llc_get_ordering,
};
int MPID_nem_llc_my_llc_rank;
@@ -221,3 +222,13 @@ int MPID_nem_llc_anysource_improbe(int tag, MPID_Comm * comm, int context_offset
return MPID_nem_llc_improbe(NULL, MPI_ANY_SOURCE, tag, comm, context_offset, flag, message,
status);
}
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_llc_get_ordering
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_llc_get_ordering(int *ordering)
+{
+ (*ordering) = 1;
+ return MPI_SUCCESS;
+}
diff --git a/src/mpid/ch3/channels/nemesis/netmod/mxm/mxm_impl.h b/src/mpid/ch3/channels/nemesis/netmod/mxm/mxm_impl.h
index e44a0a3..0c4be8b 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/mxm/mxm_impl.h
+++ b/src/mpid/ch3/channels/nemesis/netmod/mxm/mxm_impl.h
@@ -26,6 +26,7 @@ int MPID_nem_mxm_connect_to_root(const char *business_card, MPIDI_VC_t * new_vc)
int MPID_nem_mxm_vc_init(MPIDI_VC_t * vc);
int MPID_nem_mxm_vc_destroy(MPIDI_VC_t * vc);
int MPID_nem_mxm_vc_terminate(MPIDI_VC_t * vc);
+int MPID_nem_mxm_get_ordering(int *ordering);
/* alternate interface */
int MPID_nem_mxm_iSendContig(MPIDI_VC_t * vc, MPID_Request * sreq, void *hdr, MPIDI_msg_sz_t hdr_sz,
diff --git a/src/mpid/ch3/channels/nemesis/netmod/mxm/mxm_init.c b/src/mpid/ch3/channels/nemesis/netmod/mxm/mxm_init.c
index d7704ca..84bbe06 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/mxm/mxm_init.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/mxm/mxm_init.c
@@ -71,7 +71,8 @@ MPID_nem_netmod_funcs_t MPIDI_nem_mxm_funcs = {
MPID_nem_mxm_vc_destroy,
MPID_nem_mxm_vc_terminate,
MPID_nem_mxm_anysource_iprobe,
- MPID_nem_mxm_anysource_improbe
+ MPID_nem_mxm_anysource_improbe,
+ MPID_nem_mxm_get_ordering
};
static MPIDI_Comm_ops_t comm_ops = {
@@ -388,6 +389,16 @@ int MPID_nem_mxm_vc_terminate(MPIDI_VC_t * vc)
goto fn_exit;
}
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_mxm_get_ordering
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_mxm_get_ordering(int *ordering)
+{
+ (*ordering) = 1;
+ return MPI_SUCCESS;
+}
+
static int _mxm_conf(void)
{
int mpi_errno = MPI_SUCCESS;
diff --git a/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_data.c b/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_data.c
index d89270a..9bdc325 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_data.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_data.c
@@ -55,4 +55,5 @@ MPID_nem_netmod_funcs_t MPIDI_nem_ofi_funcs = {
MPID_nem_ofi_vc_terminate,
MPID_nem_ofi_anysource_iprobe,
MPID_nem_ofi_anysource_improbe,
+ MPID_nem_ofi_get_ordering,
};
diff --git a/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_impl.h b/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_impl.h
index 22560da..25d5570 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_impl.h
+++ b/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_impl.h
@@ -289,6 +289,7 @@ int MPID_nem_ofi_connect_to_root(const char *business_card, MPIDI_VC_t * new_vc)
int MPID_nem_ofi_vc_destroy(MPIDI_VC_t * vc);
int MPID_nem_ofi_cm_init(MPIDI_PG_t * pg_p, int pg_rank);
int MPID_nem_ofi_cm_finalize();
+int MPID_nem_ofi_get_ordering(int *ordering);
extern MPID_nem_ofi_global_t gl_data;
extern MPIDI_Comm_ops_t _g_comm_ops;
diff --git a/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_init.c b/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_init.c
index cc8eec8..7e221f7 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_init.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/ofi/ofi_init.c
@@ -326,6 +326,14 @@ int MPID_nem_ofi_finalize(void)
END_FUNC_RC(FCNAME);
}
+#undef FCNAME
+#define FCNAME DECL_FUNC(MPID_nem_ofi_get_ordering)
+int MPID_nem_ofi_get_ordering(int *ordering)
+{
+ (*ordering) = 1;
+ return MPI_SUCCESS;
+}
+
static inline int compile_time_checking()
{
OFI_COMPILE_TIME_ASSERT(sizeof(MPID_nem_ofi_vc_t) <= MPID_NEM_VC_NETMOD_AREA_LEN);
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 d924954..8647a8c 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h
@@ -203,6 +203,7 @@ int MPID_nem_ptl_anysource_improbe(int tag, MPID_Comm * comm, int context_offset
void MPID_nem_ptl_anysource_posted(MPID_Request *rreq);
int MPID_nem_ptl_anysource_matched(MPID_Request *rreq);
int MPID_nem_ptl_init_id(MPIDI_VC_t *vc);
+int MPID_nem_ptl_get_ordering(int *ordering);
int MPID_nem_ptl_lmt_initiate_lmt(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *rts_pkt, MPID_Request *req);
int MPID_nem_ptl_lmt_start_recv(MPIDI_VC_t *vc, MPID_Request *rreq, MPID_IOV s_cookie);
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 fd972bb..b29475c 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_init.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_init.c
@@ -60,7 +60,8 @@ MPID_nem_netmod_funcs_t MPIDI_nem_portals4_funcs = {
vc_destroy,
vc_terminate,
MPID_nem_ptl_anysource_iprobe,
- MPID_nem_ptl_anysource_improbe
+ MPID_nem_ptl_anysource_improbe,
+ MPID_nem_ptl_get_ordering
};
static MPIDI_Comm_ops_t comm_ops = {
@@ -647,6 +648,16 @@ int MPID_nem_ptl_init_id(MPIDI_VC_t *vc)
goto fn_exit;
}
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_ptl_get_ordering
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_ptl_get_ordering(int *ordering)
+{
+ (*ordering) = 1;
+ return MPI_SUCCESS;
+}
+
#define CASE_STR(x) case x: return #x
diff --git a/src/mpid/ch3/channels/nemesis/netmod/tcp/tcp_impl.h b/src/mpid/ch3/channels/nemesis/netmod/tcp/tcp_impl.h
index aab5019..8c8b6b9 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/tcp/tcp_impl.h
+++ b/src/mpid/ch3/channels/nemesis/netmod/tcp/tcp_impl.h
@@ -108,6 +108,7 @@ void MPID_nem_tcp_vc_dbg_print_sendq(FILE *stream, MPIDI_VC_t *vc);
int MPID_nem_tcp_socksm_finalize(void);
int MPID_nem_tcp_socksm_init(void);
int MPID_nem_tcp_vc_terminated(MPIDI_VC_t *vc);
+int MPID_nem_tcp_get_ordering(int *ordering);
int MPID_nem_tcp_pkt_unpause_handler(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt, MPIDI_msg_sz_t *buflen, MPID_Request **rreqp);
diff --git a/src/mpid/ch3/channels/nemesis/netmod/tcp/tcp_init.c b/src/mpid/ch3/channels/nemesis/netmod/tcp/tcp_init.c
index 14ba19a..94600a3 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/tcp/tcp_init.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/tcp/tcp_init.c
@@ -104,7 +104,9 @@ MPID_nem_netmod_funcs_t MPIDI_nem_tcp_funcs = {
MPID_nem_tcp_vc_init,
MPID_nem_tcp_vc_destroy,
MPID_nem_tcp_vc_terminate,
- NULL /* anysource iprobe */
+ NULL, /* anysource iprobe */
+ NULL, /* anysource_improbe */
+ MPID_nem_tcp_get_ordering
};
/* in case there are no packet types defined (e.g., they're ifdef'ed out) make sure the array is not zero length */
@@ -726,3 +728,12 @@ int MPID_nem_tcp_vc_terminated(MPIDI_VC_t *vc)
goto fn_exit;
}
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_tcp_get_ordering
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_tcp_get_ordering(int *ordering)
+{
+ (*ordering) = 1;
+ return MPI_SUCCESS;
+}
diff --git a/src/mpid/ch3/channels/nemesis/src/ch3_win_fns.c b/src/mpid/ch3/channels/nemesis/src/ch3_win_fns.c
index 8a8e40d..998aa95 100644
--- a/src/mpid/ch3/channels/nemesis/src/ch3_win_fns.c
+++ b/src/mpid/ch3/channels/nemesis/src/ch3_win_fns.c
@@ -74,6 +74,41 @@ int MPIDI_CH3_Win_hooks_init(MPIDI_CH3U_Win_hooks_t * win_hooks)
#undef FUNCNAME
+#define FUNCNAME MPIDI_CH3_Win_pkt_orderings_init
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPIDI_CH3_Win_pkt_orderings_init(MPIDI_CH3U_Win_pkt_ordering_t * win_pkt_orderings)
+{
+ int mpi_errno = MPI_SUCCESS;
+ int netmod_ordering = 0;
+
+ MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_WIN_PKT_ORDERINGS_INIT);
+ MPIDI_RMA_FUNC_ENTER(MPID_STATE_MPIDI_CH3_WIN_PKT_ORDERINGS_INIT);
+
+ win_pkt_orderings->am_flush_ordered = 0;
+
+ if (MPID_nem_netmod_func && MPID_nem_netmod_func->get_ordering) {
+ mpi_errno = MPID_nem_netmod_func->get_ordering(&netmod_ordering);
+ if (mpi_errno)
+ MPIU_ERR_POP(mpi_errno);
+ }
+
+ if (netmod_ordering > 0) {
+ /* Guarantees ordered AM flush only on ordered network.
+ * In other words, it is ordered only when both intra-node and inter-node
+ * connections are ordered. Otherwise we have to maintain the ordering per
+ * connection, which causes expensive O(P) structure or per-OP function calls.*/
+ win_pkt_orderings->am_flush_ordered = 1;
+ }
+
+ fn_exit:
+ MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3_WIN_PKT_ORDERINGS_INIT);
+ return mpi_errno;
+ fn_fail:
+ goto fn_exit;
+}
+
+#undef FUNCNAME
#define FUNCNAME MPIDI_CH3_Win_init
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
diff --git a/src/mpid/ch3/channels/sock/src/ch3_win_fns.c b/src/mpid/ch3/channels/sock/src/ch3_win_fns.c
index 92b34b3..8942099 100644
--- a/src/mpid/ch3/channels/sock/src/ch3_win_fns.c
+++ b/src/mpid/ch3/channels/sock/src/ch3_win_fns.c
@@ -43,3 +43,25 @@ int MPIDI_CH3_Win_hooks_init(MPIDI_CH3U_Win_hooks_t *win_hooks)
return mpi_errno;
}
+
+#undef FUNCNAME
+#define FUNCNAME MPIDI_CH3_Win_pkt_orderings_init
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPIDI_CH3_Win_pkt_orderings_init(MPIDI_CH3U_Win_pkt_ordering_t * win_pkt_orderings)
+{
+ int mpi_errno = MPI_SUCCESS;
+ int netmod_ordering = 0;
+
+ MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_WIN_PKT_ORDERINGS_INIT);
+ MPIDI_RMA_FUNC_ENTER(MPID_STATE_MPIDI_CH3_WIN_PKT_ORDERINGS_INIT);
+
+ /* Guarantees ordered AM flush. */
+ win_pkt_orderings->am_flush_ordered = 1;
+
+ fn_exit:
+ MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3_WIN_PKT_ORDERINGS_INIT);
+ return mpi_errno;
+ fn_fail:
+ goto fn_exit;
+}
diff --git a/src/mpid/ch3/include/mpidimpl.h b/src/mpid/ch3/include/mpidimpl.h
index 70c6ac5..7692704 100644
--- a/src/mpid/ch3/include/mpidimpl.h
+++ b/src/mpid/ch3/include/mpidimpl.h
@@ -1149,6 +1149,18 @@ typedef struct {
extern MPIDI_CH3U_Win_hooks_t MPIDI_CH3U_Win_hooks;
+typedef struct MPIDI_CH3U_Win_pkt_ordering {
+
+ /* Ordered AM flush.
+ * It means whether AM flush is guaranteed to be finished after all previous
+ * RMA operations. It initialized by Nemesis and used by CH3.
+ * Note that we use single global flag for all targets including both
+ * intra-node and inter-node processes.*/
+ int am_flush_ordered;
+} MPIDI_CH3U_Win_pkt_ordering_t;
+
+extern MPIDI_CH3U_Win_pkt_ordering_t MPIDI_CH3U_Win_pkt_orderings;
+
/* CH3 and Channel window functions initializers */
int MPIDI_Win_fns_init(MPIDI_CH3U_Win_fns_t *win_fns);
int MPIDI_CH3_Win_fns_init(MPIDI_CH3U_Win_fns_t *win_fns);
@@ -1156,6 +1168,8 @@ int MPIDI_CH3_Win_fns_init(MPIDI_CH3U_Win_fns_t *win_fns);
/* Channel window hooks initializer */
int MPIDI_CH3_Win_hooks_init(MPIDI_CH3U_Win_hooks_t *win_hooks);
+int MPIDI_CH3_Win_pkt_orderings_init(MPIDI_CH3U_Win_pkt_ordering_t * win_pkt_orderings);
+
/* Default window creation functions provided by CH3 */
int MPIDI_CH3U_Win_create(void *, MPI_Aint, int, MPID_Info *, MPID_Comm *,
MPID_Win **);
diff --git a/src/mpid/ch3/include/mpidpre.h b/src/mpid/ch3/include/mpidpre.h
index 255b9d3..390c5ea 100644
--- a/src/mpid/ch3/include/mpidpre.h
+++ b/src/mpid/ch3/include/mpidpre.h
@@ -298,14 +298,6 @@ typedef struct MPIDI_Win_basic_info {
MPI_Win win_handle;
} MPIDI_Win_basic_info_t;
-typedef struct MPIDI_RMA_Pkt_orderings {
- int flush_remote; /* ordered FLUSH, for remote completion */
- /* FIXME: in future we should also add local completin
- ordering: WAW, WAR, RAW, RAR. */
-} MPIDI_RMA_Pkt_orderings_t;
-
-extern MPIDI_RMA_Pkt_orderings_t *MPIDI_RMA_Pkt_orderings;
-
#define MPIDI_DEV_WIN_DECL \
volatile int at_completion_counter; /* completion counter for operations \
targeting this window */ \
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index fdff895..f6a7ae3 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -337,20 +337,32 @@ static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * targ
first_op = 0;
}
+ /* piggyback FLUSH on every OP if ordered flush is not guaranteed. */
+ if (!MPIDI_CH3U_Win_pkt_orderings.am_flush_ordered)
+ flags |= MPIDI_CH3_PKT_FLAG_RMA_FLUSH;
+
if (curr_op->next == NULL) {
/* piggyback on last OP. */
if (target->sync.sync_flag == MPIDI_RMA_SYNC_FLUSH) {
flags |= MPIDI_CH3_PKT_FLAG_RMA_FLUSH;
- target->sync.outstanding_acks++;
-
if (target->win_complete_flag)
flags |= MPIDI_CH3_PKT_FLAG_RMA_DECR_AT_COUNTER;
}
else if (target->sync.sync_flag == MPIDI_RMA_SYNC_UNLOCK) {
flags |= MPIDI_CH3_PKT_FLAG_RMA_UNLOCK;
+
+ /* if piggyback UNLOCK then unset FLUSH (set for every
+ * operation on out-of-order network). */
+ flags &= ~MPIDI_CH3_PKT_FLAG_RMA_FLUSH;
}
}
+ /* only increase ack counter when FLUSH or UNLOCK flag is set,
+ * but without LOCK piggyback. */
+ if (((flags & MPIDI_CH3_PKT_FLAG_RMA_FLUSH)
+ || (flags & MPIDI_CH3_PKT_FLAG_RMA_UNLOCK)))
+ target->sync.outstanding_acks++;
+
mpi_errno = issue_rma_op(curr_op, win_ptr, target, flags);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
diff --git a/src/mpid/ch3/src/mpid_init.c b/src/mpid/ch3/src/mpid_init.c
index e541f71..6373ae2 100644
--- a/src/mpid/ch3/src/mpid_init.c
+++ b/src/mpid/ch3/src/mpid_init.c
@@ -41,6 +41,7 @@ MPIDI_Process_t MPIDI_Process = { NULL };
MPIDI_CH3U_SRBuf_element_t * MPIDI_CH3U_SRBuf_pool = NULL;
MPIDI_CH3U_Win_fns_t MPIDI_CH3U_Win_fns = { NULL };
MPIDI_CH3U_Win_hooks_t MPIDI_CH3U_Win_hooks = { NULL };
+MPIDI_CH3U_Win_pkt_ordering_t MPIDI_CH3U_Win_pkt_orderings = { 0 };
#undef FUNCNAME
@@ -193,6 +194,9 @@ int MPID_Init(int *argc, char ***argv, int requested, int *provided,
mpi_errno = MPIDI_CH3U_Recvq_init();
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+ /* Ask channel to expose Window packet ordering. */
+ MPIDI_CH3_Win_pkt_orderings_init(&MPIDI_CH3U_Win_pkt_orderings);
+
/*
* Initialize the MPI_COMM_WORLD object
*/
diff --git a/src/mpid/ch3/src/mpidi_rma.c b/src/mpid/ch3/src/mpidi_rma.c
index 4cbec01..28c9063 100644
--- a/src/mpid/ch3/src/mpidi_rma.c
+++ b/src/mpid/ch3/src/mpidi_rma.c
@@ -95,7 +95,6 @@ MPIDI_RMA_Op_t *global_rma_op_pool = NULL, *global_rma_op_pool_tail =
NULL, *global_rma_op_pool_start = NULL;
MPIDI_RMA_Target_t *global_rma_target_pool = NULL, *global_rma_target_pool_tail =
NULL, *global_rma_target_pool_start = NULL;
-MPIDI_RMA_Pkt_orderings_t *MPIDI_RMA_Pkt_orderings = NULL;
#undef FUNCNAME
#define FUNCNAME MPIDI_RMA_init
@@ -128,12 +127,6 @@ int MPIDI_RMA_init(void)
&(global_rma_target_pool_start[i]));
}
- MPIU_CHKPMEM_MALLOC(MPIDI_RMA_Pkt_orderings, struct MPIDI_RMA_Pkt_orderings *,
- sizeof(struct MPIDI_RMA_Pkt_orderings), mpi_errno, "RMA packet orderings");
- /* FIXME: here we should let channel to set ordering flags. For now we just set them
- * in CH3 layer. */
- MPIDI_RMA_Pkt_orderings->flush_remote = 1;
-
fn_exit:
MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_RMA_INIT);
return mpi_errno;
@@ -156,7 +149,6 @@ void MPIDI_RMA_finalize(void)
MPIU_Free(global_rma_op_pool_start);
MPIU_Free(global_rma_target_pool_start);
- MPIU_Free(MPIDI_RMA_Pkt_orderings);
MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_RMA_FINALIZE);
}
http://git.mpich.org/mpich.git/commitdiff/c83b6b2dbb34238ab371a08b2233bd84d…
commit c83b6b2dbb34238ab371a08b2233bd84d2b463ce
Author: Min Si <msi(a)il.is.s.u-tokyo.ac.jp>
Date: Wed Jun 10 12:29:43 2015 -0500
Always free issued OPs when window resource is used up.
When win resource is used up, the current code frees OPs before
completion only if flush_remote is ordered. However, we can always free
them even on out-of-order network. Because remote completion is waited
by ack counter, and local completion (flush_local) is translated to
remote completion (flush).
Signed-off-by: Xin Zhao <xinzhao3(a)illinois.edu>
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_oplist.h b/src/mpid/ch3/include/mpid_rma_oplist.h
index dd91a12..4cfebf2 100644
--- a/src/mpid/ch3/include/mpid_rma_oplist.h
+++ b/src/mpid/ch3/include/mpid_rma_oplist.h
@@ -554,11 +554,9 @@ static inline int MPIDI_CH3I_Win_get_op(MPID_Win * win_ptr, MPIDI_RMA_Op_t ** e)
if (new_ptr != NULL)
break;
- if (MPIDI_RMA_Pkt_orderings->flush_remote) {
- mpi_errno = MPIDI_CH3I_RMA_Free_ops_before_completion(win_ptr);
- if (mpi_errno != MPI_SUCCESS)
- MPIU_ERR_POP(mpi_errno);
- }
+ mpi_errno = MPIDI_CH3I_RMA_Free_ops_before_completion(win_ptr);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
MPIR_T_PVAR_TIMER_START(RMA, rma_rmaqueue_alloc);
new_ptr = MPIDI_CH3I_Win_op_alloc(win_ptr);
http://git.mpich.org/mpich.git/commitdiff/eef0c70ac80ae06d88314c7f0174d18a2…
commit eef0c70ac80ae06d88314c7f0174d18a25f97c16
Author: Min Si <msi(a)il.is.s.u-tokyo.ac.jp>
Date: Wed Jun 10 11:43:07 2015 -0500
Move outstanding_acks increment to flush sending step.
The outstanding_acks counter was increased at each sync call (such as
fence and flush). However, the counter had to be decreased again if
flush ack is not required. It is more straightforward if increasing it
only when the flush packet is issued (FLUSH flag piggyback or a separate
flush message).
Signed-off-by: Xin Zhao <xinzhao3(a)illinois.edu>
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index 74731b0..fdff895 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -192,9 +192,6 @@ static inline int check_and_switch_target_state(MPID_Win * win_ptr, MPIDI_RMA_Ta
* function will clean it up. */
target->access_state = MPIDI_RMA_LOCK_GRANTED;
- target->sync.outstanding_acks--;
- MPIU_Assert(target->sync.outstanding_acks >= 0);
-
/* We are done with ending synchronization, unset target's sync_flag. */
target->sync.sync_flag = MPIDI_RMA_SYNC_NONE;
@@ -214,23 +211,15 @@ static inline int check_and_switch_target_state(MPID_Win * win_ptr, MPIDI_RMA_Ta
case MPIDI_RMA_NONE:
if (target->sync.sync_flag == MPIDI_RMA_SYNC_FLUSH) {
if (target->pending_op_list_head == NULL) {
- if (target->target_rank == rank) {
- target->sync.outstanding_acks--;
- MPIU_Assert(target->sync.outstanding_acks >= 0);
- }
- else {
+ if (target->target_rank != rank) {
if (target->put_acc_issued) {
+
+ target->sync.outstanding_acks++;
+
mpi_errno = send_flush_msg(target->target_rank, win_ptr);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
}
- else {
- /* We did not issue PUT/ACC since the last
- * synchronization call, therefore here we
- * don't need ACK back */
- target->sync.outstanding_acks--;
- MPIU_Assert(target->sync.outstanding_acks >= 0);
- }
}
/* We are done with ending synchronization, unset target's sync_flag. */
@@ -242,9 +231,6 @@ static inline int check_and_switch_target_state(MPID_Win * win_ptr, MPIDI_RMA_Ta
else if (target->sync.sync_flag == MPIDI_RMA_SYNC_UNLOCK) {
if (target->pending_op_list_head == NULL) {
if (target->target_rank == rank) {
- target->sync.outstanding_acks--;
- MPIU_Assert(target->sync.outstanding_acks >= 0);
-
mpi_errno = MPIDI_CH3I_Release_lock(win_ptr);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
@@ -255,11 +241,12 @@ static inline int check_and_switch_target_state(MPID_Win * win_ptr, MPIDI_RMA_Ta
/* We did not issue PUT/ACC since the last
* synchronization call, therefore here we
* don't need ACK back */
- target->sync.outstanding_acks--;
- MPIU_Assert(target->sync.outstanding_acks >= 0);
flag = MPIDI_CH3_PKT_FLAG_RMA_UNLOCK_NO_ACK;
}
+ else {
+ target->sync.outstanding_acks++;
+ }
mpi_errno = send_unlock_msg(target->target_rank, win_ptr, flag);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
@@ -354,6 +341,8 @@ static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * targ
/* piggyback on last OP. */
if (target->sync.sync_flag == MPIDI_RMA_SYNC_FLUSH) {
flags |= MPIDI_CH3_PKT_FLAG_RMA_FLUSH;
+ target->sync.outstanding_acks++;
+
if (target->win_complete_flag)
flags |= MPIDI_CH3_PKT_FLAG_RMA_DECR_AT_COUNTER;
}
@@ -680,7 +669,6 @@ int MPIDI_CH3I_RMA_Cleanup_target_aggressive(MPID_Win * win_ptr, MPIDI_RMA_Targe
curr_target = win_ptr->slots[i].target_list_head;
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- curr_target->sync.outstanding_acks++;
}
/* Issue out all operations. */
diff --git a/src/mpid/ch3/src/ch3u_rma_sync.c b/src/mpid/ch3/src/ch3u_rma_sync.c
index 731a94c..5fb34d8 100644
--- a/src/mpid/ch3/src/ch3u_rma_sync.c
+++ b/src/mpid/ch3/src/ch3u_rma_sync.c
@@ -374,7 +374,6 @@ int MPIDI_Win_fence(int assert, MPID_Win * win_ptr)
/* set sync_flag in sync struct */
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- curr_target->sync.outstanding_acks++;
}
curr_target = curr_target->next;
}
@@ -753,7 +752,6 @@ int MPIDI_Win_complete(MPID_Win * win_ptr)
/* set sync_flag in sync struct */
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- curr_target->sync.outstanding_acks++;
}
curr_target->win_complete_flag = 1;
}
@@ -1088,7 +1086,6 @@ int MPIDI_Win_unlock(int dest, MPID_Win * win_ptr)
sync_flag = MPIDI_RMA_SYNC_UNLOCK;
if (target->sync.sync_flag < sync_flag) {
target->sync.sync_flag = sync_flag;
- target->sync.outstanding_acks++;
}
/* Issue out all operations. */
@@ -1210,7 +1207,6 @@ int MPIDI_Win_flush(int dest, MPID_Win * win_ptr)
/* Set sync_flag in sync struct. */
if (target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- target->sync.outstanding_acks++;
}
/* Issue out all operations. */
@@ -1318,7 +1314,6 @@ int MPIDI_Win_flush_local(int dest, MPID_Win * win_ptr)
if (target->sync.upgrade_flush_local) {
if (target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- target->sync.outstanding_acks++;
}
}
else {
@@ -1532,7 +1527,6 @@ int MPIDI_Win_unlock_all(MPID_Win * win_ptr)
while (curr_target != NULL) {
if (curr_target->sync.sync_flag < sync_flag) {
curr_target->sync.sync_flag = sync_flag;
- curr_target->sync.outstanding_acks++;
}
curr_target = curr_target->next;
}
@@ -1551,7 +1545,6 @@ int MPIDI_Win_unlock_all(MPID_Win * win_ptr)
if (curr_target != NULL) {
if (curr_target->sync.sync_flag < sync_flag) {
curr_target->sync.sync_flag = sync_flag;
- curr_target->sync.outstanding_acks++;
}
}
else {
@@ -1672,7 +1665,6 @@ int MPIDI_Win_flush_all(MPID_Win * win_ptr)
while (curr_target != NULL) {
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- curr_target->sync.outstanding_acks++;
}
/* ENDING synchronization: correctly decrement the following counters. */
@@ -1767,7 +1759,6 @@ int MPIDI_Win_flush_local_all(MPID_Win * win_ptr)
if (curr_target->sync.upgrade_flush_local) {
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- curr_target->sync.outstanding_acks++;
}
upgrade_flush_local_cnt++;
}
-----------------------------------------------------------------------
Summary of changes:
.../ch3/channels/nemesis/include/mpid_nem_nets.h | 2 +
.../ch3/channels/nemesis/netmod/llc/llc_impl.h | 1 +
.../ch3/channels/nemesis/netmod/llc/llc_init.c | 11 +++++
.../ch3/channels/nemesis/netmod/mxm/mxm_impl.h | 1 +
.../ch3/channels/nemesis/netmod/mxm/mxm_init.c | 13 ++++++-
.../ch3/channels/nemesis/netmod/ofi/ofi_data.c | 1 +
.../ch3/channels/nemesis/netmod/ofi/ofi_impl.h | 1 +
.../ch3/channels/nemesis/netmod/ofi/ofi_init.c | 8 ++++
.../channels/nemesis/netmod/portals4/ptl_impl.h | 1 +
.../channels/nemesis/netmod/portals4/ptl_init.c | 13 ++++++-
.../ch3/channels/nemesis/netmod/tcp/tcp_impl.h | 1 +
.../ch3/channels/nemesis/netmod/tcp/tcp_init.c | 13 ++++++-
src/mpid/ch3/channels/nemesis/src/ch3_win_fns.c | 35 ++++++++++++++++
src/mpid/ch3/channels/sock/src/ch3_win_fns.c | 22 ++++++++++
src/mpid/ch3/include/mpid_rma_oplist.h | 8 +--
src/mpid/ch3/include/mpidimpl.h | 14 +++++++
src/mpid/ch3/include/mpidpre.h | 8 ----
src/mpid/ch3/src/ch3u_rma_progress.c | 42 ++++++++++----------
src/mpid/ch3/src/ch3u_rma_sync.c | 9 ----
src/mpid/ch3/src/mpid_init.c | 4 ++
src/mpid/ch3/src/mpidi_rma.c | 8 ----
21 files changed, 162 insertions(+), 54 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.2b3-90-g82c2d65
by noreply@mpich.org 13 Jun '15
by noreply@mpich.org 13 Jun '15
13 Jun '15
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 82c2d6523528b56309beada7f76d28f866cd6ab1 (commit)
via b997479938511c6a3e3b7323ab5864e537110e7e (commit)
via bb3e74768a87562a983dbc25db23e87df4366505 (commit)
via ec7850848485270924df41bf1c43e0bc83189901 (commit)
via 4a53f4cca65af53857817acc11b4b34a2a19bc28 (commit)
via bf114ec3827eeeb9ab17b26b5ebf7293575ce763 (commit)
via 533b84c5adcab9fed07d3dab9abead0484298e1f (commit)
via 22c16664e41a0f12eb984822909b8c452d066f63 (commit)
via a59e611783f5fa0a6f3763d910ac0e1fe57f3350 (commit)
via 56ede5541807579d6d4c4577a7cf21a3c12f1249 (commit)
via 37cb95b14b693b634eb80fca442ff809acab10ba (commit)
via 092d6c8ec115ca7fcbdd55f3879cbdc2dc8a969d (commit)
via 69c2207df8e81625f0df1685a2242da93e5380cd (commit)
via a7be0681b9ed8e4a49dec90f7de22574410027ed (commit)
via 77c07868c0414781bae758ba8a7693287a1a24eb (commit)
via 9fb9c2d36a51c55208036c3c4105dde8a004c84e (commit)
via 0185437d948d81167a7aaf1e9dd02c4de7b891c8 (commit)
via 5b1b3bbf6ef9b7c8d54e9fea202357e23d7cf243 (commit)
via 408c4abf80cad55721d94917971fd85a860dbc5a (commit)
via 74c2007fd55936f48a7d77d41a27b301ef263653 (commit)
via 8a172d8b4cfb7489d54de9bb2fcafcbed98ff592 (commit)
via 2db95ef98d98d968af42eeea9d0b9b2a4293bfcc (commit)
via 299ede6e194bb0f7329511c83c3d0bf671ced860 (commit)
via 35a05b3ca1e0cc60b1d1d607f408e0ab1e1f9ced (commit)
via 98c791a6cfbc87698d4304ebdcb994b4c212fba1 (commit)
via 6ee07af463b5de7fd11e9b94fc18ed5cd595a4dc (commit)
via 6394c667ff22fed27bf0765c558e787a49ac66f8 (commit)
via 86bb183473bb67c63a22c1b6e16d96d88581159f (commit)
via 5a1dd95606ad83a8671a41ccc682076b9c19d63b (commit)
via 1e321d463ba394c1b6fe9bc818c81be22e39f24c (commit)
from 5bb037479a079a5e940a9c0e4e1f10f045cb9d7d (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/82c2d6523528b56309beada7f76d28f86…
commit 82c2d6523528b56309beada7f76d28f866cd6ab1
Author: Pavan Balaji <balaji(a)anl.gov>
Date: Fri Jun 12 22:14:27 2015 -0500
White-space cleanup.
diff --git a/src/mpid/ch3/include/mpid_rma_shm.h b/src/mpid/ch3/include/mpid_rma_shm.h
index 1ad0351..f6d6b78 100644
--- a/src/mpid/ch3/include/mpid_rma_shm.h
+++ b/src/mpid/ch3/include/mpid_rma_shm.h
@@ -329,14 +329,15 @@ static inline int MPIDI_CH3I_Shm_acc_op(const void *origin_addr, int origin_coun
if (shm_op) {
MPIDI_CH3I_SHM_MUTEX_LOCK(win_ptr);
}
- mpi_errno = do_accumulate_op((void*)origin_addr, origin_count, origin_datatype,
- (void*)((char *)base+disp_unit*target_disp), target_count, target_datatype,
- 0, op);
+ mpi_errno = do_accumulate_op((void *) origin_addr, origin_count, origin_datatype,
+ (void *) ((char *) base + disp_unit * target_disp),
+ target_count, target_datatype, 0, op);
if (shm_op) {
MPIDI_CH3I_SHM_MUTEX_UNLOCK(win_ptr);
}
- if (mpi_errno != MPI_SUCCESS) MPIU_ERR_POP(mpi_errno);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
goto fn_exit;
}
@@ -376,7 +377,8 @@ static inline int MPIDI_CH3I_Shm_acc_op(const void *origin_addr, int origin_coun
packed_buf = MPIU_Malloc(stream_size);
seg = MPID_Segment_alloc();
- MPIU_ERR_CHKANDJUMP1(seg == NULL, mpi_errno, MPI_ERR_OTHER, "**nomem", "**nomem %s", "MPID_Segment");
+ MPIU_ERR_CHKANDJUMP1(seg == NULL, mpi_errno, MPI_ERR_OTHER, "**nomem", "**nomem %s",
+ "MPID_Segment");
MPID_Segment_init(origin_addr, origin_count, origin_datatype, seg, 0);
MPID_Segment_pack(seg, first, &last, packed_buf);
MPID_Segment_free(seg);
@@ -387,7 +389,8 @@ static inline int MPIDI_CH3I_Shm_acc_op(const void *origin_addr, int origin_coun
void *tmpbuf = MPIU_Malloc(stream_count * predefined_dtp_extent);
mpi_errno = MPIR_Localcopy(tmpbuf, stream_count, basic_type,
packed_buf, stream_size, MPI_BYTE);
- if (mpi_errno != MPI_SUCCESS) MPIU_ERR_POP(mpi_errno);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
MPIU_Free(packed_buf);
packed_buf = tmpbuf;
}
@@ -396,15 +399,16 @@ static inline int MPIDI_CH3I_Shm_acc_op(const void *origin_addr, int origin_coun
MPIDI_CH3I_SHM_MUTEX_LOCK(win_ptr);
}
- mpi_errno = do_accumulate_op((void*)packed_buf, stream_count, basic_type,
- (void*)((char*)base+disp_unit*target_disp), target_count, target_datatype,
- stream_offset, op);
+ mpi_errno = do_accumulate_op((void *) packed_buf, stream_count, basic_type,
+ (void *) ((char *) base + disp_unit * target_disp),
+ target_count, target_datatype, stream_offset, op);
if (shm_op) {
MPIDI_CH3I_SHM_MUTEX_UNLOCK(win_ptr);
}
- if (mpi_errno != MPI_SUCCESS) MPIU_ERR_POP(mpi_errno);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
MPIU_Free(packed_buf);
}
@@ -471,14 +475,15 @@ static inline int MPIDI_CH3I_Shm_get_acc_op(const void *origin_addr, int origin_
if (is_empty_origin == TRUE || MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
- mpi_errno = do_accumulate_op((void*)origin_addr, origin_count, origin_datatype,
- (void*)((char *)base+disp_unit*target_disp), target_count, target_datatype,
- 0, op);
+ mpi_errno = do_accumulate_op((void *) origin_addr, origin_count, origin_datatype,
+ (void *) ((char *) base + disp_unit * target_disp),
+ target_count, target_datatype, 0, op);
if (shm_locked) {
MPIDI_CH3I_SHM_MUTEX_UNLOCK(win_ptr);
}
- if (mpi_errno != MPI_SUCCESS) MPIU_ERR_POP(mpi_errno);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
goto fn_exit;
}
@@ -518,7 +523,8 @@ static inline int MPIDI_CH3I_Shm_get_acc_op(const void *origin_addr, int origin_
packed_buf = MPIU_Malloc(stream_size);
seg = MPID_Segment_alloc();
- MPIU_ERR_CHKANDJUMP1(seg == NULL, mpi_errno, MPI_ERR_OTHER, "**nomem", "**nomem %s", "MPID_Segment");
+ MPIU_ERR_CHKANDJUMP1(seg == NULL, mpi_errno, MPI_ERR_OTHER, "**nomem", "**nomem %s",
+ "MPID_Segment");
MPID_Segment_init(origin_addr, origin_count, origin_datatype, seg, 0);
MPID_Segment_pack(seg, first, &last, packed_buf);
MPID_Segment_free(seg);
@@ -529,16 +535,18 @@ static inline int MPIDI_CH3I_Shm_get_acc_op(const void *origin_addr, int origin_
void *tmpbuf = MPIU_Malloc(stream_count * predefined_dtp_extent);
mpi_errno = MPIR_Localcopy(tmpbuf, stream_count, basic_type,
packed_buf, stream_size, MPI_BYTE);
- if (mpi_errno != MPI_SUCCESS) MPIU_ERR_POP(mpi_errno);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
MPIU_Free(packed_buf);
packed_buf = tmpbuf;
}
- mpi_errno = do_accumulate_op((void*)packed_buf, stream_count, basic_type,
- (void*)((char*)base+disp_unit*target_disp), target_count, target_datatype,
- stream_offset, op);
+ mpi_errno = do_accumulate_op((void *) packed_buf, stream_count, basic_type,
+ (void *) ((char *) base + disp_unit * target_disp),
+ target_count, target_datatype, stream_offset, op);
- if (mpi_errno != MPI_SUCCESS) MPIU_ERR_POP(mpi_errno);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
MPIU_Free(packed_buf);
}
http://git.mpich.org/mpich.git/commitdiff/b997479938511c6a3e3b7323ab5864e53…
commit b997479938511c6a3e3b7323ab5864e537110e7e
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Wed Jun 10 22:26:13 2015 -0500
Delete redundant function call.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index 6611916..74731b0 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -38,7 +38,6 @@ static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *is_able
int *made_progress);
static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * target,
int *made_progress);
-static inline int issue_ops_win(MPID_Win * win_ptr, int *made_progress);
/* check if we can switch window-wide state: FENCE_ISSUED, PSCW_ISSUED, LOCK_ALL_ISSUED */
#undef FUNCNAME
@@ -462,60 +461,6 @@ static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * targ
goto fn_exit;
}
-#undef FUNCNAME
-#define FUNCNAME issue_ops_win
-#undef FCNAME
-#define FCNAME MPIDI_QUOTE(FUNCNAME)
-static inline int issue_ops_win(MPID_Win * win_ptr, int *made_progress)
-{
- int mpi_errno = MPI_SUCCESS;
- int start_slot, end_slot, i, idx;
- int is_able_to_issue = 0;
- MPIDI_RMA_Target_t *target = NULL;
-
- (*made_progress) = 0;
-
- /* check and try to switch window state */
- mpi_errno = check_and_switch_window_state(win_ptr, &is_able_to_issue, made_progress);
- if (mpi_errno != MPI_SUCCESS)
- MPIU_ERR_POP(mpi_errno);
- if (!is_able_to_issue)
- goto fn_exit;
-
- if (win_ptr->non_empty_slots == 0)
- goto fn_exit;
-
- /* FIXME: we should optimize the issuing pattern here. */
-
- start_slot = win_ptr->comm_ptr->rank % win_ptr->num_slots;
- end_slot = start_slot + win_ptr->num_slots;
- for (i = start_slot; i < end_slot; i++) {
- if (i < win_ptr->num_slots)
- idx = i;
- else
- idx = i - win_ptr->num_slots;
-
- target = win_ptr->slots[idx].target_list_head;
- while (target != NULL) {
- int temp_progress = 0;
-
- /* issue operations to this target */
- mpi_errno = issue_ops_target(win_ptr, target, &temp_progress);
- if (mpi_errno != MPI_SUCCESS)
- MPIU_ERR_POP(mpi_errno);
- if (temp_progress)
- (*made_progress) = 1;
-
- target = target->next;
- }
- }
-
- fn_exit:
- return mpi_errno;
- fn_fail:
- goto fn_exit;
-}
-
#undef FUNCNAME
#define FUNCNAME MPIDI_CH3I_RMA_Free_ops_before_completion
@@ -823,17 +768,47 @@ int MPIDI_CH3I_RMA_Make_progress_target(MPID_Win * win_ptr, int target_rank, int
#define FCNAME MPIDI_QUOTE(FUNCNAME)
int MPIDI_CH3I_RMA_Make_progress_win(MPID_Win * win_ptr, int *made_progress)
{
- int temp_progress = 0;
int mpi_errno = MPI_SUCCESS;
+ int start_slot, end_slot, i, idx;
+ int is_able_to_issue = 0;
+ MPIDI_RMA_Target_t *target = NULL;
(*made_progress) = 0;
- /* issue operations on window */
- mpi_errno = issue_ops_win(win_ptr, &temp_progress);
- if (mpi_errno)
+ /* check and try to switch window state */
+ mpi_errno = check_and_switch_window_state(win_ptr, &is_able_to_issue, made_progress);
+ if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
- if (temp_progress)
- (*made_progress) = 1;
+ if (!is_able_to_issue)
+ goto fn_exit;
+
+ if (win_ptr->non_empty_slots == 0)
+ goto fn_exit;
+
+ /* FIXME: we should optimize the issuing pattern here. */
+
+ start_slot = win_ptr->comm_ptr->rank % win_ptr->num_slots;
+ end_slot = start_slot + win_ptr->num_slots;
+ for (i = start_slot; i < end_slot; i++) {
+ if (i < win_ptr->num_slots)
+ idx = i;
+ else
+ idx = i - win_ptr->num_slots;
+
+ target = win_ptr->slots[idx].target_list_head;
+ while (target != NULL) {
+ int temp_progress = 0;
+
+ /* issue operations to this target */
+ mpi_errno = issue_ops_target(win_ptr, target, &temp_progress);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
+ if (temp_progress)
+ (*made_progress) = 1;
+
+ target = target->next;
+ }
+ }
fn_exit:
return mpi_errno;
http://git.mpich.org/mpich.git/commitdiff/bb3e74768a87562a983dbc25db23e87df…
commit bb3e74768a87562a983dbc25db23e87df4366505
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Wed Jun 10 22:16:36 2015 -0500
Move check_and_switch_target/window_state() into issue_ops_target/window().
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index 787ffa5..6611916 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -298,10 +298,18 @@ static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * targ
{
MPIDI_RMA_Op_t *curr_op = NULL;
MPIDI_CH3_Pkt_flags_t flags;
+ int is_able_to_issue = 0;
int first_op = 1, mpi_errno = MPI_SUCCESS;
(*made_progress) = 0;
+ /* check and try to switch target state */
+ mpi_errno = check_and_switch_target_state(win_ptr, target, &is_able_to_issue, made_progress);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
+ if (!is_able_to_issue)
+ goto fn_exit;
+
if (win_ptr->non_empty_slots == 0 || target == NULL)
goto fn_exit;
@@ -462,10 +470,18 @@ static inline int issue_ops_win(MPID_Win * win_ptr, int *made_progress)
{
int mpi_errno = MPI_SUCCESS;
int start_slot, end_slot, i, idx;
+ int is_able_to_issue = 0;
MPIDI_RMA_Target_t *target = NULL;
(*made_progress) = 0;
+ /* check and try to switch window state */
+ mpi_errno = check_and_switch_window_state(win_ptr, &is_able_to_issue, made_progress);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
+ if (!is_able_to_issue)
+ goto fn_exit;
+
if (win_ptr->non_empty_slots == 0)
goto fn_exit;
@@ -482,19 +498,6 @@ static inline int issue_ops_win(MPID_Win * win_ptr, int *made_progress)
target = win_ptr->slots[idx].target_list_head;
while (target != NULL) {
int temp_progress = 0;
- int is_able_to_issue = 0;
-
- /* check target state */
- mpi_errno = check_and_switch_target_state(win_ptr, target, &is_able_to_issue,
- &temp_progress);
- if (mpi_errno != MPI_SUCCESS)
- MPIU_ERR_POP(mpi_errno);
- if (temp_progress)
- (*made_progress) = 1;
- if (!is_able_to_issue) {
- target = target->next;
- continue;
- }
/* issue operations to this target */
mpi_errno = issue_ops_target(win_ptr, target, &temp_progress);
@@ -800,15 +803,6 @@ int MPIDI_CH3I_RMA_Make_progress_target(MPID_Win * win_ptr, int target_rank, int
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
- /* check target state */
- mpi_errno = check_and_switch_target_state(win_ptr, target, &is_able_to_issue, &temp_progress);
- if (mpi_errno)
- MPIU_ERR_POP(mpi_errno);
- if (temp_progress)
- (*made_progress) = 1;
- if (!is_able_to_issue)
- goto fn_exit;
-
/* issue operations to this target */
mpi_errno = issue_ops_target(win_ptr, target, &temp_progress);
if (mpi_errno)
@@ -830,20 +824,10 @@ int MPIDI_CH3I_RMA_Make_progress_target(MPID_Win * win_ptr, int target_rank, int
int MPIDI_CH3I_RMA_Make_progress_win(MPID_Win * win_ptr, int *made_progress)
{
int temp_progress = 0;
- int is_able_to_issue = 0;
int mpi_errno = MPI_SUCCESS;
(*made_progress) = 0;
- /* check window state */
- mpi_errno = check_and_switch_window_state(win_ptr, &is_able_to_issue, &temp_progress);
- if (mpi_errno != MPI_SUCCESS)
- MPIU_ERR_POP(mpi_errno);
- if (temp_progress)
- (*made_progress) = 1;
- if (!is_able_to_issue)
- goto fn_exit;
-
/* issue operations on window */
mpi_errno = issue_ops_win(win_ptr, &temp_progress);
if (mpi_errno)
http://git.mpich.org/mpich.git/commitdiff/ec7850848485270924df41bf1c43e0bc8…
commit ec7850848485270924df41bf1c43e0bc83189901
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Fri May 29 10:58:40 2015 -0500
Return a flag from check_and_switch_target/window_state() on issuing ops.
Here we make check_and_switch_target/window_state to return a flag
indicating if the current window/target states are OK for issuing
operations.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index 8302c9a..787ffa5 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -33,8 +33,9 @@ cvars:
*/
static inline int check_and_switch_target_state(MPID_Win * win_ptr, MPIDI_RMA_Target_t * target,
+ int *is_able_to_issue, int *made_progress);
+static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *is_able_to_issue,
int *made_progress);
-static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *made_progress);
static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * target,
int *made_progress);
static inline int issue_ops_win(MPID_Win * win_ptr, int *made_progress);
@@ -44,7 +45,8 @@ static inline int issue_ops_win(MPID_Win * win_ptr, int *made_progress);
#define FUNCNAME check_and_switch_window_state
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
-static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *made_progress)
+static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *is_able_to_issue,
+ int *made_progress)
{
MPID_Request *fence_req_ptr = NULL;
int i, mpi_errno = MPI_SUCCESS;
@@ -53,12 +55,15 @@ static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *made_pr
MPIDI_RMA_FUNC_ENTER(MPID_STATE_CHECK_AND_SWITCH_WINDOW_STATE);
(*made_progress) = 0;
+ (*is_able_to_issue) = 0;
switch (win_ptr->states.access_state) {
case MPIDI_RMA_FENCE_ISSUED:
MPID_Request_get_ptr(win_ptr->fence_sync_req, fence_req_ptr);
if (MPID_Request_is_complete(fence_req_ptr)) {
win_ptr->states.access_state = MPIDI_RMA_FENCE_GRANTED;
+ (*is_able_to_issue) = 1;
+
MPID_Request_release(fence_req_ptr);
win_ptr->fence_sync_req = MPI_REQUEST_NULL;
@@ -74,6 +79,7 @@ static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *made_pr
/* for MPI_MODE_NOCHECK and all targets on SHM,
* we do not create PSCW requests on window. */
win_ptr->states.access_state = MPIDI_RMA_PSCW_GRANTED;
+ (*is_able_to_issue) = 1;
MPIDI_CH3I_num_active_issued_win--;
MPIU_Assert(MPIDI_CH3I_num_active_issued_win >= 0);
@@ -97,6 +103,7 @@ static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *made_pr
if (i == win_ptr->start_grp_size) {
win_ptr->states.access_state = MPIDI_RMA_PSCW_GRANTED;
+ (*is_able_to_issue) = 1;
MPIDI_CH3I_num_active_issued_win--;
MPIU_Assert(MPIDI_CH3I_num_active_issued_win >= 0);
@@ -112,10 +119,20 @@ static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *made_pr
case MPIDI_RMA_LOCK_ALL_ISSUED:
if (win_ptr->outstanding_locks == 0) {
win_ptr->states.access_state = MPIDI_RMA_LOCK_ALL_GRANTED;
+ (*is_able_to_issue) = 1;
+
(*made_progress) = 1;
}
break;
+ case MPIDI_RMA_PER_TARGET:
+ case MPIDI_RMA_LOCK_ALL_CALLED:
+ case MPIDI_RMA_FENCE_GRANTED:
+ case MPIDI_RMA_PSCW_GRANTED:
+ case MPIDI_RMA_LOCK_ALL_GRANTED:
+ (*is_able_to_issue) = 1;
+ break;
+
default:
break;
} /* end of switch */
@@ -135,25 +152,17 @@ static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *made_pr
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
static inline int check_and_switch_target_state(MPID_Win * win_ptr, MPIDI_RMA_Target_t * target,
- int *made_progress)
+ int *is_able_to_issue, int *made_progress)
{
int rank = win_ptr->comm_ptr->rank;
int mpi_errno = MPI_SUCCESS;
(*made_progress) = 0;
+ (*is_able_to_issue) = 0;
if (target == NULL)
goto fn_exit;
- /* This check should only be performed when window-wide sync is finished, or
- * current sync is per-target sync. */
- if (win_ptr->states.access_state == MPIDI_RMA_NONE ||
- win_ptr->states.access_state == MPIDI_RMA_FENCE_ISSUED ||
- win_ptr->states.access_state == MPIDI_RMA_PSCW_ISSUED ||
- win_ptr->states.access_state == MPIDI_RMA_LOCK_ALL_ISSUED) {
- goto fn_exit;
- }
-
switch (target->access_state) {
case MPIDI_RMA_LOCK_CALLED:
if (target->sync.sync_flag == MPIDI_RMA_SYNC_NONE ||
@@ -269,6 +278,10 @@ static inline int check_and_switch_target_state(MPID_Win * win_ptr, MPIDI_RMA_Ta
break;
} /* end of switch */
+ if (target->pending_op_list_head != NULL && target->access_state != MPIDI_RMA_LOCK_ISSUED) {
+ (*is_able_to_issue) = 1;
+ }
+
fn_exit:
return mpi_errno;
fn_fail:
@@ -292,20 +305,6 @@ static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * targ
if (win_ptr->non_empty_slots == 0 || target == NULL)
goto fn_exit;
- /* Exit if window-wide sync is not finished */
- if (win_ptr->states.access_state == MPIDI_RMA_NONE ||
- win_ptr->states.access_state == MPIDI_RMA_FENCE_ISSUED ||
- win_ptr->states.access_state == MPIDI_RMA_PSCW_ISSUED ||
- win_ptr->states.access_state == MPIDI_RMA_LOCK_ALL_ISSUED)
- goto fn_exit;
-
- /* Exit if per-target sync is not finished */
- if (win_ptr->states.access_state == MPIDI_RMA_PER_TARGET ||
- win_ptr->states.access_state == MPIDI_RMA_LOCK_ALL_CALLED) {
- if (target->access_state == MPIDI_RMA_LOCK_ISSUED)
- goto fn_exit;
- }
-
/* Issue out operations in the list. */
curr_op = target->next_op_to_issue;
while (curr_op != NULL) {
@@ -470,13 +469,6 @@ static inline int issue_ops_win(MPID_Win * win_ptr, int *made_progress)
if (win_ptr->non_empty_slots == 0)
goto fn_exit;
- /* Exit if window-wide sync is not finished */
- if (win_ptr->states.access_state == MPIDI_RMA_NONE ||
- win_ptr->states.access_state == MPIDI_RMA_FENCE_ISSUED ||
- win_ptr->states.access_state == MPIDI_RMA_PSCW_ISSUED ||
- win_ptr->states.access_state == MPIDI_RMA_LOCK_ALL_ISSUED)
- goto fn_exit;
-
/* FIXME: we should optimize the issuing pattern here. */
start_slot = win_ptr->comm_ptr->rank % win_ptr->num_slots;
@@ -490,13 +482,19 @@ static inline int issue_ops_win(MPID_Win * win_ptr, int *made_progress)
target = win_ptr->slots[idx].target_list_head;
while (target != NULL) {
int temp_progress = 0;
+ int is_able_to_issue = 0;
/* check target state */
- mpi_errno = check_and_switch_target_state(win_ptr, target, &temp_progress);
+ mpi_errno = check_and_switch_target_state(win_ptr, target, &is_able_to_issue,
+ &temp_progress);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
if (temp_progress)
(*made_progress) = 1;
+ if (!is_able_to_issue) {
+ target = target->next;
+ continue;
+ }
/* issue operations to this target */
mpi_errno = issue_ops_target(win_ptr, target, &temp_progress);
@@ -782,17 +780,20 @@ int MPIDI_CH3I_RMA_Cleanup_target_aggressive(MPID_Win * win_ptr, MPIDI_RMA_Targe
int MPIDI_CH3I_RMA_Make_progress_target(MPID_Win * win_ptr, int target_rank, int *made_progress)
{
int temp_progress = 0;
+ int is_able_to_issue = 0;
MPIDI_RMA_Target_t *target = NULL;
int mpi_errno = MPI_SUCCESS;
(*made_progress) = 0;
/* check window state */
- mpi_errno = check_and_switch_window_state(win_ptr, &temp_progress);
+ mpi_errno = check_and_switch_window_state(win_ptr, &is_able_to_issue, &temp_progress);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
if (temp_progress)
(*made_progress) = 1;
+ if (!is_able_to_issue)
+ goto fn_exit;
/* find target element */
mpi_errno = MPIDI_CH3I_Win_find_target(win_ptr, target_rank, &target);
@@ -800,11 +801,13 @@ int MPIDI_CH3I_RMA_Make_progress_target(MPID_Win * win_ptr, int target_rank, int
MPIU_ERR_POP(mpi_errno);
/* check target state */
- mpi_errno = check_and_switch_target_state(win_ptr, target, &temp_progress);
+ mpi_errno = check_and_switch_target_state(win_ptr, target, &is_able_to_issue, &temp_progress);
if (mpi_errno)
MPIU_ERR_POP(mpi_errno);
if (temp_progress)
(*made_progress) = 1;
+ if (!is_able_to_issue)
+ goto fn_exit;
/* issue operations to this target */
mpi_errno = issue_ops_target(win_ptr, target, &temp_progress);
@@ -827,16 +830,19 @@ int MPIDI_CH3I_RMA_Make_progress_target(MPID_Win * win_ptr, int target_rank, int
int MPIDI_CH3I_RMA_Make_progress_win(MPID_Win * win_ptr, int *made_progress)
{
int temp_progress = 0;
+ int is_able_to_issue = 0;
int mpi_errno = MPI_SUCCESS;
(*made_progress) = 0;
/* check window state */
- mpi_errno = check_and_switch_window_state(win_ptr, &temp_progress);
+ mpi_errno = check_and_switch_window_state(win_ptr, &is_able_to_issue, &temp_progress);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
if (temp_progress)
(*made_progress) = 1;
+ if (!is_able_to_issue)
+ goto fn_exit;
/* issue operations on window */
mpi_errno = issue_ops_win(win_ptr, &temp_progress);
http://git.mpich.org/mpich.git/commitdiff/4a53f4cca65af53857817acc11b4b34a2…
commit 4a53f4cca65af53857817acc11b4b34a2a19bc28
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Fri May 29 10:23:42 2015 -0500
Change function name used in RMA progress.
check_window_state ---> check_and_switch_window_state
check_target_state ---> check_and_switch_target_state
Both of those two functions are used to check and switch
(if possible) RMA state. Here we change their name to
proper ones.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index e106861..8302c9a 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -32,25 +32,25 @@ cvars:
=== END_MPI_T_CVAR_INFO_BLOCK ===
*/
-static inline int check_target_state(MPID_Win * win_ptr, MPIDI_RMA_Target_t * target,
- int *made_progress);
-static inline int check_window_state(MPID_Win * win_ptr, int *made_progress);
+static inline int check_and_switch_target_state(MPID_Win * win_ptr, MPIDI_RMA_Target_t * target,
+ int *made_progress);
+static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *made_progress);
static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * target,
int *made_progress);
static inline int issue_ops_win(MPID_Win * win_ptr, int *made_progress);
/* check if we can switch window-wide state: FENCE_ISSUED, PSCW_ISSUED, LOCK_ALL_ISSUED */
#undef FUNCNAME
-#define FUNCNAME check_window_state
+#define FUNCNAME check_and_switch_window_state
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
-static inline int check_window_state(MPID_Win * win_ptr, int *made_progress)
+static inline int check_and_switch_window_state(MPID_Win * win_ptr, int *made_progress)
{
MPID_Request *fence_req_ptr = NULL;
int i, mpi_errno = MPI_SUCCESS;
- MPIDI_STATE_DECL(MPID_STATE_CHECK_WINDOW_STATE);
+ MPIDI_STATE_DECL(MPID_STATE_CHECK_AND_SWITCH_WINDOW_STATE);
- MPIDI_RMA_FUNC_ENTER(MPID_STATE_CHECK_WINDOW_STATE);
+ MPIDI_RMA_FUNC_ENTER(MPID_STATE_CHECK_AND_SWITCH_WINDOW_STATE);
(*made_progress) = 0;
@@ -121,7 +121,7 @@ static inline int check_window_state(MPID_Win * win_ptr, int *made_progress)
} /* end of switch */
fn_exit:
- MPIDI_RMA_FUNC_EXIT(MPID_STATE_CHECK_WINDOW_STATE);
+ MPIDI_RMA_FUNC_EXIT(MPID_STATE_CHECK_AND_SWITCH_WINDOW_STATE);
return mpi_errno;
/* --BEGIN ERROR HANDLING-- */
fn_fail:
@@ -131,11 +131,11 @@ static inline int check_window_state(MPID_Win * win_ptr, int *made_progress)
#undef FUNCNAME
-#define FUNCNAME check_target_state
+#define FUNCNAME check_and_switch_target_state
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
-static inline int check_target_state(MPID_Win * win_ptr, MPIDI_RMA_Target_t * target,
- int *made_progress)
+static inline int check_and_switch_target_state(MPID_Win * win_ptr, MPIDI_RMA_Target_t * target,
+ int *made_progress)
{
int rank = win_ptr->comm_ptr->rank;
int mpi_errno = MPI_SUCCESS;
@@ -492,7 +492,7 @@ static inline int issue_ops_win(MPID_Win * win_ptr, int *made_progress)
int temp_progress = 0;
/* check target state */
- mpi_errno = check_target_state(win_ptr, target, &temp_progress);
+ mpi_errno = check_and_switch_target_state(win_ptr, target, &temp_progress);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
if (temp_progress)
@@ -788,7 +788,7 @@ int MPIDI_CH3I_RMA_Make_progress_target(MPID_Win * win_ptr, int target_rank, int
(*made_progress) = 0;
/* check window state */
- mpi_errno = check_window_state(win_ptr, &temp_progress);
+ mpi_errno = check_and_switch_window_state(win_ptr, &temp_progress);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
if (temp_progress)
@@ -800,7 +800,7 @@ int MPIDI_CH3I_RMA_Make_progress_target(MPID_Win * win_ptr, int target_rank, int
MPIU_ERR_POP(mpi_errno);
/* check target state */
- mpi_errno = check_target_state(win_ptr, target, &temp_progress);
+ mpi_errno = check_and_switch_target_state(win_ptr, target, &temp_progress);
if (mpi_errno)
MPIU_ERR_POP(mpi_errno);
if (temp_progress)
@@ -832,7 +832,7 @@ int MPIDI_CH3I_RMA_Make_progress_win(MPID_Win * win_ptr, int *made_progress)
(*made_progress) = 0;
/* check window state */
- mpi_errno = check_window_state(win_ptr, &temp_progress);
+ mpi_errno = check_and_switch_window_state(win_ptr, &temp_progress);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
if (temp_progress)
http://git.mpich.org/mpich.git/commitdiff/bf114ec3827eeeb9ab17b26b5ebf72935…
commit bf114ec3827eeeb9ab17b26b5ebf7293575ce763
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Thu May 28 13:29:22 2015 -0500
Modify MPICH infrastructure to support atomic GET.
When GACC/FOP is used with MPI_NO_OP, the operation is essentially
an atomic GET. Originally MPICH implemented this by converting
GACC/FOP to GET, which lost the atomicity of that operation.
In this patch, we modify the implementation of GACC/FOP to support
atomic GET. Main modifications are listed below:
(1) When streaming GACC operation, originally we use origin data
size to calculate the stream unit size. Since origin data is
zero in atomic GET, here we use target data size instead
to calculate the stream unit size.
(2) On the origin side, if it is atomic GET, CH3 just issues packet
header and metadata for derived datatypes (if needed) and does
not try to issue from origin buffer; on the target side, after
packet header and metadata for derived datatypes (if needed) are
received, the final request handler is triggered, CH3 does not
try to receive any data from origin.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_issue.h b/src/mpid/ch3/include/mpid_rma_issue.h
index 6eb300e..b13ed88 100644
--- a/src/mpid/ch3/include/mpid_rma_issue.h
+++ b/src/mpid/ch3/include/mpid_rma_issue.h
@@ -182,11 +182,21 @@ static int issue_from_origin_buffer(MPIDI_RMA_Op_t * rma_op, MPIDI_VC_t * vc,
MPI_Datatype *datatypes = NULL;
MPI_Aint dt_true_lb;
MPIDI_CH3_Pkt_flags_t flags;
+ int is_empty_origin = FALSE;
int mpi_errno = MPI_SUCCESS;
MPIDI_STATE_DECL(MPID_STATE_ISSUE_FROM_ORIGIN_BUFFER);
MPIDI_FUNC_ENTER(MPID_STATE_ISSUE_FROM_ORIGIN_BUFFER);
+ /* Judge if origin buffer is empty (this can only happens for
+ * GACC and FOP when op is MPI_NO_OP). */
+ if ((rma_op->pkt).type == MPIDI_CH3_PKT_GET_ACCUM || (rma_op->pkt).type == MPIDI_CH3_PKT_FOP) {
+ MPI_Op op;
+ MPIDI_CH3_PKT_RMA_GET_OP(rma_op->pkt, op, mpi_errno);
+ if (op == MPI_NO_OP)
+ is_empty_origin = TRUE;
+ }
+
/* Judge if target datatype is derived datatype. */
MPIDI_CH3_PKT_RMA_GET_TARGET_DATATYPE(rma_op->pkt, target_datatype, mpi_errno);
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
@@ -203,14 +213,21 @@ static int issue_from_origin_buffer(MPIDI_RMA_Op_t * rma_op, MPIDI_VC_t * vc,
}
}
- /* Judge if origin datatype is derived datatype. */
- if (!MPIR_DATATYPE_IS_PREDEFINED(rma_op->origin_datatype)) {
- MPID_Datatype_get_ptr(rma_op->origin_datatype, origin_dtp);
- }
+ if (is_empty_origin == FALSE) {
+ /* Judge if origin datatype is derived datatype. */
+ if (!MPIR_DATATYPE_IS_PREDEFINED(rma_op->origin_datatype)) {
+ MPID_Datatype_get_ptr(rma_op->origin_datatype, origin_dtp);
+ }
- /* check if origin data is contiguous and get true lb */
- MPID_Datatype_is_contig(rma_op->origin_datatype, &is_origin_contig);
- MPID_Datatype_get_true_lb(rma_op->origin_datatype, &dt_true_lb);
+ /* check if origin data is contiguous and get true lb */
+ MPID_Datatype_is_contig(rma_op->origin_datatype, &is_origin_contig);
+ MPID_Datatype_get_true_lb(rma_op->origin_datatype, &dt_true_lb);
+ }
+ else {
+ /* origin buffer is empty, mark origin data as contig and true_lb as 0. */
+ is_origin_contig = 1;
+ dt_true_lb = 0;
+ }
iov[iovcnt].MPID_IOV_BUF = (MPID_IOV_BUF_CAST) & (rma_op->pkt);
iov[iovcnt].MPID_IOV_LEN = sizeof(rma_op->pkt);
@@ -225,10 +242,12 @@ static int issue_from_origin_buffer(MPIDI_RMA_Op_t * rma_op, MPIDI_VC_t * vc,
* (3) origin datatype is contiguous (do not need to pack the data and send);
*/
- iov[iovcnt].MPID_IOV_BUF =
- (MPID_IOV_BUF_CAST) ((char *) rma_op->origin_addr + dt_true_lb + stream_offset);
- iov[iovcnt].MPID_IOV_LEN = stream_size;
- iovcnt++;
+ if (is_empty_origin == FALSE) {
+ iov[iovcnt].MPID_IOV_BUF =
+ (MPID_IOV_BUF_CAST) ((char *) rma_op->origin_addr + dt_true_lb + stream_offset);
+ iov[iovcnt].MPID_IOV_LEN = stream_size;
+ iovcnt++;
+ }
MPIU_THREAD_CS_ENTER(CH3COMM, vc);
mpi_errno = MPIDI_CH3_iStartMsgv(vc, iov, iovcnt, &req);
@@ -294,10 +313,13 @@ static int issue_from_origin_buffer(MPIDI_RMA_Op_t * rma_op, MPIDI_VC_t * vc,
if (is_origin_contig) {
/* origin data is contiguous */
- iov[iovcnt].MPID_IOV_BUF =
- (MPID_IOV_BUF_CAST) ((char *) rma_op->origin_addr + dt_true_lb + stream_offset);
- iov[iovcnt].MPID_IOV_LEN = stream_size;
- iovcnt++;
+
+ if (is_empty_origin == FALSE) {
+ iov[iovcnt].MPID_IOV_BUF =
+ (MPID_IOV_BUF_CAST) ((char *) rma_op->origin_addr + dt_true_lb + stream_offset);
+ iov[iovcnt].MPID_IOV_LEN = stream_size;
+ iovcnt++;
+ }
MPIU_THREAD_CS_ENTER(CH3COMM, vc);
mpi_errno = MPIDI_CH3_iSendv(vc, req, iov, iovcnt);
@@ -336,7 +358,24 @@ static int issue_from_origin_buffer(MPIDI_RMA_Op_t * rma_op, MPIDI_VC_t * vc,
/* create a new datatype containing the dtype_info, dataloop, and origin data */
- if (flags & MPIDI_CH3_PKT_FLAG_RMA_STREAM) {
+ if (is_empty_origin == TRUE) {
+ count = 2;
+ ints = (int *) MPIU_Malloc(sizeof(int) * (count + 1));
+ blocklens = &ints[1];
+ displaces = (MPI_Aint *) MPIU_Malloc(sizeof(MPI_Aint) * count);
+ datatypes = (MPI_Datatype *) MPIU_Malloc(sizeof(MPI_Datatype) * count);
+
+ ints[0] = count;
+
+ displaces[0] = MPIU_PtrToAint(&(rma_op->dtype_info));
+ blocklens[0] = sizeof(MPIDI_RMA_dtype_info);
+ datatypes[0] = MPI_BYTE;
+
+ displaces[1] = MPIU_PtrToAint(rma_op->dataloop);
+ MPIU_Assign_trunc(blocklens[1], target_dtp->dataloop_size, int);
+ datatypes[1] = MPI_BYTE;
+ }
+ else if (flags & MPIDI_CH3_PKT_FLAG_RMA_STREAM) {
segp = MPID_Segment_alloc();
MPIU_ERR_CHKANDJUMP1(segp == NULL, mpi_errno, MPI_ERR_OTHER,
"**nomem", "**nomem %s", "MPID_Segment_alloc");
@@ -685,8 +724,8 @@ static int issue_get_acc_op(MPIDI_RMA_Op_t * rma_op, MPID_Win * win_ptr,
MPI_Aint stream_elem_count, stream_unit_count;
MPI_Aint predefined_dtp_size, predefined_dtp_count, predefined_dtp_extent;
MPI_Aint total_len, rest_len;
- MPI_Aint origin_dtp_size;
- MPID_Datatype *origin_dtp_ptr = NULL;
+ MPI_Aint target_dtp_size;
+ MPID_Datatype *target_dtp_ptr = NULL;
int mpi_errno = MPI_SUCCESS;
MPIDI_STATE_DECL(MPID_STATE_ISSUE_GET_ACC_OP);
@@ -746,22 +785,22 @@ static int issue_get_acc_op(MPIDI_RMA_Op_t * rma_op, MPID_Win * win_ptr,
goto fn_exit;
}
- /* Get total length of origin data */
- MPID_Datatype_get_size_macro(rma_op->origin_datatype, origin_dtp_size);
- total_len = origin_dtp_size * rma_op->origin_count;
+ /* Get total length of target data */
+ MPID_Datatype_get_size_macro(get_accum_pkt->datatype, target_dtp_size);
+ total_len = target_dtp_size * get_accum_pkt->count;
/* Get size and count for predefined datatype elements */
- if (MPIR_DATATYPE_IS_PREDEFINED(rma_op->origin_datatype)) {
- predefined_dtp_size = origin_dtp_size;
- predefined_dtp_count = rma_op->origin_count;
- MPID_Datatype_get_extent_macro(rma_op->origin_datatype, predefined_dtp_extent);
+ if (MPIR_DATATYPE_IS_PREDEFINED(get_accum_pkt->datatype)) {
+ predefined_dtp_size = target_dtp_size;
+ predefined_dtp_count = get_accum_pkt->count;
+ MPID_Datatype_get_extent_macro(get_accum_pkt->datatype, predefined_dtp_extent);
}
else {
- MPID_Datatype_get_ptr(rma_op->origin_datatype, origin_dtp_ptr);
- MPIU_Assert(origin_dtp_ptr != NULL && origin_dtp_ptr->basic_type != MPI_DATATYPE_NULL);
- MPID_Datatype_get_size_macro(origin_dtp_ptr->basic_type, predefined_dtp_size);
+ MPID_Datatype_get_ptr(get_accum_pkt->datatype, target_dtp_ptr);
+ MPIU_Assert(target_dtp_ptr != NULL && target_dtp_ptr->basic_type != MPI_DATATYPE_NULL);
+ MPID_Datatype_get_size_macro(target_dtp_ptr->basic_type, predefined_dtp_size);
predefined_dtp_count = total_len / predefined_dtp_size;
- MPID_Datatype_get_extent_macro(origin_dtp_ptr->basic_type, predefined_dtp_extent);
+ MPID_Datatype_get_extent_macro(target_dtp_ptr->basic_type, predefined_dtp_extent);
}
MPIU_Assert(predefined_dtp_count > 0 && predefined_dtp_size > 0 && predefined_dtp_extent > 0);
diff --git a/src/mpid/ch3/include/mpidpkt.h b/src/mpid/ch3/include/mpidpkt.h
index 1abc4b2..046ca96 100644
--- a/src/mpid/ch3/include/mpidpkt.h
+++ b/src/mpid/ch3/include/mpidpkt.h
@@ -367,6 +367,29 @@ MPIDI_CH3_PKT_DEFS
} \
}
+#define MPIDI_CH3_PKT_RMA_GET_OP(pkt_, op_, err_) \
+ { \
+ /* This macro returns op in RMA operation packets (ACC, GACC, \
+ FOP) */ \
+ err_ = MPI_SUCCESS; \
+ switch((pkt_).type) { \
+ case (MPIDI_CH3_PKT_ACCUMULATE): \
+ case (MPIDI_CH3_PKT_ACCUMULATE_IMMED): \
+ op_ = (pkt_).accum.op; \
+ break; \
+ case (MPIDI_CH3_PKT_GET_ACCUM): \
+ case (MPIDI_CH3_PKT_GET_ACCUM_IMMED): \
+ op_ = (pkt_).get_accum.op; \
+ break; \
+ case (MPIDI_CH3_PKT_FOP): \
+ case (MPIDI_CH3_PKT_FOP_IMMED): \
+ op_ = (pkt_).fop.op; \
+ break; \
+ default: \
+ MPIU_ERR_SETANDJUMP1(err_, MPI_ERR_OTHER, "**invalidpkt", "**invalidpkt %d", (pkt_).type); \
+ } \
+ }
+
#define MPIDI_CH3_PKT_RMA_ERASE_FLAGS(pkt_, err_) \
{ \
/* This macro erases flags in RMA operation packets (PUT, GET, \
diff --git a/src/mpid/ch3/include/mpidrma.h b/src/mpid/ch3/include/mpidrma.h
index db1e7ec..bfaa7a7 100644
--- a/src/mpid/ch3/include/mpidrma.h
+++ b/src/mpid/ch3/include/mpidrma.h
@@ -357,7 +357,7 @@ static inline int enqueue_lock_origin(MPID_Win * win_ptr, MPIDI_VC_t * vc,
MPI_Aint type_size = 0;
MPI_Aint type_extent;
MPIDI_msg_sz_t recv_data_sz = 0;
- MPIDI_msg_sz_t buf_size;
+ MPIDI_msg_sz_t buf_size = 0;
MPID_Request *req = NULL;
MPI_Datatype target_dtp;
int target_count;
@@ -382,11 +382,15 @@ static inline int enqueue_lock_origin(MPID_Win * win_ptr, MPIDI_VC_t * vc,
else {
MPI_Aint stream_elem_count;
MPI_Aint total_len;
-
- stream_elem_count = MPIDI_CH3U_SRBuf_size / type_extent;
- total_len = type_size * target_count;
- recv_data_sz = MPIR_MIN(total_len, type_size * stream_elem_count);
- buf_size = type_extent * (recv_data_sz / type_size);
+ MPI_Op op;
+
+ MPIDI_CH3_PKT_RMA_GET_OP((*pkt), op, mpi_errno);
+ if (op != MPI_NO_OP) {
+ stream_elem_count = MPIDI_CH3U_SRBuf_size / type_extent;
+ total_len = type_size * target_count;
+ recv_data_sz = MPIR_MIN(total_len, type_size * stream_elem_count);
+ buf_size = type_extent * (recv_data_sz / type_size);
+ }
}
if (flags & MPIDI_CH3_PKT_FLAG_RMA_STREAM) {
@@ -465,7 +469,7 @@ static inline int enqueue_lock_origin(MPID_Win * win_ptr, MPIDI_VC_t * vc,
data_len = *buflen - sizeof(MPIDI_CH3_Pkt_t);
data_buf = (char *) pkt + sizeof(MPIDI_CH3_Pkt_t);
- MPIU_Assert(req->dev.recv_data_sz > 0);
+ MPIU_Assert(req->dev.recv_data_sz >= 0);
}
else {
req->dev.user_buf = new_ptr->data;
@@ -478,7 +482,7 @@ static inline int enqueue_lock_origin(MPID_Win * win_ptr, MPIDI_VC_t * vc,
data_len = *buflen - sizeof(MPIDI_CH3_Pkt_t);
data_buf = (char *) pkt + sizeof(MPIDI_CH3_Pkt_t);
- MPIU_Assert(req->dev.recv_data_sz > 0);
+ MPIU_Assert(req->dev.recv_data_sz >= 0);
}
mpi_errno = MPIDI_CH3U_Receive_data_found(req, data_buf, &data_len, &complete);
diff --git a/src/mpid/ch3/src/ch3u_handle_recv_req.c b/src/mpid/ch3/src/ch3u_handle_recv_req.c
index b2c6e29..2eddc41 100644
--- a/src/mpid/ch3/src/ch3u_handle_recv_req.c
+++ b/src/mpid/ch3/src/ch3u_handle_recv_req.c
@@ -242,11 +242,19 @@ int MPIDI_CH3_ReqHandler_GaccumRecvComplete(MPIDI_VC_t * vc, MPID_Request * rreq
MPI_Aint predef_count, predef_dtp_size;
MPI_Aint dt_true_lb;
MPI_Aint stream_offset;
+ int is_empty_origin = FALSE;
+ MPI_Aint extent, type_size;
+ MPI_Aint stream_data_len, total_len;
MPIU_CHKPMEM_DECL(1);
MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_REQHANDLER_GACCUMRECVCOMPLETE);
MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3_REQHANDLER_GACCUMRECVCOMPLETE);
+ /* Judge if origin buffer is empty */
+ if (rreq->dev.op == MPI_NO_OP) {
+ is_empty_origin = TRUE;
+ }
+
MPID_Win_get_ptr(rreq->dev.target_win_handle, win_ptr);
if (MPIR_DATATYPE_IS_PREDEFINED(rreq->dev.datatype))
@@ -256,8 +264,14 @@ int MPIDI_CH3_ReqHandler_GaccumRecvComplete(MPIDI_VC_t * vc, MPID_Request * rreq
}
MPIU_Assert(basic_type != MPI_DATATYPE_NULL);
+ /* Use target data to calculate current stream unit size */
+ MPID_Datatype_get_size_macro(rreq->dev.datatype, type_size);
+ total_len = type_size * rreq->dev.user_count;
+ MPID_Datatype_get_extent_macro(rreq->dev.datatype, extent);
+ stream_data_len = MPIR_MIN(total_len, (MPIDI_CH3U_SRBuf_size / extent) * type_size);
+
MPID_Datatype_get_size_macro(basic_type, predef_dtp_size);
- predef_count = rreq->dev.recv_data_sz / predef_dtp_size;
+ predef_count = stream_data_len / predef_dtp_size;
MPIU_Assert(predef_count > 0);
MPIDI_Pkt_init(get_accum_resp_pkt, MPIDI_CH3_PKT_GET_ACCUM_RESP);
@@ -288,7 +302,7 @@ int MPIDI_CH3_ReqHandler_GaccumRecvComplete(MPIDI_VC_t * vc, MPID_Request * rreq
MPIU_Object_set_ref(resp_req, 1);
MPIDI_Request_set_type(resp_req, MPIDI_REQUEST_TYPE_GET_ACCUM_RESP);
- MPIU_CHKPMEM_MALLOC(resp_req->dev.user_buf, void *, rreq->dev.recv_data_sz,
+ MPIU_CHKPMEM_MALLOC(resp_req->dev.user_buf, void *, stream_data_len,
mpi_errno, "GACC resp. buffer");
/* NOTE: 'copy data + ACC' needs to be atomic */
@@ -301,12 +315,12 @@ int MPIDI_CH3_ReqHandler_GaccumRecvComplete(MPIDI_VC_t * vc, MPID_Request * rreq
if (is_contig) {
MPIU_Memcpy(resp_req->dev.user_buf,
(void *) ((char *) rreq->dev.real_user_buf + dt_true_lb +
- stream_offset), rreq->dev.recv_data_sz);
+ stream_offset), stream_data_len);
}
else {
MPID_Segment *seg = MPID_Segment_alloc();
MPI_Aint first = stream_offset;
- MPI_Aint last = first + rreq->dev.recv_data_sz;
+ MPI_Aint last = first + stream_data_len;
if (seg == NULL) {
if (win_ptr->shm_allocated == TRUE)
@@ -343,7 +357,7 @@ int MPIDI_CH3_ReqHandler_GaccumRecvComplete(MPIDI_VC_t * vc, MPID_Request * rreq
iov[0].MPID_IOV_BUF = (MPID_IOV_BUF_CAST) get_accum_resp_pkt;
iov[0].MPID_IOV_LEN = sizeof(*get_accum_resp_pkt);
iov[1].MPID_IOV_BUF = (MPID_IOV_BUF_CAST) ((char *) resp_req->dev.user_buf);
- iov[1].MPID_IOV_LEN = rreq->dev.recv_data_sz;
+ iov[1].MPID_IOV_LEN = stream_data_len;
iovcnt = 2;
MPIU_THREAD_CS_ENTER(CH3COMM, vc);
@@ -357,8 +371,12 @@ int MPIDI_CH3_ReqHandler_GaccumRecvComplete(MPIDI_VC_t * vc, MPID_Request * rreq
MPIU_Assert(MPIDI_Request_get_type(rreq) == MPIDI_REQUEST_TYPE_GET_ACCUM_RECV);
- /* free the temporary buffer */
- MPIDI_CH3U_SRBuf_free(rreq);
+ if (is_empty_origin == FALSE) {
+ /* free the temporary buffer.
+ * When origin data is zero, there
+ * is no temporary buffer allocated */
+ MPIDI_CH3U_SRBuf_free(rreq);
+ }
/* mark data transfer as complete and decrement CC */
MPIDI_CH3U_Request_complete(rreq);
@@ -391,11 +409,17 @@ int MPIDI_CH3_ReqHandler_FOPRecvComplete(MPIDI_VC_t * vc, MPID_Request * rreq, i
MPIDI_CH3_Pkt_t upkt;
MPIDI_CH3_Pkt_fop_resp_t *fop_resp_pkt = &upkt.fop_resp;
int is_contig;
+ int is_empty_origin = FALSE;
MPIU_CHKPMEM_DECL(1);
MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_REQHANDLER_FOPRECVCOMPLETE);
MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3_REQHANDLER_FOPRECVCOMPLETE);
+ /* Judge if origin buffer is empty */
+ if (rreq->dev.op == MPI_NO_OP) {
+ is_empty_origin = TRUE;
+ }
+
MPIU_Assert(MPIDI_Request_get_type(rreq) == MPIDI_REQUEST_TYPE_FOP_RECV);
MPID_Win_get_ptr(rreq->dev.target_win_handle, win_ptr);
@@ -478,8 +502,12 @@ int MPIDI_CH3_ReqHandler_FOPRecvComplete(MPIDI_VC_t * vc, MPID_Request * rreq, i
MPIU_ERR_CHKANDJUMP(mpi_errno != MPI_SUCCESS, mpi_errno, MPI_ERR_OTHER, "**ch3|rmamsg");
- /* free the temporary buffer */
- MPIU_Free((char *) rreq->dev.user_buf);
+ if (is_empty_origin == FALSE) {
+ /* free the temporary buffer.
+ * When origin data is zero, there
+ * is no temporary buffer allocated */
+ MPIU_Free((char *) rreq->dev.user_buf);
+ }
/* mark data transfer as complete and decrement CC */
MPIDI_CH3U_Request_complete(rreq);
@@ -650,7 +678,7 @@ int MPIDI_CH3_ReqHandler_AccumMetadataRecvComplete(MPIDI_VC_t * vc ATTRIBUTE((un
#define FUNCNAME MPIDI_CH3_ReqHandler_GaccumMetadataRecvComplete
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
-int MPIDI_CH3_ReqHandler_GaccumMetadataRecvComplete(MPIDI_VC_t * vc ATTRIBUTE((unused)),
+int MPIDI_CH3_ReqHandler_GaccumMetadataRecvComplete(MPIDI_VC_t * vc,
MPID_Request * rreq, int *complete)
{
int mpi_errno = MPI_SUCCESS;
@@ -660,10 +688,16 @@ int MPIDI_CH3_ReqHandler_GaccumMetadataRecvComplete(MPIDI_VC_t * vc ATTRIBUTE((u
MPI_Aint stream_offset;
MPI_Aint type_size;
MPI_Datatype basic_dtp;
+ int is_empty_origin = FALSE;
MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_REQHANDLER_GACCUMMETADATARECVCOMPLETE);
MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3_REQHANDLER_GACCUMMETADATARECVCOMPLETE);
+ /* Judge if origin buffer is empty */
+ if (rreq->dev.op == MPI_NO_OP) {
+ is_empty_origin = TRUE;
+ }
+
if (rreq->dev.flags & MPIDI_CH3_PKT_FLAG_RMA_STREAM) {
MPIU_Assert(rreq->dev.ext_hdr_ptr != NULL);
stream_offset = ((MPIDI_CH3_Ext_pkt_get_accum_t *) rreq->dev.ext_hdr_ptr)->stream_offset;
@@ -698,49 +732,60 @@ int MPIDI_CH3_ReqHandler_GaccumMetadataRecvComplete(MPIDI_VC_t * vc ATTRIBUTE((u
basic_dtp = rreq->dev.datatype;
}
- MPID_Datatype_get_size_macro(basic_dtp, basic_type_size);
- MPID_Datatype_get_extent_macro(basic_dtp, basic_type_extent);
+ if (is_empty_origin == TRUE) {
+ rreq->dev.recv_data_sz = 0;
- MPIU_Assert(!MPIDI_Request_get_srbuf_flag(rreq));
- /* allocate a SRBuf for receiving stream unit */
- MPIDI_CH3U_SRBuf_alloc(rreq, MPIDI_CH3U_SRBuf_size);
- /* --BEGIN ERROR HANDLING-- */
- if (rreq->dev.tmpbuf_sz == 0) {
- MPIU_DBG_MSG(CH3_CHANNEL, TYPICAL, "SRBuf allocation failure");
- mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL,
- FCNAME, __LINE__, MPI_ERR_OTHER, "**nomem",
- "**nomem %d", MPIDI_CH3U_SRBuf_size);
- rreq->status.MPI_ERROR = mpi_errno;
- goto fn_fail;
+ /* There is no origin data coming, directly call final req handler. */
+ mpi_errno = MPIDI_CH3_ReqHandler_GaccumRecvComplete(vc, rreq, complete);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
}
- /* --END ERROR HANDLING-- */
+ else {
+ MPID_Datatype_get_size_macro(basic_dtp, basic_type_size);
+ MPID_Datatype_get_extent_macro(basic_dtp, basic_type_extent);
+
+ MPIU_Assert(!MPIDI_Request_get_srbuf_flag(rreq));
+ /* allocate a SRBuf for receiving stream unit */
+ MPIDI_CH3U_SRBuf_alloc(rreq, MPIDI_CH3U_SRBuf_size);
+ /* --BEGIN ERROR HANDLING-- */
+ if (rreq->dev.tmpbuf_sz == 0) {
+ MPIU_DBG_MSG(CH3_CHANNEL, TYPICAL, "SRBuf allocation failure");
+ mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL,
+ FCNAME, __LINE__, MPI_ERR_OTHER, "**nomem",
+ "**nomem %d", MPIDI_CH3U_SRBuf_size);
+ rreq->status.MPI_ERROR = mpi_errno;
+ goto fn_fail;
+ }
+ /* --END ERROR HANDLING-- */
- rreq->dev.user_buf = rreq->dev.tmpbuf;
+ rreq->dev.user_buf = rreq->dev.tmpbuf;
- total_len = type_size * rreq->dev.user_count;
- rest_len = total_len - stream_offset;
- stream_elem_count = MPIDI_CH3U_SRBuf_size / basic_type_extent;
+ total_len = type_size * rreq->dev.user_count;
+ rest_len = total_len - stream_offset;
+ stream_elem_count = MPIDI_CH3U_SRBuf_size / basic_type_extent;
- rreq->dev.recv_data_sz = MPIR_MIN(rest_len, stream_elem_count * basic_type_size);
+ rreq->dev.recv_data_sz = MPIR_MIN(rest_len, stream_elem_count * basic_type_size);
- 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");
+ 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.recv_data_sz / basic_type_size),
- basic_dtp, rreq->dev.segment_ptr, 0);
- rreq->dev.segment_first = 0;
- rreq->dev.segment_size = rreq->dev.recv_data_sz;
+ MPID_Segment_init(rreq->dev.user_buf,
+ (rreq->dev.recv_data_sz / basic_type_size),
+ basic_dtp, rreq->dev.segment_ptr, 0);
+ rreq->dev.segment_first = 0;
+ rreq->dev.segment_size = rreq->dev.recv_data_sz;
- mpi_errno = MPIDI_CH3U_Request_load_recv_iov(rreq);
- if (mpi_errno != MPI_SUCCESS) {
- MPIU_ERR_SETANDJUMP(mpi_errno, MPI_ERR_OTHER, "**ch3|loadrecviov");
+ mpi_errno = MPIDI_CH3U_Request_load_recv_iov(rreq);
+ if (mpi_errno != MPI_SUCCESS) {
+ MPIU_ERR_SETANDJUMP(mpi_errno, MPI_ERR_OTHER, "**ch3|loadrecviov");
+ }
+ if (!rreq->dev.OnDataAvail)
+ rreq->dev.OnDataAvail = MPIDI_CH3_ReqHandler_GaccumRecvComplete;
+
+ *complete = FALSE;
}
- if (!rreq->dev.OnDataAvail)
- rreq->dev.OnDataAvail = MPIDI_CH3_ReqHandler_GaccumRecvComplete;
- *complete = FALSE;
fn_fail:
MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3_REQHANDLER_GACCUMMETADATARECVCOMPLETE);
return mpi_errno;
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index f0de4d6..39f9f57 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -708,11 +708,17 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPIDI_RMA_Op_t *op_ptr = NULL;
MPIDI_CH3_Pkt_get_accum_t *get_accum_pkt;
MPI_Aint origin_type_size;
+ MPI_Aint target_type_size;
int use_immed_pkt = FALSE, i;
int is_origin_contig, is_target_contig, is_result_contig;
MPI_Aint stream_elem_count, stream_unit_count;
MPI_Aint predefined_dtp_size, predefined_dtp_count, predefined_dtp_extent;
MPID_Datatype *origin_dtp = NULL, *target_dtp = NULL, *result_dtp = NULL;
+ int is_empty_origin = FALSE;
+
+ /* Judge if origin buffer is empty */
+ if (op == MPI_NO_OP)
+ is_empty_origin = TRUE;
/* Append the operation to the window's RMA ops queue */
mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &op_ptr);
@@ -738,7 +744,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
/* if source or target datatypes are derived, increment their
* reference counts */
- if (!MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
+ if (is_empty_origin == FALSE && !MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
MPID_Datatype_get_ptr(origin_datatype, origin_dtp);
}
if (!MPIR_DATATYPE_IS_PREDEFINED(result_datatype)) {
@@ -748,20 +754,28 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPID_Datatype_get_ptr(target_datatype, target_dtp);
}
- MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
- MPIU_Assign_trunc(orig_data_sz, origin_count * origin_type_size, MPIDI_msg_sz_t);
+ if (is_empty_origin == FALSE) {
+ MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
+ MPIU_Assign_trunc(orig_data_sz, origin_count * origin_type_size, MPIDI_msg_sz_t);
+ }
+ else {
+ /* If origin buffer is empty, set origin data size to 0 */
+ orig_data_sz = 0;
+ }
+
+ MPID_Datatype_get_size_macro(target_datatype, target_type_size);
/* Get size and count for predefined datatype elements */
- if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
- predefined_dtp_size = origin_type_size;
- predefined_dtp_count = origin_count;
- MPID_Datatype_get_extent_macro(origin_datatype, predefined_dtp_extent);
+ if (MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
+ predefined_dtp_size = target_type_size;
+ predefined_dtp_count = target_count;
+ MPID_Datatype_get_extent_macro(target_datatype, predefined_dtp_extent);
}
else {
- MPIU_Assert(origin_dtp->basic_type != MPI_DATATYPE_NULL);
- MPID_Datatype_get_size_macro(origin_dtp->basic_type, predefined_dtp_size);
- predefined_dtp_count = orig_data_sz / predefined_dtp_size;
- MPID_Datatype_get_extent_macro(origin_dtp->basic_type, predefined_dtp_extent);
+ MPIU_Assert(target_dtp->basic_type != MPI_DATATYPE_NULL);
+ MPID_Datatype_get_size_macro(target_dtp->basic_type, predefined_dtp_size);
+ predefined_dtp_count = target_data_sz / predefined_dtp_size;
+ MPID_Datatype_get_extent_macro(target_dtp->basic_type, predefined_dtp_extent);
}
MPIU_Assert(predefined_dtp_count > 0 && predefined_dtp_size > 0 &&
predefined_dtp_extent > 0);
@@ -784,21 +798,27 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
}
}
- MPID_Datatype_is_contig(origin_datatype, &is_origin_contig);
+ if (is_empty_origin == FALSE) {
+ MPID_Datatype_is_contig(origin_datatype, &is_origin_contig);
+ }
+ else {
+ /* If origin buffer is empty, mark origin data as contig data */
+ is_origin_contig = 1;
+ }
MPID_Datatype_is_contig(target_datatype, &is_target_contig);
MPID_Datatype_is_contig(result_datatype, &is_result_contig);
/* Judge if we can use IMMED data packet */
- if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ if ((is_empty_origin == TRUE || MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) &&
MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
MPIR_DATATYPE_IS_PREDEFINED(target_datatype) &&
is_origin_contig && is_target_contig && is_result_contig) {
- if (orig_data_sz <= MPIDI_RMA_IMMED_BYTES)
+ if (target_data_sz <= MPIDI_RMA_IMMED_BYTES)
use_immed_pkt = TRUE;
}
/* Judge if this operation is a piggyback candidate */
- if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ if ((is_empty_origin == TRUE || MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) &&
MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
diff --git a/src/mpid/ch3/src/ch3u_rma_pkthandler.c b/src/mpid/ch3/src/ch3u_rma_pkthandler.c
index 29b00ba..8dbabd1 100644
--- a/src/mpid/ch3/src/ch3u_rma_pkthandler.c
+++ b/src/mpid/ch3/src/ch3u_rma_pkthandler.c
@@ -979,39 +979,53 @@ int MPIDI_CH3_PktHandler_GetAccumulate(MPIDI_VC_t * vc, MPIDI_CH3_Pkt_t * pkt,
*buflen = sizeof(MPIDI_CH3_Pkt_t);
}
else {
+ int is_empty_origin = FALSE;
+
+ /* Judge if origin data is zero. */
+ if (get_accum_pkt->op == MPI_NO_OP)
+ is_empty_origin = TRUE;
+
req->dev.OnFinal = MPIDI_CH3_ReqHandler_GaccumRecvComplete;
- MPID_Datatype_get_extent_macro(get_accum_pkt->datatype, extent);
+ if (is_empty_origin == TRUE) {
+ req->dev.recv_data_sz = 0;
- MPIU_Assert(!MPIDI_Request_get_srbuf_flag(req));
- /* allocate a SRBuf for receiving stream unit */
- MPIDI_CH3U_SRBuf_alloc(req, MPIDI_CH3U_SRBuf_size);
- /* --BEGIN ERROR HANDLING-- */
- if (req->dev.tmpbuf_sz == 0) {
- MPIU_DBG_MSG(CH3_CHANNEL, TYPICAL, "SRBuf allocation failure");
- mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL,
- FCNAME, __LINE__, MPI_ERR_OTHER, "**nomem",
- "**nomem %d", MPIDI_CH3U_SRBuf_size);
- req->status.MPI_ERROR = mpi_errno;
- goto fn_fail;
+ *buflen = sizeof(MPIDI_CH3_Pkt_t);
+ complete = 1;
}
- /* --END ERROR HANDLING-- */
+ else {
+ MPID_Datatype_get_extent_macro(get_accum_pkt->datatype, extent);
+
+ MPIU_Assert(!MPIDI_Request_get_srbuf_flag(req));
+ /* allocate a SRBuf for receiving stream unit */
+ MPIDI_CH3U_SRBuf_alloc(req, MPIDI_CH3U_SRBuf_size);
+ /* --BEGIN ERROR HANDLING-- */
+ if (req->dev.tmpbuf_sz == 0) {
+ MPIU_DBG_MSG(CH3_CHANNEL, TYPICAL, "SRBuf allocation failure");
+ mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL,
+ FCNAME, __LINE__, MPI_ERR_OTHER, "**nomem",
+ "**nomem %d", MPIDI_CH3U_SRBuf_size);
+ req->status.MPI_ERROR = mpi_errno;
+ goto fn_fail;
+ }
+ /* --END ERROR HANDLING-- */
- req->dev.user_buf = req->dev.tmpbuf;
+ req->dev.user_buf = req->dev.tmpbuf;
- MPID_Datatype_get_size_macro(get_accum_pkt->datatype, type_size);
- total_len = type_size * get_accum_pkt->count;
- stream_elem_count = MPIDI_CH3U_SRBuf_size / extent;
+ MPID_Datatype_get_size_macro(get_accum_pkt->datatype, type_size);
+ total_len = type_size * get_accum_pkt->count;
+ stream_elem_count = MPIDI_CH3U_SRBuf_size / extent;
- req->dev.recv_data_sz = MPIR_MIN(total_len, stream_elem_count * type_size);
- MPIU_Assert(req->dev.recv_data_sz > 0);
+ req->dev.recv_data_sz = MPIR_MIN(total_len, stream_elem_count * type_size);
+ MPIU_Assert(req->dev.recv_data_sz > 0);
- mpi_errno = MPIDI_CH3U_Receive_data_found(req, data_buf, &data_len, &complete);
- MPIU_ERR_CHKANDJUMP1(mpi_errno, mpi_errno, MPI_ERR_OTHER, "**ch3|postrecv",
- "**ch3|postrecv %s", "MPIDI_CH3_PKT_ACCUMULATE");
+ mpi_errno = MPIDI_CH3U_Receive_data_found(req, data_buf, &data_len, &complete);
+ MPIU_ERR_CHKANDJUMP1(mpi_errno, mpi_errno, MPI_ERR_OTHER, "**ch3|postrecv",
+ "**ch3|postrecv %s", "MPIDI_CH3_PKT_ACCUMULATE");
- /* return the number of bytes processed in this function */
- *buflen = data_len + sizeof(MPIDI_CH3_Pkt_t);
+ /* return the number of bytes processed in this function */
+ *buflen = data_len + sizeof(MPIDI_CH3_Pkt_t);
+ }
if (complete) {
mpi_errno = MPIDI_CH3_ReqHandler_GaccumRecvComplete(vc, req, &complete);
@@ -1404,6 +1418,11 @@ int MPIDI_CH3_PktHandler_FOP(MPIDI_VC_t * vc, MPIDI_CH3_Pkt_t * pkt,
MPIDI_msg_sz_t data_len;
MPI_Aint extent;
int complete = 0;
+ int is_empty_origin = FALSE;
+
+ /* Judge if origin data is zero. */
+ if (fop_pkt->op == MPI_NO_OP)
+ is_empty_origin = TRUE;
req = MPID_Request_create();
MPIU_Object_set_ref(req, 1);
@@ -1420,26 +1439,34 @@ int MPIDI_CH3_PktHandler_FOP(MPIDI_VC_t * vc, MPIDI_CH3_Pkt_t * pkt,
req->dev.datatype = fop_pkt->datatype;
req->dev.user_count = 1;
- /* get start location of data and length of data */
- data_len = *buflen - sizeof(MPIDI_CH3_Pkt_t);
- data_buf = (char *) pkt + sizeof(MPIDI_CH3_Pkt_t);
-
- MPID_Datatype_get_extent_macro(fop_pkt->datatype, extent);
+ if (is_empty_origin == TRUE) {
+ req->dev.recv_data_sz = 0;
- req->dev.user_buf = MPIU_Malloc(extent);
- if (!req->dev.user_buf) {
- MPIU_ERR_SETANDJUMP1(mpi_errno, MPI_ERR_OTHER, "**nomem", "**nomem %d", extent);
+ *buflen = sizeof(MPIDI_CH3_Pkt_t);
+ complete = 1;
}
+ else {
+ /* get start location of data and length of data */
+ data_len = *buflen - sizeof(MPIDI_CH3_Pkt_t);
+ data_buf = (char *) pkt + sizeof(MPIDI_CH3_Pkt_t);
- req->dev.recv_data_sz = type_size;
- MPIU_Assert(req->dev.recv_data_sz > 0);
+ MPID_Datatype_get_extent_macro(fop_pkt->datatype, extent);
- mpi_errno = MPIDI_CH3U_Receive_data_found(req, data_buf, &data_len, &complete);
- MPIU_ERR_CHKANDJUMP1(mpi_errno, mpi_errno, MPI_ERR_OTHER, "**ch3|postrecv",
- "**ch3|postrecv %s", "MPIDI_CH3_PKT_ACCUMULATE");
+ req->dev.user_buf = MPIU_Malloc(extent);
+ if (!req->dev.user_buf) {
+ MPIU_ERR_SETANDJUMP1(mpi_errno, MPI_ERR_OTHER, "**nomem", "**nomem %d", extent);
+ }
- /* return the number of bytes processed in this function */
- *buflen = data_len + sizeof(MPIDI_CH3_Pkt_t);
+ req->dev.recv_data_sz = type_size;
+ MPIU_Assert(req->dev.recv_data_sz > 0);
+
+ mpi_errno = MPIDI_CH3U_Receive_data_found(req, data_buf, &data_len, &complete);
+ MPIU_ERR_CHKANDJUMP1(mpi_errno, mpi_errno, MPI_ERR_OTHER, "**ch3|postrecv",
+ "**ch3|postrecv %s", "MPIDI_CH3_PKT_ACCUMULATE");
+
+ /* return the number of bytes processed in this function */
+ *buflen = data_len + sizeof(MPIDI_CH3_Pkt_t);
+ }
if (complete) {
mpi_errno = MPIDI_CH3_ReqHandler_FOPRecvComplete(vc, req, &complete);
http://git.mpich.org/mpich.git/commitdiff/533b84c5adcab9fed07d3dab9abead048…
commit 533b84c5adcab9fed07d3dab9abead0484298e1f
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Thu May 28 13:15:04 2015 -0500
Delete code of converting GACC/FOP to GET when op is MPI_NO_OP.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index 3d5568e..f0de4d6 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -706,6 +706,13 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
}
else {
MPIDI_RMA_Op_t *op_ptr = NULL;
+ MPIDI_CH3_Pkt_get_accum_t *get_accum_pkt;
+ MPI_Aint origin_type_size;
+ int use_immed_pkt = FALSE, i;
+ int is_origin_contig, is_target_contig, is_result_contig;
+ MPI_Aint stream_elem_count, stream_unit_count;
+ MPI_Aint predefined_dtp_size, predefined_dtp_count, predefined_dtp_extent;
+ MPID_Datatype *origin_dtp = NULL, *target_dtp = NULL, *result_dtp = NULL;
/* Append the operation to the window's RMA ops queue */
mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &op_ptr);
@@ -716,186 +723,115 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPIR_T_PVAR_TIMER_START(RMA, rma_rmaqueue_set);
- if (op == MPI_NO_OP) {
- /* Convert GAcc to a Get */
- MPIDI_CH3_Pkt_get_t *get_pkt;
- int use_immed_resp_pkt = FALSE;
- int is_result_contig, is_target_contig;
-
- /******************** Setting operation struct areas ***********************/
-
- op_ptr->origin_addr = result_addr;
- op_ptr->origin_count = result_count;
- op_ptr->origin_datatype = result_datatype;
- op_ptr->target_rank = target_rank;
-
- /* Remember user request */
- op_ptr->ureq = ureq;
+ /******************** Setting operation struct areas ***********************/
- if (!MPIR_DATATYPE_IS_PREDEFINED(result_datatype)) {
- MPID_Datatype_get_ptr(result_datatype, dtp);
- MPID_Datatype_add_ref(dtp);
- }
- if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
- MPID_Datatype_get_ptr(target_datatype, dtp);
- MPID_Datatype_add_ref(dtp);
- }
+ op_ptr->origin_addr = (void *) origin_addr;
+ op_ptr->origin_count = origin_count;
+ op_ptr->origin_datatype = origin_datatype;
+ op_ptr->result_addr = result_addr;
+ op_ptr->result_count = result_count;
+ op_ptr->result_datatype = result_datatype;
+ op_ptr->target_rank = target_rank;
- MPID_Datatype_is_contig(result_datatype, &is_result_contig);
- MPID_Datatype_is_contig(target_datatype, &is_target_contig);
+ /* Remember user request */
+ op_ptr->ureq = ureq;
- /* Judge if we can use IMMED data response packet */
- if (MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
- MPIR_DATATYPE_IS_PREDEFINED(target_datatype) &&
- is_result_contig && is_target_contig) {
- if (target_data_sz <= MPIDI_RMA_IMMED_BYTES)
- use_immed_resp_pkt = TRUE;
- }
+ /* if source or target datatypes are derived, increment their
+ * reference counts */
+ if (!MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
+ MPID_Datatype_get_ptr(origin_datatype, origin_dtp);
+ }
+ if (!MPIR_DATATYPE_IS_PREDEFINED(result_datatype)) {
+ MPID_Datatype_get_ptr(result_datatype, result_dtp);
+ }
+ if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
+ MPID_Datatype_get_ptr(target_datatype, target_dtp);
+ }
- /* Judge if this operation is a piggyback candidate */
- if (MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
- MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
- /* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
- * for both origin and target data. We should extend this optimization to derived
- * datatypes as well. */
- op_ptr->piggyback_lock_candidate = 1;
- }
+ MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
+ MPIU_Assign_trunc(orig_data_sz, origin_count * origin_type_size, MPIDI_msg_sz_t);
- /************** Setting packet struct areas in operation ****************/
-
- get_pkt = &(op_ptr->pkt.get);
- MPIDI_Pkt_init(get_pkt, MPIDI_CH3_PKT_GET);
- get_pkt->addr = (char *) win_ptr->basic_info_table[target_rank].base_addr +
- win_ptr->basic_info_table[target_rank].disp_unit * target_disp;
- get_pkt->count = target_count;
- get_pkt->datatype = target_datatype;
- get_pkt->info.dataloop_size = 0;
- get_pkt->target_win_handle = win_ptr->basic_info_table[target_rank].win_handle;
- get_pkt->flags = MPIDI_CH3_PKT_FLAG_NONE;
- if (use_immed_resp_pkt == TRUE)
- get_pkt->flags |= MPIDI_CH3_PKT_FLAG_RMA_IMMED_RESP;
+ /* Get size and count for predefined datatype elements */
+ if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
+ predefined_dtp_size = origin_type_size;
+ predefined_dtp_count = origin_count;
+ MPID_Datatype_get_extent_macro(origin_datatype, predefined_dtp_extent);
}
-
else {
- MPIDI_CH3_Pkt_get_accum_t *get_accum_pkt;
- MPI_Aint origin_type_size;
- int use_immed_pkt = FALSE;
- int is_origin_contig, is_target_contig, is_result_contig;
- MPI_Aint stream_elem_count, stream_unit_count;
- MPI_Aint predefined_dtp_size, predefined_dtp_count, predefined_dtp_extent;
- MPID_Datatype *origin_dtp = NULL, *target_dtp = NULL, *result_dtp = NULL;
- int i;
-
- /******************** Setting operation struct areas ***********************/
-
- op_ptr->origin_addr = (void *) origin_addr;
- op_ptr->origin_count = origin_count;
- op_ptr->origin_datatype = origin_datatype;
- op_ptr->result_addr = result_addr;
- op_ptr->result_count = result_count;
- op_ptr->result_datatype = result_datatype;
- op_ptr->target_rank = target_rank;
-
- /* Remember user request */
- op_ptr->ureq = ureq;
-
- /* if source or target datatypes are derived, increment their
- * reference counts */
- if (!MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
- MPID_Datatype_get_ptr(origin_datatype, origin_dtp);
- }
- if (!MPIR_DATATYPE_IS_PREDEFINED(result_datatype)) {
- MPID_Datatype_get_ptr(result_datatype, result_dtp);
- }
- if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
- MPID_Datatype_get_ptr(target_datatype, target_dtp);
- }
+ MPIU_Assert(origin_dtp->basic_type != MPI_DATATYPE_NULL);
+ MPID_Datatype_get_size_macro(origin_dtp->basic_type, predefined_dtp_size);
+ predefined_dtp_count = orig_data_sz / predefined_dtp_size;
+ MPID_Datatype_get_extent_macro(origin_dtp->basic_type, predefined_dtp_extent);
+ }
+ MPIU_Assert(predefined_dtp_count > 0 && predefined_dtp_size > 0 &&
+ predefined_dtp_extent > 0);
- MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
- MPIU_Assign_trunc(orig_data_sz, origin_count * origin_type_size, MPIDI_msg_sz_t);
+ /* Calculate number of predefined elements in each stream unit, and
+ * total number of stream units. */
+ stream_elem_count = MPIDI_CH3U_Acc_stream_size / predefined_dtp_extent;
+ stream_unit_count = (predefined_dtp_count - 1) / stream_elem_count + 1;
+ MPIU_Assert(stream_elem_count > 0 && stream_unit_count > 0);
- /* Get size and count for predefined datatype elements */
- if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
- predefined_dtp_size = origin_type_size;
- predefined_dtp_count = origin_count;
- MPID_Datatype_get_extent_macro(origin_datatype, predefined_dtp_extent);
+ for (i = 0; i < stream_unit_count; i++) {
+ if (origin_dtp != NULL) {
+ MPID_Datatype_add_ref(origin_dtp);
}
- else {
- MPIU_Assert(origin_dtp->basic_type != MPI_DATATYPE_NULL);
- MPID_Datatype_get_size_macro(origin_dtp->basic_type, predefined_dtp_size);
- predefined_dtp_count = orig_data_sz / predefined_dtp_size;
- MPID_Datatype_get_extent_macro(origin_dtp->basic_type, predefined_dtp_extent);
+ if (target_dtp != NULL) {
+ MPID_Datatype_add_ref(target_dtp);
}
- MPIU_Assert(predefined_dtp_count > 0 && predefined_dtp_size > 0 &&
- predefined_dtp_extent > 0);
-
- /* Calculate number of predefined elements in each stream unit, and
- * total number of stream units. */
- stream_elem_count = MPIDI_CH3U_Acc_stream_size / predefined_dtp_extent;
- stream_unit_count = (predefined_dtp_count - 1) / stream_elem_count + 1;
- MPIU_Assert(stream_elem_count > 0 && stream_unit_count > 0);
-
- for (i = 0; i < stream_unit_count; i++) {
- if (origin_dtp != NULL) {
- MPID_Datatype_add_ref(origin_dtp);
- }
- if (target_dtp != NULL) {
- MPID_Datatype_add_ref(target_dtp);
- }
- if (result_dtp != NULL) {
- MPID_Datatype_add_ref(result_dtp);
- }
+ if (result_dtp != NULL) {
+ MPID_Datatype_add_ref(result_dtp);
}
+ }
- MPID_Datatype_is_contig(origin_datatype, &is_origin_contig);
- MPID_Datatype_is_contig(target_datatype, &is_target_contig);
- MPID_Datatype_is_contig(result_datatype, &is_result_contig);
+ MPID_Datatype_is_contig(origin_datatype, &is_origin_contig);
+ MPID_Datatype_is_contig(target_datatype, &is_target_contig);
+ MPID_Datatype_is_contig(result_datatype, &is_result_contig);
- /* Judge if we can use IMMED data packet */
- if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
- MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
- MPIR_DATATYPE_IS_PREDEFINED(target_datatype) &&
- is_origin_contig && is_target_contig && is_result_contig) {
- if (orig_data_sz <= MPIDI_RMA_IMMED_BYTES)
- use_immed_pkt = TRUE;
- }
+ /* Judge if we can use IMMED data packet */
+ if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype) &&
+ is_origin_contig && is_target_contig && is_result_contig) {
+ if (orig_data_sz <= MPIDI_RMA_IMMED_BYTES)
+ use_immed_pkt = TRUE;
+ }
- /* Judge if this operation is a piggyback candidate */
- if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
- MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
- MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
- /* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
- * for origin, target and result data. We should extend this optimization to derived
- * datatypes as well. */
- if (orig_data_sz <= MPIR_CVAR_CH3_RMA_OP_PIGGYBACK_LOCK_DATA_SIZE)
- op_ptr->piggyback_lock_candidate = 1;
- }
+ /* Judge if this operation is a piggyback candidate */
+ if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
+ /* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
+ * for origin, target and result data. We should extend this optimization to derived
+ * datatypes as well. */
+ if (orig_data_sz <= MPIR_CVAR_CH3_RMA_OP_PIGGYBACK_LOCK_DATA_SIZE)
+ op_ptr->piggyback_lock_candidate = 1;
+ }
- /************** Setting packet struct areas in operation ****************/
+ /************** Setting packet struct areas in operation ****************/
- get_accum_pkt = &(op_ptr->pkt.get_accum);
+ get_accum_pkt = &(op_ptr->pkt.get_accum);
- if (use_immed_pkt) {
- MPIDI_Pkt_init(get_accum_pkt, MPIDI_CH3_PKT_GET_ACCUM_IMMED);
- }
- else {
- MPIDI_Pkt_init(get_accum_pkt, MPIDI_CH3_PKT_GET_ACCUM);
- }
+ if (use_immed_pkt) {
+ MPIDI_Pkt_init(get_accum_pkt, MPIDI_CH3_PKT_GET_ACCUM_IMMED);
+ }
+ else {
+ MPIDI_Pkt_init(get_accum_pkt, MPIDI_CH3_PKT_GET_ACCUM);
+ }
- get_accum_pkt->addr = (char *) win_ptr->basic_info_table[target_rank].base_addr +
- win_ptr->basic_info_table[target_rank].disp_unit * target_disp;
- get_accum_pkt->count = target_count;
- get_accum_pkt->datatype = target_datatype;
- get_accum_pkt->info.dataloop_size = 0;
- get_accum_pkt->op = op;
- get_accum_pkt->target_win_handle = win_ptr->basic_info_table[target_rank].win_handle;
- get_accum_pkt->flags = MPIDI_CH3_PKT_FLAG_NONE;
- if (use_immed_pkt) {
- void *src = (void *) origin_addr, *dest = (void *) (get_accum_pkt->info.data);
- mpi_errno = immed_copy(src, dest, orig_data_sz);
- if (mpi_errno != MPI_SUCCESS)
- MPIU_ERR_POP(mpi_errno);
- }
+ get_accum_pkt->addr = (char *) win_ptr->basic_info_table[target_rank].base_addr +
+ win_ptr->basic_info_table[target_rank].disp_unit * target_disp;
+ get_accum_pkt->count = target_count;
+ get_accum_pkt->datatype = target_datatype;
+ get_accum_pkt->info.dataloop_size = 0;
+ get_accum_pkt->op = op;
+ get_accum_pkt->target_win_handle = win_ptr->basic_info_table[target_rank].win_handle;
+ get_accum_pkt->flags = MPIDI_CH3_PKT_FLAG_NONE;
+ if (use_immed_pkt) {
+ void *src = (void *) origin_addr, *dest = (void *) (get_accum_pkt->info.data);
+ mpi_errno = immed_copy(src, dest, orig_data_sz);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
}
MPIR_T_PVAR_TIMER_END(RMA, rma_rmaqueue_set);
@@ -1254,6 +1190,10 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
}
else {
MPIDI_RMA_Op_t *op_ptr = NULL;
+ MPIDI_CH3_Pkt_fop_t *fop_pkt;
+ MPI_Aint type_size;
+ int use_immed_pkt = FALSE;
+ int is_contig;
/* Append this operation to the RMA ops queue */
mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &op_ptr);
@@ -1262,96 +1202,49 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
MPIR_T_PVAR_TIMER_START(RMA, rma_rmaqueue_set);
- if (op == MPI_NO_OP) {
- /* Convert FOP to a Get */
- MPIDI_CH3_Pkt_get_t *get_pkt;
- MPI_Aint target_type_size;
- int use_immed_resp_pkt = FALSE;
- int is_contig;
-
- /******************** Setting operation struct areas ***********************/
+ /******************** Setting operation struct areas ***********************/
- op_ptr->origin_addr = result_addr;
- op_ptr->origin_count = 1;
- op_ptr->origin_datatype = datatype;
- op_ptr->target_rank = target_rank;
- op_ptr->piggyback_lock_candidate = 1;
+ op_ptr->origin_addr = (void *) origin_addr;
+ op_ptr->origin_count = 1;
+ op_ptr->origin_datatype = datatype;
+ op_ptr->result_addr = result_addr;
+ op_ptr->result_datatype = datatype;
+ op_ptr->target_rank = target_rank;
+ op_ptr->piggyback_lock_candidate = 1;
- /************** Setting packet struct areas in operation ****************/
+ /************** Setting packet struct areas in operation ****************/
- MPID_Datatype_get_size_macro(datatype, target_type_size);
- MPIU_Assert(target_type_size <= sizeof(MPIDI_CH3_FOP_Immed_u));
+ MPID_Datatype_get_size_macro(datatype, type_size);
+ MPIU_Assert(type_size <= sizeof(MPIDI_CH3_FOP_Immed_u));
- MPID_Datatype_is_contig(datatype, &is_contig);
+ MPID_Datatype_is_contig(datatype, &is_contig);
- if (is_contig) {
- /* Judege if we can use IMMED data for response packet */
- if (target_type_size <= MPIDI_RMA_IMMED_BYTES)
- use_immed_resp_pkt = TRUE;
+ if (is_contig) {
+ /* Judge if we can use IMMED data packet */
+ if (type_size <= MPIDI_RMA_IMMED_BYTES) {
+ use_immed_pkt = TRUE;
}
-
- get_pkt = &(op_ptr->pkt.get);
- MPIDI_Pkt_init(get_pkt, MPIDI_CH3_PKT_GET);
- get_pkt->addr = (char *) win_ptr->basic_info_table[target_rank].base_addr +
- win_ptr->basic_info_table[target_rank].disp_unit * target_disp;
- get_pkt->count = 1;
- get_pkt->datatype = datatype;
- get_pkt->info.dataloop_size = 0;
- get_pkt->target_win_handle = win_ptr->basic_info_table[target_rank].win_handle;
- get_pkt->flags = MPIDI_CH3_PKT_FLAG_NONE;
- if (use_immed_resp_pkt == TRUE)
- get_pkt->flags |= MPIDI_CH3_PKT_FLAG_RMA_IMMED_RESP;
}
- else {
- MPIDI_CH3_Pkt_fop_t *fop_pkt;
- MPI_Aint type_size;
- int use_immed_pkt = FALSE;
- int is_contig;
-
- /******************** Setting operation struct areas ***********************/
-
- op_ptr->origin_addr = (void *) origin_addr;
- op_ptr->origin_count = 1;
- op_ptr->origin_datatype = datatype;
- op_ptr->result_addr = result_addr;
- op_ptr->result_datatype = datatype;
- op_ptr->target_rank = target_rank;
- op_ptr->piggyback_lock_candidate = 1;
-
- /************** Setting packet struct areas in operation ****************/
- MPID_Datatype_get_size_macro(datatype, type_size);
- MPIU_Assert(type_size <= sizeof(MPIDI_CH3_FOP_Immed_u));
-
- MPID_Datatype_is_contig(datatype, &is_contig);
-
- if (is_contig) {
- /* Judge if we can use IMMED data packet */
- if (type_size <= MPIDI_RMA_IMMED_BYTES) {
- use_immed_pkt = TRUE;
- }
- }
+ fop_pkt = &(op_ptr->pkt.fop);
- fop_pkt = &(op_ptr->pkt.fop);
-
- if (use_immed_pkt) {
- MPIDI_Pkt_init(fop_pkt, MPIDI_CH3_PKT_FOP_IMMED);
- }
- else {
- MPIDI_Pkt_init(fop_pkt, MPIDI_CH3_PKT_FOP);
- }
- fop_pkt->addr = (char *) win_ptr->basic_info_table[target_rank].base_addr +
- win_ptr->basic_info_table[target_rank].disp_unit * target_disp;
- fop_pkt->datatype = datatype;
- fop_pkt->op = op;
- fop_pkt->target_win_handle = win_ptr->basic_info_table[target_rank].win_handle;
- fop_pkt->flags = MPIDI_CH3_PKT_FLAG_NONE;
- if (use_immed_pkt) {
- void *src = (void *) origin_addr, *dest = (void *) (fop_pkt->info.data);
- mpi_errno = immed_copy(src, dest, type_size);
- if (mpi_errno != MPI_SUCCESS)
- MPIU_ERR_POP(mpi_errno);
- }
+ if (use_immed_pkt) {
+ MPIDI_Pkt_init(fop_pkt, MPIDI_CH3_PKT_FOP_IMMED);
+ }
+ else {
+ MPIDI_Pkt_init(fop_pkt, MPIDI_CH3_PKT_FOP);
+ }
+ fop_pkt->addr = (char *) win_ptr->basic_info_table[target_rank].base_addr +
+ win_ptr->basic_info_table[target_rank].disp_unit * target_disp;
+ fop_pkt->datatype = datatype;
+ fop_pkt->op = op;
+ fop_pkt->target_win_handle = win_ptr->basic_info_table[target_rank].win_handle;
+ fop_pkt->flags = MPIDI_CH3_PKT_FLAG_NONE;
+ if (use_immed_pkt) {
+ void *src = (void *) origin_addr, *dest = (void *) (fop_pkt->info.data);
+ mpi_errno = immed_copy(src, dest, type_size);
+ if (mpi_errno != MPI_SUCCESS)
+ MPIU_ERR_POP(mpi_errno);
}
MPIR_T_PVAR_TIMER_END(RMA, rma_rmaqueue_set);
http://git.mpich.org/mpich.git/commitdiff/22c16664e41a0f12eb984822909b8c452…
commit 22c16664e41a0f12eb984822909b8c452d066f63
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Fri May 22 14:50:02 2015 -0500
Bug-fix: datatype in FOP should be predefined instead of builtin
Originally MPICH check datatype of FOP by judging if it is a
BUILTIN type, this prohibits all pair types. This patch fix this
issue.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpi/rma/fetch_and_op.c b/src/mpi/rma/fetch_and_op.c
index 92cede9..6001418 100644
--- a/src/mpi/rma/fetch_and_op.c
+++ b/src/mpi/rma/fetch_and_op.c
@@ -125,7 +125,7 @@ int MPI_Fetch_and_op(const void *origin_addr, void *result_addr,
MPIR_ERRTEST_ARGNULL(result_addr, "result_addr", mpi_errno);
MPIR_ERRTEST_DATATYPE(datatype, "datatype", mpi_errno);
- if (HANDLE_GET_KIND(datatype) != HANDLE_KIND_BUILTIN)
+ if (!MPIR_DATATYPE_IS_PREDEFINED(datatype))
{
MPIU_ERR_SETANDJUMP(mpi_errno, MPI_ERR_TYPE, "**typenotpredefined");
}
http://git.mpich.org/mpich.git/commitdiff/a59e611783f5fa0a6f3763d910ac0e1fe…
commit a59e611783f5fa0a6f3763d910ac0e1fe57f3350
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Thu May 28 13:35:20 2015 -0500
Add comments about MPI_NO_OP in GACC/FOP.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpi/rma/fetch_and_op.c b/src/mpi/rma/fetch_and_op.c
index 4ce6f8f..92cede9 100644
--- a/src/mpi/rma/fetch_and_op.c
+++ b/src/mpi/rma/fetch_and_op.c
@@ -117,6 +117,8 @@ int MPI_Fetch_and_op(const void *origin_addr, void *result_addr,
if (mpi_errno) goto fn_fail;
if (op != MPI_NO_OP) {
+ /* NOTE: when op is MPI_NO_OP, origin_addr is allowed to be NULL.
+ * In such case, MPI_Fetch_and_op equals to an atomic GET. */
MPIR_ERRTEST_ARGNULL(origin_addr, "origin_addr", mpi_errno);
}
diff --git a/src/mpi/rma/get_accumulate.c b/src/mpi/rma/get_accumulate.c
index 8f58b20..a9ed4fe 100644
--- a/src/mpi/rma/get_accumulate.c
+++ b/src/mpi/rma/get_accumulate.c
@@ -137,6 +137,10 @@ int MPI_Get_accumulate(const void *origin_addr, int origin_count,
if (mpi_errno) goto fn_fail;
if (op != MPI_NO_OP) {
+ /* NOTE: when op is MPI_NO_OP, origin_addr is allowed to be NULL,
+ * origin_datatype is allowed to be MPI_DATATYPE_NULL, and
+ * origin_count is allowed to be 0. In such case, MPI_Get_accumulate
+ * equals to an atomic GET. */
MPIR_ERRTEST_COUNT(origin_count, mpi_errno);
MPIR_ERRTEST_DATATYPE(origin_datatype, "origin_datatype", mpi_errno);
MPIR_ERRTEST_USERBUFFER(origin_addr, origin_count, origin_datatype, mpi_errno);
http://git.mpich.org/mpich.git/commitdiff/56ede5541807579d6d4c4577a7cf21a3c…
commit 56ede5541807579d6d4c4577a7cf21a3c12f1249
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Thu May 28 15:58:47 2015 -0500
Delete redundant branch for MPI_REPLACE.
Originally, when op is MPI_REPLACE, MPICH does the related
work in a separate IF branch different with other OPs
in MPIR_Op_table[], which is unnecessary, since MPI_REPLACE
has already been implemented in MPIR_Op_table[] (in the
same way with the code in that IF branch). Here we delete
the redundant IF branch but just trigger MPI_REPLACE from
MPIR_Op_table[].
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 42b8c42..db1e7ec 100644
--- a/src/mpid/ch3/include/mpidrma.h
+++ b/src/mpid/ch3/include/mpidrma.h
@@ -824,19 +824,17 @@ static inline int do_accumulate_op(void *source_buf, int source_count, MPI_Datat
MPID_Datatype_get_extent_macro(source_dtp, source_dtp_extent);
}
- if (acc_op != MPI_REPLACE) {
- if (HANDLE_GET_KIND(acc_op) == HANDLE_KIND_BUILTIN) {
- /* get the function by indexing into the op table */
- uop = MPIR_OP_HDL_TO_FN(acc_op);
- }
- else {
- /* --BEGIN ERROR HANDLING-- */
- mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
- FCNAME, __LINE__, MPI_ERR_OP,
- "**opnotpredefined", "**opnotpredefined %d", acc_op);
- return mpi_errno;
- /* --END ERROR HANDLING-- */
- }
+ if (HANDLE_GET_KIND(acc_op) == HANDLE_KIND_BUILTIN) {
+ /* get the function by indexing into the op table */
+ uop = MPIR_OP_HDL_TO_FN(acc_op);
+ }
+ else {
+ /* --BEGIN ERROR HANDLING-- */
+ mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
+ FCNAME, __LINE__, MPI_ERR_OP,
+ "**opnotpredefined", "**opnotpredefined %d", acc_op);
+ return mpi_errno;
+ /* --END ERROR HANDLING-- */
}
@@ -854,15 +852,7 @@ static inline int do_accumulate_op(void *source_buf, int source_count, MPI_Datat
curr_target_buf = target_buf;
}
- if (acc_op == MPI_REPLACE) {
- mpi_errno = MPIR_Localcopy(source_buf, source_count, source_dtp,
- curr_target_buf, source_count, source_dtp);
- if (mpi_errno != MPI_SUCCESS)
- MPIU_ERR_POP(mpi_errno);
- }
- else {
- (*uop) (source_buf, curr_target_buf, &source_count, &source_dtp);
- }
+ (*uop) (source_buf, curr_target_buf, &source_count, &source_dtp);
}
else {
/* derived datatype */
@@ -929,18 +919,8 @@ static inline int do_accumulate_op(void *source_buf, int source_count, MPI_Datat
MPIU_Assign_trunc(count, curr_len / type_size, int);
- if (acc_op == MPI_REPLACE) {
- mpi_errno = MPIR_Localcopy((char *) source_buf + type_extent * accumulated_count,
- count, type,
- (char *) target_buf + MPIU_PtrToAint(curr_loc),
- count, type);
- if (mpi_errno != MPI_SUCCESS)
- MPIU_ERR_POP(mpi_errno);
- }
- else {
- (*uop) ((char *) source_buf + type_extent * accumulated_count,
- (char *) target_buf + MPIU_PtrToAint(curr_loc), &count, &type);
- }
+ (*uop) ((char *) source_buf + type_extent * accumulated_count,
+ (char *) target_buf + MPIU_PtrToAint(curr_loc), &count, &type);
if (curr_len % type_size == 0) {
i++;
http://git.mpich.org/mpich.git/commitdiff/37cb95b14b693b634eb80fca442ff809a…
commit 37cb95b14b693b634eb80fca442ff809acab10ba
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Tue May 19 21:57:08 2015 -0500
Make do_accumulate_op() perform correctly when op is MPI_NO_OP.
Originally before do_accumulate_op() is called, there is a separate
IF branch to deal with MPI_NO_OP, which is gross. Here we modify
do_accumulate_op() to make sure it works correctly for MPI_NO_OP,
and delete those IF branches.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_shm.h b/src/mpid/ch3/include/mpid_rma_shm.h
index a34e64f..1ad0351 100644
--- a/src/mpid/ch3/include/mpid_rma_shm.h
+++ b/src/mpid/ch3/include/mpid_rma_shm.h
@@ -439,11 +439,16 @@ static inline int MPIDI_CH3I_Shm_get_acc_op(const void *origin_addr, int origin_
MPI_Aint total_len, rest_len;
MPI_Aint origin_dtp_size;
MPID_Datatype *origin_dtp_ptr = NULL;
+ int is_empty_origin = FALSE;
int mpi_errno = MPI_SUCCESS;
MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_GET_ACC_OP);
MPIDI_RMA_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_GET_ACC_OP);
+ /* Judge if origin buffer is empty */
+ if (op == MPI_NO_OP)
+ is_empty_origin = TRUE;
+
if (win_ptr->shm_allocated == TRUE) {
int local_target_rank = win_ptr->comm_ptr->intranode_table[target_rank];
MPIU_Assert(local_target_rank >= 0);
@@ -464,17 +469,7 @@ static inline int MPIDI_CH3I_Shm_get_acc_op(const void *origin_addr, int origin_
MPIU_ERR_POP(mpi_errno);
}
- /* NO_OP: Don't perform the accumulate */
- if (op == MPI_NO_OP) {
- if (shm_locked) {
- MPIDI_CH3I_SHM_MUTEX_UNLOCK(win_ptr);
- shm_locked = 0;
- }
-
- goto fn_exit;
- }
-
- if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
+ if (is_empty_origin == TRUE || MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
mpi_errno = do_accumulate_op((void*)origin_addr, origin_count, origin_datatype,
(void*)((char *)base+disp_unit*target_disp), target_count, target_datatype,
diff --git a/src/mpid/ch3/include/mpidrma.h b/src/mpid/ch3/include/mpidrma.h
index 0d80984..42b8c42 100644
--- a/src/mpid/ch3/include/mpidrma.h
+++ b/src/mpid/ch3/include/mpidrma.h
@@ -808,14 +808,21 @@ static inline int do_accumulate_op(void *source_buf, int source_count, MPI_Datat
{
int mpi_errno = MPI_SUCCESS;
MPI_User_function *uop = NULL;
- MPI_Aint source_dtp_size, source_dtp_extent;
+ MPI_Aint source_dtp_size = 0, source_dtp_extent = 0;
+ int is_empty_source = FALSE;
MPIDI_STATE_DECL(MPID_STATE_DO_ACCUMULATE_OP);
MPIDI_FUNC_ENTER(MPID_STATE_DO_ACCUMULATE_OP);
- MPIU_Assert(MPIR_DATATYPE_IS_PREDEFINED(source_dtp));
- MPID_Datatype_get_size_macro(source_dtp, source_dtp_size);
- MPID_Datatype_get_extent_macro(source_dtp, source_dtp_extent);
+ /* first Judge if source buffer is empty */
+ if (acc_op == MPI_NO_OP)
+ is_empty_source = TRUE;
+
+ if (is_empty_source == FALSE) {
+ MPIU_Assert(MPIR_DATATYPE_IS_PREDEFINED(source_dtp));
+ MPID_Datatype_get_size_macro(source_dtp, source_dtp_size);
+ MPID_Datatype_get_extent_macro(source_dtp, source_dtp_extent);
+ }
if (acc_op != MPI_REPLACE) {
if (HANDLE_GET_KIND(acc_op) == HANDLE_KIND_BUILTIN) {
@@ -833,13 +840,19 @@ static inline int do_accumulate_op(void *source_buf, int source_count, MPI_Datat
}
- if (MPIR_DATATYPE_IS_PREDEFINED(target_dtp)) {
- /* apply op if target dtp is predefined dtp */
-
- MPIU_Assert(source_dtp == target_dtp);
+ if (is_empty_source == TRUE || MPIR_DATATYPE_IS_PREDEFINED(target_dtp)) {
+ /* directly apply op if target dtp is predefined dtp OR source buffer is empty */
+ MPI_Aint real_stream_offset;
+ void *curr_target_buf;
- MPI_Aint real_stream_offset = (stream_offset / source_dtp_size) * source_dtp_extent;
- void *curr_target_buf = (void *) ((char *) target_buf + real_stream_offset);
+ if (is_empty_source == FALSE) {
+ MPIU_Assert(source_dtp == target_dtp);
+ real_stream_offset = (stream_offset / source_dtp_size) * source_dtp_extent;
+ curr_target_buf = (void *) ((char *) target_buf + real_stream_offset);
+ }
+ else {
+ curr_target_buf = target_buf;
+ }
if (acc_op == MPI_REPLACE) {
mpi_errno = MPIR_Localcopy(source_buf, source_count, source_dtp,
diff --git a/src/mpid/ch3/src/ch3u_handle_recv_req.c b/src/mpid/ch3/src/ch3u_handle_recv_req.c
index e7aebdb..b2c6e29 100644
--- a/src/mpid/ch3/src/ch3u_handle_recv_req.c
+++ b/src/mpid/ch3/src/ch3u_handle_recv_req.c
@@ -445,11 +445,8 @@ int MPIDI_CH3_ReqHandler_FOPRecvComplete(MPIDI_VC_t * vc, MPID_Request * rreq, i
}
/* Perform accumulate computation */
- if (rreq->dev.op != MPI_NO_OP) {
- mpi_errno = do_accumulate_op(rreq->dev.user_buf, 1, rreq->dev.datatype,
- rreq->dev.real_user_buf, 1, rreq->dev.datatype, 0,
- rreq->dev.op);
- }
+ mpi_errno = do_accumulate_op(rreq->dev.user_buf, 1, rreq->dev.datatype,
+ rreq->dev.real_user_buf, 1, rreq->dev.datatype, 0, rreq->dev.op);
if (win_ptr->shm_allocated == TRUE)
MPIDI_CH3I_SHM_MUTEX_UNLOCK(win_ptr);
@@ -1514,15 +1511,13 @@ static inline int perform_fop_in_lock_queue(MPID_Win * win_ptr, MPIDI_RMA_Lock_e
}
/* Apply the op */
- if (fop_pkt->op != MPI_NO_OP) {
- if (fop_pkt->type == MPIDI_CH3_PKT_FOP_IMMED) {
- mpi_errno = do_accumulate_op(fop_pkt->info.data, 1, fop_pkt->datatype,
- fop_pkt->addr, 1, fop_pkt->datatype, 0, fop_pkt->op);
- }
- else {
- mpi_errno = do_accumulate_op(lock_entry->data, 1, fop_pkt->datatype,
- fop_pkt->addr, 1, fop_pkt->datatype, 0, fop_pkt->op);
- }
+ if (fop_pkt->type == MPIDI_CH3_PKT_FOP_IMMED) {
+ mpi_errno = do_accumulate_op(fop_pkt->info.data, 1, fop_pkt->datatype,
+ fop_pkt->addr, 1, fop_pkt->datatype, 0, fop_pkt->op);
+ }
+ else {
+ mpi_errno = do_accumulate_op(lock_entry->data, 1, fop_pkt->datatype,
+ fop_pkt->addr, 1, fop_pkt->datatype, 0, fop_pkt->op);
}
if (win_ptr->shm_allocated == TRUE)
diff --git a/src/mpid/ch3/src/ch3u_rma_pkthandler.c b/src/mpid/ch3/src/ch3u_rma_pkthandler.c
index 54e953b..29b00ba 100644
--- a/src/mpid/ch3/src/ch3u_rma_pkthandler.c
+++ b/src/mpid/ch3/src/ch3u_rma_pkthandler.c
@@ -1356,10 +1356,8 @@ int MPIDI_CH3_PktHandler_FOP(MPIDI_VC_t * vc, MPIDI_CH3_Pkt_t * pkt,
}
/* Apply the op */
- if (fop_pkt->op != MPI_NO_OP) {
- mpi_errno = do_accumulate_op(fop_pkt->info.data, 1, fop_pkt->datatype,
- fop_pkt->addr, 1, fop_pkt->datatype, 0, fop_pkt->op);
- }
+ mpi_errno = do_accumulate_op(fop_pkt->info.data, 1, fop_pkt->datatype,
+ fop_pkt->addr, 1, fop_pkt->datatype, 0, fop_pkt->op);
if (win_ptr->shm_allocated == TRUE)
MPIDI_CH3I_SHM_MUTEX_UNLOCK(win_ptr);
http://git.mpich.org/mpich.git/commitdiff/092d6c8ec115ca7fcbdd55f3879cbdc2d…
commit 092d6c8ec115ca7fcbdd55f3879cbdc2dc8a969d
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Fri May 15 15:27:36 2015 -0500
Exit immed_copy() if src/dest address is NULL or data length is zero.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_issue.h b/src/mpid/ch3/include/mpid_rma_issue.h
index 6069ffc..6eb300e 100644
--- a/src/mpid/ch3/include/mpid_rma_issue.h
+++ b/src/mpid/ch3/include/mpid_rma_issue.h
@@ -27,6 +27,9 @@ static inline int immed_copy(void *src, void *dest, size_t len)
MPIDI_FUNC_ENTER(MPID_STATE_IMMED_COPY);
+ if (src == NULL || dest == NULL || len == 0)
+ goto fn_exit;
+
switch (len) {
case 1:
*(uint8_t *) dest = *(uint8_t *) src;
http://git.mpich.org/mpich.git/commitdiff/69c2207df8e81625f0df1685a2242da93…
commit 69c2207df8e81625f0df1685a2242da93e5380cd
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Wed May 27 10:03:09 2015 -0500
Delete redundant function call.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_oplist.h b/src/mpid/ch3/include/mpid_rma_oplist.h
index c32de97..dd91a12 100644
--- a/src/mpid/ch3/include/mpid_rma_oplist.h
+++ b/src/mpid/ch3/include/mpid_rma_oplist.h
@@ -501,27 +501,6 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_win(MPID_Win * win_ptr,
#undef FUNCNAME
-#define FUNCNAME MPIDI_CH3I_RMA_Cleanup_single_target
-#undef FCNAME
-#define FCNAME MPIDI_QUOTE(FUNCNAME)
-static inline int MPIDI_CH3I_RMA_Cleanup_single_target(MPID_Win * win_ptr,
- MPIDI_RMA_Target_t * target)
-{
- int mpi_errno = MPI_SUCCESS;
-
- /* dequeue the target and free it. */
- mpi_errno = MPIDI_CH3I_Win_target_dequeue_and_free(win_ptr, target);
- if (mpi_errno != MPI_SUCCESS)
- MPIU_ERR_POP(mpi_errno);
-
- fn_exit:
- return mpi_errno;
- fn_fail:
- goto fn_exit;
-}
-
-
-#undef FUNCNAME
#define FUNCNAME MPIDI_CH3I_RMA_Cleanup_targets_win
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
@@ -533,7 +512,7 @@ static inline int MPIDI_CH3I_RMA_Cleanup_targets_win(MPID_Win * win_ptr)
for (i = 0; i < win_ptr->num_slots; i++) {
for (target = win_ptr->slots[i].target_list_head; target;) {
next_target = target->next;
- mpi_errno = MPIDI_CH3I_RMA_Cleanup_single_target(win_ptr, target);
+ mpi_errno = MPIDI_CH3I_Win_target_dequeue_and_free(win_ptr, target);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
target = next_target;
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index 7a6829c..e106861 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -759,7 +759,7 @@ int MPIDI_CH3I_RMA_Cleanup_target_aggressive(MPID_Win * win_ptr, MPIDI_RMA_Targe
} while (!remote_completed);
/* Cleanup the target. */
- mpi_errno = MPIDI_CH3I_RMA_Cleanup_single_target(win_ptr, curr_target);
+ mpi_errno = MPIDI_CH3I_Win_target_dequeue_and_free(win_ptr, curr_target);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
diff --git a/src/mpid/ch3/src/ch3u_rma_sync.c b/src/mpid/ch3/src/ch3u_rma_sync.c
index 43efcea..731a94c 100644
--- a/src/mpid/ch3/src/ch3u_rma_sync.c
+++ b/src/mpid/ch3/src/ch3u_rma_sync.c
@@ -1132,7 +1132,7 @@ int MPIDI_Win_unlock(int dest, MPID_Win * win_ptr)
}
/* Cleanup the target. */
- mpi_errno = MPIDI_CH3I_RMA_Cleanup_single_target(win_ptr, target);
+ mpi_errno = MPIDI_CH3I_Win_target_dequeue_and_free(win_ptr, target);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
}
http://git.mpich.org/mpich.git/commitdiff/a7be0681b9ed8e4a49dec90f7de225744…
commit a7be0681b9ed8e4a49dec90f7de22574410027ed
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Fri May 22 11:36:12 2015 -0500
Code-refactoring: move completion judgement code out of GC function.
In this patch, we move the judgement of local/remote completion
out of GC function to separate macros, so that GC function only
does the garbage collection work.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_oplist.h b/src/mpid/ch3/include/mpid_rma_oplist.h
index ebec7f0..c32de97 100644
--- a/src/mpid/ch3/include/mpid_rma_oplist.h
+++ b/src/mpid/ch3/include/mpid_rma_oplist.h
@@ -22,6 +22,26 @@ extern MPIDI_RMA_Target_t *global_rma_target_pool, *global_rma_target_pool_tail,
MPIR_T_PVAR_DOUBLE_TIMER_DECL_EXTERN(RMA, rma_rmaqueue_alloc);
+#define MPIDI_CH3I_RMA_ops_completion(win_, target_, local_completed_, remote_completed_) \
+ do { \
+ local_completed_ = 0; \
+ remote_completed_ = 0; \
+ if (win_->states.access_state != MPIDI_RMA_FENCE_ISSUED && \
+ win_->states.access_state != MPIDI_RMA_PSCW_ISSUED && \
+ win_->states.access_state != MPIDI_RMA_LOCK_ALL_ISSUED && \
+ target_->access_state != MPIDI_RMA_LOCK_CALLED && \
+ target_->access_state != MPIDI_RMA_LOCK_ISSUED && \
+ target_->pending_op_list_head == NULL && \
+ target_->issued_read_op_list_head == NULL && \
+ target_->issued_write_op_list_head == NULL && \
+ target_->issued_dt_op_list_head == NULL) { \
+ local_completed_ = 1; \
+ if (target_->sync.sync_flag == MPIDI_RMA_SYNC_NONE && \
+ target_->sync.outstanding_acks == 0) \
+ remote_completed_ = 1; \
+ } \
+ } while (0)
+
/* MPIDI_CH3I_Win_op_alloc(): get a new op element from op pool and
* initialize it. If we cannot get one, return NULL. */
#undef FUNCNAME
@@ -329,8 +349,7 @@ static inline int MPIDI_CH3I_Win_target_dequeue_and_free(MPID_Win * win_ptr, MPI
#define FUNCNAME MPIDI_CH3I_RMA_Cleanup_ops_target
#undef FCNAME
#define FCNAME MPIDI_QUOTE(FUNCNAME)
-static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * target,
- int *local_completed, int *remote_completed)
+static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * target)
{
MPIDI_RMA_Op_t *curr_op = NULL;
MPIDI_RMA_Op_t **op_list_head = NULL, **op_list_tail = NULL;
@@ -338,9 +357,6 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
int mpi_errno = MPI_SUCCESS;
int i;
- (*local_completed) = 0;
- (*remote_completed) = 0;
-
if (win_ptr->states.access_state == MPIDI_RMA_FENCE_ISSUED ||
win_ptr->states.access_state == MPIDI_RMA_PSCW_ISSUED ||
win_ptr->states.access_state == MPIDI_RMA_LOCK_ALL_ISSUED)
@@ -356,7 +372,7 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
if (target->pending_op_list_head == NULL &&
target->issued_read_op_list_head == NULL && target->issued_write_op_list_head == NULL &&
target->issued_dt_op_list_head == NULL)
- goto cleanup_target;
+ goto fn_exit;
/* go over issued_read_op_list, issued_write_op_list,
* issued_dt_op_list, start from issued_read_op_list. */
@@ -433,21 +449,6 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
curr_op = *op_list_head;
}
- cleanup_target:
- if (target->pending_op_list_head == NULL &&
- target->issued_read_op_list_head == NULL && target->issued_write_op_list_head == NULL &&
- target->issued_dt_op_list_head == NULL) {
-
- (*local_completed) = 1;
-
- /* for the conditions that need to be satisfied before we free the
- * target, see the MPIDI_RMA_Target definition in
- * mpid_rma_types.h */
- if (target->sync.sync_flag == MPIDI_RMA_SYNC_NONE && target->sync.outstanding_acks == 0) {
- (*remote_completed) = 1;
- }
- }
-
fn_exit:
return mpi_errno;
fn_fail:
@@ -473,10 +474,12 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_win(MPID_Win * win_ptr,
for (target = win_ptr->slots[i].target_list_head; target;) {
int local = 0, remote = 0;
- mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, target, &local, &remote);
+ mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, target);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
+ MPIDI_CH3I_RMA_ops_completion(win_ptr, target, local, remote);
+
num_targets++;
local_completed_targets += local;
remote_completed_targets += remote;
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index 3a6e6e9..7a6829c 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -628,7 +628,7 @@ int MPIDI_CH3I_RMA_Free_ops_before_completion(MPID_Win * win_ptr)
#define FCNAME MPIDI_QUOTE(FUNCNAME)
int MPIDI_CH3I_RMA_Cleanup_ops_aggressive(MPID_Win * win_ptr)
{
- int i, local_completed = 0, remote_completed = 0;
+ int i, local_completed = 0, remote_completed ATTRIBUTE((unused)) = 0;
int mpi_errno = MPI_SUCCESS;
MPIDI_RMA_Target_t *curr_target = NULL;
int made_progress = 0;
@@ -663,10 +663,12 @@ int MPIDI_CH3I_RMA_Cleanup_ops_aggressive(MPID_Win * win_ptr)
/* Wait for local completion. */
do {
- mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, curr_target,
- &local_completed, &remote_completed);
+ mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, curr_target);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
+
+ MPIDI_CH3I_RMA_ops_completion(win_ptr, curr_target, local_completed, remote_completed);
+
if (!local_completed) {
mpi_errno = wait_progress_engine();
if (mpi_errno != MPI_SUCCESS)
@@ -687,7 +689,7 @@ int MPIDI_CH3I_RMA_Cleanup_ops_aggressive(MPID_Win * win_ptr)
#define FCNAME MPIDI_QUOTE(FUNCNAME)
int MPIDI_CH3I_RMA_Cleanup_target_aggressive(MPID_Win * win_ptr, MPIDI_RMA_Target_t ** target)
{
- int i, local_completed = 0, remote_completed = 0;
+ int i, local_completed ATTRIBUTE((unused)) = 0, remote_completed = 0;
int made_progress = 0;
MPIDI_RMA_Target_t *curr_target = NULL;
int mpi_errno = MPI_SUCCESS;
@@ -743,10 +745,12 @@ int MPIDI_CH3I_RMA_Cleanup_target_aggressive(MPID_Win * win_ptr, MPIDI_RMA_Targe
/* Wait for remote completion. */
do {
- mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, curr_target,
- &local_completed, &remote_completed);
+ mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, curr_target);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
+
+ MPIDI_CH3I_RMA_ops_completion(win_ptr, curr_target, local_completed, remote_completed);
+
if (!remote_completed) {
mpi_errno = wait_progress_engine();
if (mpi_errno != MPI_SUCCESS)
diff --git a/src/mpid/ch3/src/ch3u_rma_sync.c b/src/mpid/ch3/src/ch3u_rma_sync.c
index 76b8fd5..43efcea 100644
--- a/src/mpid/ch3/src/ch3u_rma_sync.c
+++ b/src/mpid/ch3/src/ch3u_rma_sync.c
@@ -1050,7 +1050,7 @@ int MPIDI_Win_lock(int lock_type, int dest, int assert, MPID_Win * win_ptr)
int MPIDI_Win_unlock(int dest, MPID_Win * win_ptr)
{
int made_progress = 0;
- int local_completed = 0, remote_completed = 0;
+ int local_completed ATTRIBUTE((unused)) = 0, remote_completed = 0;
MPIDI_RMA_Target_t *target = NULL;
enum MPIDI_RMA_sync_types sync_flag;
int progress_engine_triggered = 0;
@@ -1098,10 +1098,12 @@ int MPIDI_Win_unlock(int dest, MPID_Win * win_ptr)
/* Wait for remote completion. */
do {
- mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, target,
- &local_completed, &remote_completed);
+ mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, target);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
+
+ MPIDI_CH3I_RMA_ops_completion(win_ptr, target, local_completed, remote_completed);
+
if (!remote_completed) {
mpi_errno = wait_progress_engine();
if (mpi_errno != MPI_SUCCESS)
@@ -1165,7 +1167,7 @@ int MPIDI_Win_unlock(int dest, MPID_Win * win_ptr)
int MPIDI_Win_flush(int dest, MPID_Win * win_ptr)
{
int made_progress = 0;
- int local_completed = 0, remote_completed = 0;
+ int local_completed ATTRIBUTE((unused)) = 0, remote_completed = 0;
int rank = win_ptr->comm_ptr->rank;
MPIDI_RMA_Target_t *target = NULL;
int progress_engine_triggered = 0;
@@ -1218,10 +1220,12 @@ int MPIDI_Win_flush(int dest, MPID_Win * win_ptr)
/* Wait for remote completion. */
do {
- mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, target,
- &local_completed, &remote_completed);
+ mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, target);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
+
+ MPIDI_CH3I_RMA_ops_completion(win_ptr, target, local_completed, remote_completed);
+
if (!remote_completed) {
mpi_errno = wait_progress_engine();
if (mpi_errno != MPI_SUCCESS)
@@ -1329,10 +1333,12 @@ int MPIDI_Win_flush_local(int dest, MPID_Win * win_ptr)
/* Wait for local completion. */
do {
- mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, target,
- &local_completed, &remote_completed);
+ mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, target);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
+
+ MPIDI_CH3I_RMA_ops_completion(win_ptr, target, local_completed, remote_completed);
+
if ((target->sync.upgrade_flush_local && !remote_completed) ||
(!target->sync.upgrade_flush_local && !local_completed)) {
mpi_errno = wait_progress_engine();
@@ -1790,11 +1796,13 @@ int MPIDI_Win_flush_local_all(MPID_Win * win_ptr)
for (i = 0; i < win_ptr->num_slots; i++) {
curr_target = win_ptr->slots[i].target_list_head;
while (curr_target != NULL) {
- mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, curr_target,
- &local_completed, &remote_completed);
+ mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, curr_target);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
+ MPIDI_CH3I_RMA_ops_completion(win_ptr, curr_target, local_completed,
+ remote_completed);
+
if (curr_target->sync.upgrade_flush_local) {
if (remote_completed) {
remote_completed_cnt++;
http://git.mpich.org/mpich.git/commitdiff/77c07868c0414781bae758ba8a7693287…
commit 77c07868c0414781bae758ba8a7693287a1a24eb
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Wed May 20 15:45:23 2015 -0500
Add namespace for num_active_issued_win and num_passive_win.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/channels/nemesis/include/mpid_nem_inline.h b/src/mpid/ch3/channels/nemesis/include/mpid_nem_inline.h
index 22baa82..15188ca 100644
--- a/src/mpid/ch3/channels/nemesis/include/mpid_nem_inline.h
+++ b/src/mpid/ch3/channels/nemesis/include/mpid_nem_inline.h
@@ -40,7 +40,8 @@ static inline void MPID_nem_mpich_send_seg (MPID_Segment *segment, MPIDI_msg_sz_
!MPIDI_CH3I_shm_active_send && \
!MPIDI_CH3I_Sendq_head(MPIDI_CH3I_shm_sendq) && \
!MPIDU_Sched_are_pending() && \
- !num_active_issued_win && !num_passive_win)
+ !MPIDI_CH3I_num_active_issued_win && \
+ !MPIDI_CH3I_num_passive_win)
#undef FUNCNAME
#define FUNCNAME MPID_nem_mpich_send_header
diff --git a/src/mpid/ch3/channels/nemesis/include/mpidi_ch3_pre.h b/src/mpid/ch3/channels/nemesis/include/mpidi_ch3_pre.h
index 8ab69cb..6a01926 100644
--- a/src/mpid/ch3/channels/nemesis/include/mpidi_ch3_pre.h
+++ b/src/mpid/ch3/channels/nemesis/include/mpidi_ch3_pre.h
@@ -228,7 +228,7 @@ MPIDI_CH3I_Progress_state;
#define MPIDI_CH3_PROGRESS_STATE_DECL MPIDI_CH3I_Progress_state ch;
extern OPA_int_t MPIDI_CH3I_progress_completion_count;
-extern int num_active_issued_win, num_passive_win;
+extern int MPIDI_CH3I_num_active_issued_win, MPIDI_CH3I_num_passive_win;
#define MPIDI_CH3I_INCR_PROGRESS_COMPLETION_COUNT do { \
OPA_write_barrier(); \
diff --git a/src/mpid/ch3/channels/nemesis/src/ch3_progress.c b/src/mpid/ch3/channels/nemesis/src/ch3_progress.c
index 6e699b7..e05fe3b 100644
--- a/src/mpid/ch3/channels/nemesis/src/ch3_progress.c
+++ b/src/mpid/ch3/channels/nemesis/src/ch3_progress.c
@@ -46,7 +46,7 @@ extern MPID_Request ** const MPID_Recvq_unexpected_tail_ptr;
#endif
OPA_int_t MPIDI_CH3I_progress_completion_count = OPA_INT_T_INITIALIZER(0);
-int num_active_issued_win = 0, num_passive_win = 0;
+int MPIDI_CH3I_num_active_issued_win = 0, MPIDI_CH3I_num_passive_win = 0;
/* NEMESIS MULTITHREADING: Extra Data Structures Added */
#ifdef MPICH_IS_THREADED
@@ -478,7 +478,7 @@ int MPIDI_CH3I_Progress (MPID_Progress_state *progress_state, int is_blocking)
#endif /* HAVE_LIBHCOLL */
/* make progress on RMA */
- if (num_active_issued_win > 0 || num_passive_win > 0) {
+ if (MPIDI_CH3I_num_active_issued_win > 0 || MPIDI_CH3I_num_passive_win > 0) {
mpi_errno = MPIDI_CH3I_RMA_Make_progress_global(&made_progress);
if (mpi_errno)
MPIU_ERR_POP(mpi_errno);
diff --git a/src/mpid/ch3/channels/sock/include/mpidi_ch3_pre.h b/src/mpid/ch3/channels/sock/include/mpidi_ch3_pre.h
index 6e965d0..fc1115c 100644
--- a/src/mpid/ch3/channels/sock/include/mpidi_ch3_pre.h
+++ b/src/mpid/ch3/channels/sock/include/mpidi_ch3_pre.h
@@ -78,7 +78,7 @@ MPIDI_CH3I_Progress_state;
and must be available to the routines in src/mpi */
extern volatile unsigned int MPIDI_CH3I_progress_completion_count;
-extern int num_active_issued_win, num_passive_win;
+extern int MPIDI_CH3I_num_active_issued_win, MPIDI_CH3I_num_passive_win;
/* MPICH_IS_THREADED isn't defined yet (handled by mpiimplthread.h) */
#if (MPICH_THREAD_LEVEL == MPI_THREAD_MULTIPLE)
diff --git a/src/mpid/ch3/channels/sock/src/ch3_progress.c b/src/mpid/ch3/channels/sock/src/ch3_progress.c
index 6c649db..8715193 100644
--- a/src/mpid/ch3/channels/sock/src/ch3_progress.c
+++ b/src/mpid/ch3/channels/sock/src/ch3_progress.c
@@ -22,7 +22,7 @@ static int MPIDI_CH3i_Progress_test(void);
/* FIXME: Move thread stuff into some set of abstractions in order to remove
ifdefs */
volatile unsigned int MPIDI_CH3I_progress_completion_count = 0;
-int num_active_issued_win = 0, num_passive_win = 0;
+int MPIDI_CH3I_num_active_issued_win = 0, MPIDI_CH3I_num_passive_win = 0;
#ifdef MPICH_IS_THREADED
volatile int MPIDI_CH3I_progress_blocked = FALSE;
@@ -98,7 +98,7 @@ static int MPIDI_CH3i_Progress_test(void)
#endif /* HAVE_LIBHCOLL */
/* make progress on RMA */
- if (num_active_issued_win > 0 || num_passive_win > 0) {
+ if (MPIDI_CH3I_num_active_issued_win > 0 || MPIDI_CH3I_num_passive_win > 0) {
mpi_errno = MPIDI_CH3I_RMA_Make_progress_global(&made_progress);
if (mpi_errno)
MPIU_ERR_POP(mpi_errno);
@@ -213,7 +213,7 @@ static int MPIDI_CH3i_Progress_wait(MPID_Progress_state * progress_state)
#endif /* HAVE_LIBHCOLL */
/* make progress on RMA */
- if (num_active_issued_win > 0 || num_passive_win > 0) {
+ if (MPIDI_CH3I_num_active_issued_win > 0 || MPIDI_CH3I_num_passive_win > 0) {
mpi_errno = MPIDI_CH3I_RMA_Make_progress_global(&made_progress);
if (mpi_errno)
MPIU_ERR_POP(mpi_errno);
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index dd12b96..3a6e6e9 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -62,8 +62,8 @@ static inline int check_window_state(MPID_Win * win_ptr, int *made_progress)
MPID_Request_release(fence_req_ptr);
win_ptr->fence_sync_req = MPI_REQUEST_NULL;
- num_active_issued_win--;
- MPIU_Assert(num_active_issued_win >= 0);
+ MPIDI_CH3I_num_active_issued_win--;
+ MPIU_Assert(MPIDI_CH3I_num_active_issued_win >= 0);
(*made_progress) = 1;
}
@@ -75,8 +75,8 @@ static inline int check_window_state(MPID_Win * win_ptr, int *made_progress)
* we do not create PSCW requests on window. */
win_ptr->states.access_state = MPIDI_RMA_PSCW_GRANTED;
- num_active_issued_win--;
- MPIU_Assert(num_active_issued_win >= 0);
+ MPIDI_CH3I_num_active_issued_win--;
+ MPIU_Assert(MPIDI_CH3I_num_active_issued_win >= 0);
(*made_progress) = 1;
}
@@ -98,8 +98,8 @@ static inline int check_window_state(MPID_Win * win_ptr, int *made_progress)
if (i == win_ptr->start_grp_size) {
win_ptr->states.access_state = MPIDI_RMA_PSCW_GRANTED;
- num_active_issued_win--;
- MPIU_Assert(num_active_issued_win >= 0);
+ MPIDI_CH3I_num_active_issued_win--;
+ MPIU_Assert(MPIDI_CH3I_num_active_issued_win >= 0);
(*made_progress) = 1;
diff --git a/src/mpid/ch3/src/ch3u_rma_sync.c b/src/mpid/ch3/src/ch3u_rma_sync.c
index c73c356..76b8fd5 100644
--- a/src/mpid/ch3/src/ch3u_rma_sync.c
+++ b/src/mpid/ch3/src/ch3u_rma_sync.c
@@ -348,7 +348,7 @@ int MPIDI_Win_fence(int assert, MPID_Win * win_ptr)
/* Set window access state properly. */
win_ptr->states.access_state = MPIDI_RMA_FENCE_ISSUED;
- num_active_issued_win++;
+ MPIDI_CH3I_num_active_issued_win++;
goto finish_fence;
}
@@ -671,7 +671,7 @@ int MPIDI_Win_start(MPID_Group * group_ptr, int assert, MPID_Win * win_ptr)
finish_start:
/* Set window access state properly. */
win_ptr->states.access_state = MPIDI_RMA_PSCW_ISSUED;
- num_active_issued_win++;
+ MPIDI_CH3I_num_active_issued_win++;
/* BEGINNING synchronization: the following counter should be zero. */
MPIU_Assert(win_ptr->accumulated_ops_cnt == 0);
@@ -981,7 +981,7 @@ int MPIDI_Win_lock(int lock_type, int dest, int assert, MPID_Win * win_ptr)
if (win_ptr->lock_epoch_count == 0) {
/* Set window access state properly. */
win_ptr->states.access_state = MPIDI_RMA_PER_TARGET;
- num_passive_win++;
+ MPIDI_CH3I_num_passive_win++;
}
win_ptr->lock_epoch_count++;
@@ -1118,8 +1118,8 @@ int MPIDI_Win_unlock(int dest, MPID_Win * win_ptr)
if (win_ptr->lock_epoch_count == 0) {
/* Set window access state properly. */
win_ptr->states.access_state = MPIDI_RMA_NONE;
- num_passive_win--;
- MPIU_Assert(num_passive_win >= 0);
+ MPIDI_CH3I_num_passive_win--;
+ MPIU_Assert(MPIDI_CH3I_num_passive_win >= 0);
}
if (target != NULL) {
@@ -1406,7 +1406,7 @@ int MPIDI_Win_lock_all(int assert, MPID_Win * win_ptr)
win_ptr->states.access_state = MPIDI_RMA_LOCK_ALL_GRANTED;
else
win_ptr->states.access_state = MPIDI_RMA_LOCK_ALL_CALLED;
- num_passive_win++;
+ MPIDI_CH3I_num_passive_win++;
win_ptr->lock_all_assert = assert;
@@ -1597,8 +1597,8 @@ int MPIDI_Win_unlock_all(MPID_Win * win_ptr)
finish_unlock_all:
/* Set window access state properly. */
win_ptr->states.access_state = MPIDI_RMA_NONE;
- num_passive_win--;
- MPIU_Assert(num_passive_win >= 0);
+ MPIDI_CH3I_num_passive_win--;
+ MPIU_Assert(MPIDI_CH3I_num_passive_win >= 0);
/* reset lock_all assert on window. */
win_ptr->lock_all_assert = 0;
http://git.mpich.org/mpich.git/commitdiff/9fb9c2d36a51c55208036c3c4105dde8a…
commit 9fb9c2d36a51c55208036c3c4105dde8a004c84e
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Wed May 20 14:23:42 2015 -0500
Fix typo error on variable names.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index 2bdc5a5..3d5568e 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -805,10 +805,10 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPID_Datatype_get_ptr(origin_datatype, origin_dtp);
}
if (!MPIR_DATATYPE_IS_PREDEFINED(result_datatype)) {
- MPID_Datatype_get_ptr(result_datatype, target_dtp);
+ MPID_Datatype_get_ptr(result_datatype, result_dtp);
}
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
- MPID_Datatype_get_ptr(target_datatype, result_dtp);
+ MPID_Datatype_get_ptr(target_datatype, target_dtp);
}
MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
http://git.mpich.org/mpich.git/commitdiff/0185437d948d81167a7aaf1e9dd02c4de…
commit 0185437d948d81167a7aaf1e9dd02c4de7b891c8
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Tue May 19 21:08:56 2015 -0500
Change variable name of origin data_sz and target data_sz.
Originally in GACC/GET, we use 'data_sz' for origin data size
and 'len/orig_len' for target data size. Here we change them
to 'orig_data_sz' for origin data size and 'target_data_sz'
for target data size to make it clearer.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index ddcc4a6..2bdc5a5 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -247,7 +247,7 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
MPID_Request * ureq)
{
int mpi_errno = MPI_SUCCESS;
- MPIDI_msg_sz_t data_sz;
+ MPIDI_msg_sz_t orig_data_sz, target_data_sz;
int dt_contig ATTRIBUTE((unused)), rank;
MPI_Aint dt_true_lb ATTRIBUTE((unused));
MPID_Datatype *dtp;
@@ -264,9 +264,10 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
goto fn_exit;
}
- MPIDI_Datatype_get_info(origin_count, origin_datatype, dt_contig, data_sz, dtp, dt_true_lb);
+ MPIDI_Datatype_get_info(origin_count, origin_datatype, dt_contig, orig_data_sz, dtp,
+ dt_true_lb);
- if (data_sz == 0) {
+ if (orig_data_sz == 0) {
goto fn_exit;
}
@@ -304,7 +305,6 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
MPIDI_RMA_Op_t *op_ptr = NULL;
MPIDI_CH3_Pkt_get_t *get_pkt = NULL;
MPI_Aint target_type_size;
- size_t len;
int use_immed_resp_pkt = FALSE;
int is_origin_contig, is_target_contig;
@@ -341,12 +341,12 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
MPID_Datatype_is_contig(target_datatype, &is_target_contig);
MPID_Datatype_get_size_macro(target_datatype, target_type_size);
- MPIU_Assign_trunc(len, target_count * target_type_size, size_t);
+ MPIU_Assign_trunc(target_data_sz, target_count * target_type_size, MPIDI_msg_sz_t);
/* Judge if we can use IMMED data response packet */
if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
MPIR_DATATYPE_IS_PREDEFINED(target_datatype) && is_origin_contig && is_target_contig) {
- if (len <= MPIDI_RMA_IMMED_BYTES)
+ if (target_data_sz <= MPIDI_RMA_IMMED_BYTES)
use_immed_resp_pkt = TRUE;
}
@@ -647,7 +647,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPID_Win * win_ptr, MPID_Request * ureq)
{
int mpi_errno = MPI_SUCCESS;
- MPIDI_msg_sz_t data_sz;
+ MPIDI_msg_sz_t orig_data_sz, target_data_sz;
int rank;
int dt_contig ATTRIBUTE((unused));
MPI_Aint dt_true_lb ATTRIBUTE((unused));
@@ -665,9 +665,10 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
goto fn_exit;
}
- MPIDI_Datatype_get_info(target_count, target_datatype, dt_contig, data_sz, dtp, dt_true_lb);
+ MPIDI_Datatype_get_info(target_count, target_datatype, dt_contig, target_data_sz, dtp,
+ dt_true_lb);
- if (data_sz == 0) {
+ if (target_data_sz == 0) {
goto fn_exit;
}
@@ -747,7 +748,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
if (MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
MPIR_DATATYPE_IS_PREDEFINED(target_datatype) &&
is_result_contig && is_target_contig) {
- if (data_sz <= MPIDI_RMA_IMMED_BYTES)
+ if (target_data_sz <= MPIDI_RMA_IMMED_BYTES)
use_immed_resp_pkt = TRUE;
}
@@ -778,7 +779,6 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
else {
MPIDI_CH3_Pkt_get_accum_t *get_accum_pkt;
MPI_Aint origin_type_size;
- size_t orig_len;
int use_immed_pkt = FALSE;
int is_origin_contig, is_target_contig, is_result_contig;
MPI_Aint stream_elem_count, stream_unit_count;
@@ -812,7 +812,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
}
MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
- MPIU_Assign_trunc(orig_len, origin_count * origin_type_size, size_t);
+ MPIU_Assign_trunc(orig_data_sz, origin_count * origin_type_size, MPIDI_msg_sz_t);
/* Get size and count for predefined datatype elements */
if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
@@ -823,7 +823,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
else {
MPIU_Assert(origin_dtp->basic_type != MPI_DATATYPE_NULL);
MPID_Datatype_get_size_macro(origin_dtp->basic_type, predefined_dtp_size);
- predefined_dtp_count = orig_len / predefined_dtp_size;
+ predefined_dtp_count = orig_data_sz / predefined_dtp_size;
MPID_Datatype_get_extent_macro(origin_dtp->basic_type, predefined_dtp_extent);
}
MPIU_Assert(predefined_dtp_count > 0 && predefined_dtp_size > 0 &&
@@ -856,7 +856,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
MPIR_DATATYPE_IS_PREDEFINED(target_datatype) &&
is_origin_contig && is_target_contig && is_result_contig) {
- if (orig_len <= MPIDI_RMA_IMMED_BYTES)
+ if (orig_data_sz <= MPIDI_RMA_IMMED_BYTES)
use_immed_pkt = TRUE;
}
@@ -867,7 +867,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for origin, target and result data. We should extend this optimization to derived
* datatypes as well. */
- if (orig_len <= MPIR_CVAR_CH3_RMA_OP_PIGGYBACK_LOCK_DATA_SIZE)
+ if (orig_data_sz <= MPIR_CVAR_CH3_RMA_OP_PIGGYBACK_LOCK_DATA_SIZE)
op_ptr->piggyback_lock_candidate = 1;
}
@@ -892,7 +892,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
get_accum_pkt->flags = MPIDI_CH3_PKT_FLAG_NONE;
if (use_immed_pkt) {
void *src = (void *) origin_addr, *dest = (void *) (get_accum_pkt->info.data);
- mpi_errno = immed_copy(src, dest, orig_len);
+ mpi_errno = immed_copy(src, dest, orig_data_sz);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
}
http://git.mpich.org/mpich.git/commitdiff/5b1b3bbf6ef9b7c8d54e9fea202357e23…
commit 5b1b3bbf6ef9b7c8d54e9fea202357e23d7cf243
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Tue May 19 21:06:37 2015 -0500
Delete redundant variable "len".
Since both "data_sz" and "len" store the same data (the length
of the entire origin data), here we delete "len" but just use
"data_sz".
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index a8fd127..ddcc4a6 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -117,8 +117,6 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
else {
MPIDI_RMA_Op_t *op_ptr = NULL;
MPIDI_CH3_Pkt_put_t *put_pkt = NULL;
- MPI_Aint origin_type_size;
- size_t len;
int use_immed_pkt = FALSE;
int is_origin_contig, is_target_contig;
@@ -154,13 +152,10 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
MPID_Datatype_is_contig(origin_datatype, &is_origin_contig);
MPID_Datatype_is_contig(target_datatype, &is_target_contig);
- MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
- MPIU_Assign_trunc(len, origin_count * origin_type_size, size_t);
-
/* Judge if we can use IMMED data packet */
if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
MPIR_DATATYPE_IS_PREDEFINED(target_datatype) && is_origin_contig && is_target_contig) {
- if (len <= MPIDI_RMA_IMMED_BYTES)
+ if (data_sz <= MPIDI_RMA_IMMED_BYTES)
use_immed_pkt = TRUE;
}
@@ -170,7 +165,7 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for both origin and target data. We should extend this optimization to derived
* datatypes as well. */
- if (len <= MPIR_CVAR_CH3_RMA_OP_PIGGYBACK_LOCK_DATA_SIZE)
+ if (data_sz <= MPIR_CVAR_CH3_RMA_OP_PIGGYBACK_LOCK_DATA_SIZE)
op_ptr->piggyback_lock_candidate = 1;
}
@@ -195,7 +190,7 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
put_pkt->flags = MPIDI_CH3_PKT_FLAG_NONE;
if (use_immed_pkt) {
void *src = (void *) origin_addr, *dest = (void *) (put_pkt->info.data);
- mpi_errno = immed_copy(src, dest, len);
+ mpi_errno = immed_copy(src, dest, data_sz);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
}
@@ -488,8 +483,6 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
else {
MPIDI_RMA_Op_t *op_ptr = NULL;
MPIDI_CH3_Pkt_accum_t *accum_pkt = NULL;
- MPI_Aint origin_type_size;
- size_t len;
int use_immed_pkt = FALSE;
int is_origin_contig, is_target_contig;
MPI_Aint stream_elem_count, stream_unit_count;
@@ -523,19 +516,16 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
MPID_Datatype_get_ptr(target_datatype, target_dtp);
}
- MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
- MPIU_Assign_trunc(len, origin_count * origin_type_size, size_t);
-
/* Get size and count for predefined datatype elements */
if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
- predefined_dtp_size = origin_type_size;
+ MPID_Datatype_get_size_macro(origin_datatype, predefined_dtp_size);
predefined_dtp_count = origin_count;
MPID_Datatype_get_extent_macro(origin_datatype, predefined_dtp_extent);
}
else {
MPIU_Assert(origin_dtp->basic_type != MPI_DATATYPE_NULL);
MPID_Datatype_get_size_macro(origin_dtp->basic_type, predefined_dtp_size);
- predefined_dtp_count = len / predefined_dtp_size;
+ predefined_dtp_count = data_sz / predefined_dtp_size;
MPID_Datatype_get_extent_macro(origin_dtp->basic_type, predefined_dtp_extent);
}
MPIU_Assert(predefined_dtp_count > 0 && predefined_dtp_size > 0 &&
@@ -562,7 +552,7 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
/* Judge if we can use IMMED data packet */
if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
MPIR_DATATYPE_IS_PREDEFINED(target_datatype) && is_origin_contig && is_target_contig) {
- if (len <= MPIDI_RMA_IMMED_BYTES)
+ if (data_sz <= MPIDI_RMA_IMMED_BYTES)
use_immed_pkt = TRUE;
}
@@ -572,7 +562,7 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for both origin and target data. We should extend this optimization to derived
* datatypes as well. */
- if (len <= MPIR_CVAR_CH3_RMA_OP_PIGGYBACK_LOCK_DATA_SIZE)
+ if (data_sz <= MPIR_CVAR_CH3_RMA_OP_PIGGYBACK_LOCK_DATA_SIZE)
op_ptr->piggyback_lock_candidate = 1;
}
@@ -598,7 +588,7 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
accum_pkt->flags = MPIDI_CH3_PKT_FLAG_NONE;
if (use_immed_pkt) {
void *src = (void *) origin_addr, *dest = (void *) (accum_pkt->info.data);
- mpi_errno = immed_copy(src, dest, len);
+ mpi_errno = immed_copy(src, dest, data_sz);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
}
@@ -728,8 +718,6 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
if (op == MPI_NO_OP) {
/* Convert GAcc to a Get */
MPIDI_CH3_Pkt_get_t *get_pkt;
- MPI_Aint target_type_size;
- size_t len;
int use_immed_resp_pkt = FALSE;
int is_result_contig, is_target_contig;
@@ -752,9 +740,6 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPID_Datatype_add_ref(dtp);
}
- MPID_Datatype_get_size_macro(target_datatype, target_type_size);
- MPIU_Assign_trunc(len, target_count * target_type_size, size_t);
-
MPID_Datatype_is_contig(result_datatype, &is_result_contig);
MPID_Datatype_is_contig(target_datatype, &is_target_contig);
@@ -762,7 +747,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
if (MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
MPIR_DATATYPE_IS_PREDEFINED(target_datatype) &&
is_result_contig && is_target_contig) {
- if (len <= MPIDI_RMA_IMMED_BYTES)
+ if (data_sz <= MPIDI_RMA_IMMED_BYTES)
use_immed_resp_pkt = TRUE;
}
http://git.mpich.org/mpich.git/commitdiff/408c4abf80cad55721d94917971fd85a8…
commit 408c4abf80cad55721d94917971fd85a860dbc5a
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Thu May 14 17:16:14 2015 -0500
Simplify code of garbage collection functions.
The original code of going over all issued operation lists
and cleaning up operations is gross, this patches simplifies
the related code.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_oplist.h b/src/mpid/ch3/include/mpid_rma_oplist.h
index bc7315e..ebec7f0 100644
--- a/src/mpid/ch3/include/mpid_rma_oplist.h
+++ b/src/mpid/ch3/include/mpid_rma_oplist.h
@@ -358,96 +358,79 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
target->issued_dt_op_list_head == NULL)
goto cleanup_target;
- if (target->issued_read_op_list_head != NULL) {
- op_list_head = &(target->issued_read_op_list_head);
- op_list_tail = &(target->issued_read_op_list_tail);
- read_flag = 1;
- }
- else if (target->issued_write_op_list_head != NULL) {
- op_list_head = &(target->issued_write_op_list_head);
- op_list_tail = &(target->issued_write_op_list_tail);
- write_flag = 1;
- }
- else if (target->issued_dt_op_list_head != NULL) {
- op_list_head = &(target->issued_dt_op_list_head);
- op_list_tail = &(target->issued_dt_op_list_tail);
- }
- else {
- /* only pending op list is not NULL, nothing we can do here. */
- goto fn_exit;
- }
+ /* go over issued_read_op_list, issued_write_op_list,
+ * issued_dt_op_list, start from issued_read_op_list. */
+ op_list_head = &(target->issued_read_op_list_head);
+ op_list_tail = &(target->issued_read_op_list_tail);
+ read_flag = 1;
curr_op = *op_list_head;
- while (curr_op != NULL) {
- for (i = 0; i < curr_op->reqs_size; i++) {
- if (curr_op->reqs[i] == NULL)
- continue;
+ while (1) {
+ if (curr_op != NULL) {
+ for (i = 0; i < curr_op->reqs_size; i++) {
+ if (curr_op->reqs[i] == NULL)
+ continue;
+
+ if (MPID_Request_is_complete(curr_op->reqs[i])) {
+ /* If there's an error, return it */
+ mpi_errno = curr_op->reqs[i]->status.MPI_ERROR;
+ MPIU_ERR_CHKANDJUMP(mpi_errno, mpi_errno, MPI_ERR_OTHER, "**ch3|rma_msg");
+
+ /* No errors, free the request */
+ MPID_Request_release(curr_op->reqs[i]);
+
+ curr_op->reqs[i] = NULL;
+
+ win_ptr->active_req_cnt--;
+ }
+ else
+ break;
+ }
- if (MPID_Request_is_complete(curr_op->reqs[i])) {
- /* If there's an error, return it */
- mpi_errno = curr_op->reqs[i]->status.MPI_ERROR;
- MPIU_ERR_CHKANDJUMP(mpi_errno, mpi_errno, MPI_ERR_OTHER, "**ch3|rma_msg");
+ if (i == curr_op->reqs_size) {
+ /* Release user request */
+ if (curr_op->ureq) {
+ /* User request must be completed by progress engine */
+ MPIU_Assert(MPID_Request_is_complete(curr_op->ureq));
- /* No errors, free the request */
- MPID_Request_release(curr_op->reqs[i]);
+ /* Release the ch3 ref */
+ MPID_Request_release(curr_op->ureq);
+ }
- curr_op->reqs[i] = NULL;
+ /* free request array in op struct */
+ MPIU_Free(curr_op->reqs);
+ curr_op->reqs = NULL;
+ curr_op->reqs_size = 0;
- win_ptr->active_req_cnt--;
+ /* dequeue the operation and free it */
+ MPL_LL_DELETE(*op_list_head, *op_list_tail, curr_op);
+ MPIDI_CH3I_Win_op_free(win_ptr, curr_op);
}
else
break;
}
-
- if (i == curr_op->reqs_size) {
- /* Release user request */
- if (curr_op->ureq) {
- /* User request must be completed by progress engine */
- MPIU_Assert(MPID_Request_is_complete(curr_op->ureq));
-
- /* Release the ch3 ref */
- MPID_Request_release(curr_op->ureq);
+ else {
+ /* current op ptr reaches NULL, move on to the next list */
+ if (read_flag == 1) {
+ read_flag = 0;
+ op_list_head = &(target->issued_write_op_list_head);
+ op_list_tail = &(target->issued_write_op_list_tail);
+ write_flag = 1;
}
-
- /* free request array in op struct */
- MPIU_Free(curr_op->reqs);
- curr_op->reqs = NULL;
- curr_op->reqs_size = 0;
-
- /* dequeue the operation and free it */
- MPL_LL_DELETE(*op_list_head, *op_list_tail, curr_op);
- MPIDI_CH3I_Win_op_free(win_ptr, curr_op);
-
- if (*op_list_head == NULL) {
- if (read_flag == 1) {
- read_flag = 0;
- if (target->issued_write_op_list_head != NULL) {
- op_list_head = &(target->issued_write_op_list_head);
- op_list_tail = &(target->issued_write_op_list_tail);
- write_flag = 1;
- }
- else if (target->issued_dt_op_list_head != NULL) {
- op_list_head = &(target->issued_dt_op_list_head);
- op_list_tail = &(target->issued_dt_op_list_tail);
- }
- else
- break;
- }
- else if (write_flag == 1) {
- write_flag = 0;
- if (target->issued_dt_op_list_head != NULL) {
- op_list_head = &(target->issued_dt_op_list_head);
- op_list_tail = &(target->issued_dt_op_list_tail);
- }
- else
- break;
- }
+ else if (write_flag == 1) {
+ write_flag = 0;
+ op_list_head = &(target->issued_dt_op_list_head);
+ op_list_tail = &(target->issued_dt_op_list_tail);
+ }
+ else {
+ /* we reach the tail of the last operation list (dt_op_list),
+ * break out. */
+ break;
}
- /* next op */
- curr_op = *op_list_head;
}
- else
- break;
+
+ /* next op */
+ curr_op = *op_list_head;
}
cleanup_target:
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index 0a59107..dd12b96 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -574,42 +574,43 @@ int MPIDI_CH3I_RMA_Free_ops_before_completion(MPID_Win * win_ptr)
* must do a Win_flush instead. */
curr_target->sync.upgrade_flush_local = 1;
- if (curr_target->issued_read_op_list_head != NULL) {
- op_list_head = &curr_target->issued_read_op_list_head;
- op_list_tail = &curr_target->issued_read_op_list_tail;
- read_flag = 1;
- }
- else {
- op_list_head = &curr_target->issued_write_op_list_head;
- op_list_tail = &curr_target->issued_write_op_list_tail;
- }
+ op_list_head = &curr_target->issued_read_op_list_head;
+ op_list_tail = &curr_target->issued_read_op_list_tail;
+ read_flag = 1;
+
+ curr_op = *op_list_head;
/* free all ops in the list since we do not need to maintain them anymore */
- for (curr_op = *op_list_head; curr_op != NULL;) {
- if (curr_op->reqs_size > 0) {
- MPIU_Assert(curr_op->reqs != NULL);
- for (i = 0; i < curr_op->reqs_size; i++) {
- if (curr_op->reqs[i] != NULL) {
- MPID_Request_release(curr_op->reqs[i]);
- curr_op->reqs[i] = NULL;
- win_ptr->active_req_cnt--;
+ while (1) {
+ if (curr_op != NULL) {
+ if (curr_op->reqs_size > 0) {
+ MPIU_Assert(curr_op->reqs != NULL);
+ for (i = 0; i < curr_op->reqs_size; i++) {
+ if (curr_op->reqs[i] != NULL) {
+ MPID_Request_release(curr_op->reqs[i]);
+ curr_op->reqs[i] = NULL;
+ win_ptr->active_req_cnt--;
+ }
}
- }
- /* free req array in this op */
- MPIU_Free(curr_op->reqs);
- curr_op->reqs = NULL;
- curr_op->reqs_size = 0;
+ /* free req array in this op */
+ MPIU_Free(curr_op->reqs);
+ curr_op->reqs = NULL;
+ curr_op->reqs_size = 0;
+ }
+ MPL_LL_DELETE(*op_list_head, *op_list_tail, curr_op);
+ MPIDI_CH3I_Win_op_free(win_ptr, curr_op);
}
- MPL_LL_DELETE(*op_list_head, *op_list_tail, curr_op);
- MPIDI_CH3I_Win_op_free(win_ptr, curr_op);
-
- if (*op_list_head == NULL) {
+ else {
if (read_flag == 1) {
op_list_head = &curr_target->issued_write_op_list_head;
op_list_head = &curr_target->issued_write_op_list_tail;
read_flag = 0;
}
+ else {
+ /* we reach the tail of write_op_list, break out. */
+ break;
+ }
}
curr_op = *op_list_head;
}
http://git.mpich.org/mpich.git/commitdiff/74c2007fd55936f48a7d77d41a27b301e…
commit 74c2007fd55936f48a7d77d41a27b301ef263653
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Thu May 14 16:32:33 2015 -0500
Move disable_flush_local into sync struct and rename it.
Rename "disable_flush_local" to "upgrade_flush_local",
which indicates that we upgrade FLUSH_LOCAL to FLUSH.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_oplist.h b/src/mpid/ch3/include/mpid_rma_oplist.h
index f5198cc..bc7315e 100644
--- a/src/mpid/ch3/include/mpid_rma_oplist.h
+++ b/src/mpid/ch3/include/mpid_rma_oplist.h
@@ -122,12 +122,12 @@ static inline MPIDI_RMA_Target_t *MPIDI_CH3I_Win_target_alloc(MPID_Win * win_ptr
e->lock_type = MPID_LOCK_NONE;
e->lock_mode = 0;
e->accumulated_ops_cnt = 0;
- e->disable_flush_local = 0;
e->win_complete_flag = 0;
e->put_acc_issued = 0;
e->sync.sync_flag = MPIDI_RMA_SYNC_NONE;
e->sync.outstanding_acks = 0;
+ e->sync.upgrade_flush_local = 0;
return e;
}
diff --git a/src/mpid/ch3/include/mpid_rma_types.h b/src/mpid/ch3/include/mpid_rma_types.h
index 0bfb49c..120b9dd 100644
--- a/src/mpid/ch3/include/mpid_rma_types.h
+++ b/src/mpid/ch3/include/mpid_rma_types.h
@@ -90,7 +90,6 @@ typedef struct MPIDI_RMA_Target {
int lock_type; /* NONE, SHARED, EXCLUSIVE */
int lock_mode; /* e.g., MODE_NO_CHECK */
int accumulated_ops_cnt;
- int disable_flush_local;
int win_complete_flag;
int put_acc_issued; /* indicate if PUT/ACC is issued in this epoch
* after the previous synchronization calls. */
@@ -108,6 +107,9 @@ typedef struct MPIDI_RMA_Target {
/* packets sent out that we are expecting an ack for */
int outstanding_acks;
+
+ /* Marked when FLUSH_LOCAL is upgraded to FLUSH */
+ int upgrade_flush_local;
} sync;
MPIDI_RMA_Pool_type_t pool_type;
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index 1d1f395..0a59107 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -572,7 +572,7 @@ int MPIDI_CH3I_RMA_Free_ops_before_completion(MPID_Win * win_ptr)
/* After we do this, all following Win_flush_local
* must do a Win_flush instead. */
- curr_target->disable_flush_local = 1;
+ curr_target->sync.upgrade_flush_local = 1;
if (curr_target->issued_read_op_list_head != NULL) {
op_list_head = &curr_target->issued_read_op_list_head;
diff --git a/src/mpid/ch3/src/ch3u_rma_sync.c b/src/mpid/ch3/src/ch3u_rma_sync.c
index 0e06bc8..c73c356 100644
--- a/src/mpid/ch3/src/ch3u_rma_sync.c
+++ b/src/mpid/ch3/src/ch3u_rma_sync.c
@@ -1311,7 +1311,7 @@ int MPIDI_Win_flush_local(int dest, MPID_Win * win_ptr)
}
/* Set sync_flag in sync struct. */
- if (target->disable_flush_local) {
+ if (target->sync.upgrade_flush_local) {
if (target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
target->sync.outstanding_acks++;
@@ -1333,8 +1333,8 @@ int MPIDI_Win_flush_local(int dest, MPID_Win * win_ptr)
&local_completed, &remote_completed);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
- if ((target->disable_flush_local && !remote_completed) ||
- (!target->disable_flush_local && !local_completed)) {
+ if ((target->sync.upgrade_flush_local && !remote_completed) ||
+ (!target->sync.upgrade_flush_local && !local_completed)) {
mpi_errno = wait_progress_engine();
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
@@ -1343,13 +1343,13 @@ int MPIDI_Win_flush_local(int dest, MPID_Win * win_ptr)
* in this function call. */
progress_engine_triggered = 1;
}
- } while ((target->disable_flush_local && !remote_completed) ||
- (!target->disable_flush_local && !local_completed));
+ } while ((target->sync.upgrade_flush_local && !remote_completed) ||
+ (!target->sync.upgrade_flush_local && !local_completed));
finish_flush_local:
if (target != NULL) {
- /* reset disable_flush_local flag in target to 0 */
- target->disable_flush_local = 0;
+ /* reset upgrade_flush_local flag in target to 0 */
+ target->sync.upgrade_flush_local = 0;
/* ENDING synchronization: correctly decrement the following counters. */
win_ptr->accumulated_ops_cnt -= target->accumulated_ops_cnt;
@@ -1735,7 +1735,7 @@ int MPIDI_Win_flush_local_all(MPID_Win * win_ptr)
int i, made_progress = 0;
int local_completed = 0, remote_completed = 0;
MPIDI_RMA_Target_t *curr_target = NULL;
- int enable_flush_local_cnt = 0, disable_flush_local_cnt = 0;
+ int enable_flush_local_cnt = 0, upgrade_flush_local_cnt = 0;
int remote_completed_cnt = 0, local_completed_cnt = 0;
int progress_engine_triggered = 0;
int mpi_errno = MPI_SUCCESS;
@@ -1758,12 +1758,12 @@ int MPIDI_Win_flush_local_all(MPID_Win * win_ptr)
for (i = 0; i < win_ptr->num_slots; i++) {
curr_target = win_ptr->slots[i].target_list_head;
while (curr_target != NULL) {
- if (curr_target->disable_flush_local) {
+ if (curr_target->sync.upgrade_flush_local) {
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
curr_target->sync.outstanding_acks++;
}
- disable_flush_local_cnt++;
+ upgrade_flush_local_cnt++;
}
else {
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH_LOCAL) {
@@ -1795,7 +1795,7 @@ int MPIDI_Win_flush_local_all(MPID_Win * win_ptr)
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
- if (curr_target->disable_flush_local) {
+ if (curr_target->sync.upgrade_flush_local) {
if (remote_completed) {
remote_completed_cnt++;
}
@@ -1809,7 +1809,7 @@ int MPIDI_Win_flush_local_all(MPID_Win * win_ptr)
}
}
- if (remote_completed_cnt < disable_flush_local_cnt ||
+ if (remote_completed_cnt < upgrade_flush_local_cnt ||
local_completed_cnt < enable_flush_local_cnt) {
mpi_errno = wait_progress_engine();
if (mpi_errno != MPI_SUCCESS)
@@ -1819,15 +1819,15 @@ int MPIDI_Win_flush_local_all(MPID_Win * win_ptr)
* in this function call. */
progress_engine_triggered = 1;
}
- } while (remote_completed_cnt < disable_flush_local_cnt ||
+ } while (remote_completed_cnt < upgrade_flush_local_cnt ||
local_completed_cnt < enable_flush_local_cnt);
finish_flush_local_all:
- /* reset disable_flush_local flag in target to 0 */
+ /* reset upgrade_flush_local flag in target to 0 */
for (i = 0; i < win_ptr->num_slots; i++) {
curr_target = win_ptr->slots[i].target_list_head;
while (curr_target != NULL) {
- curr_target->disable_flush_local = 0;
+ curr_target->sync.upgrade_flush_local = 0;
curr_target = curr_target->next;
}
}
http://git.mpich.org/mpich.git/commitdiff/8a172d8b4cfb7489d54de9bb2fcafcbed…
commit 8a172d8b4cfb7489d54de9bb2fcafcbed98ff592
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Thu May 14 16:23:16 2015 -0500
Add "issued_" prefix to read_op_list, write_op_list and dt_op_list.
"read_op_list", "write_op_list" and "dt_op_list" are used to store
RMA operations that are issued but not completed. Here we add
prefix to make it clearer.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_oplist.h b/src/mpid/ch3/include/mpid_rma_oplist.h
index e5b3cff..f5198cc 100644
--- a/src/mpid/ch3/include/mpid_rma_oplist.h
+++ b/src/mpid/ch3/include/mpid_rma_oplist.h
@@ -111,9 +111,9 @@ static inline MPIDI_RMA_Target_t *MPIDI_CH3I_Win_target_alloc(MPID_Win * win_ptr
MPL_LL_DELETE(win_ptr->target_pool, win_ptr->target_pool_tail, e);
}
- e->read_op_list_head = e->read_op_list_tail = NULL;
- e->write_op_list_head = e->write_op_list_tail = NULL;
- e->dt_op_list_head = e->dt_op_list_tail = NULL;
+ e->issued_read_op_list_head = e->issued_read_op_list_tail = NULL;
+ e->issued_write_op_list_head = e->issued_write_op_list_tail = NULL;
+ e->issued_dt_op_list_head = e->issued_dt_op_list_tail = NULL;
e->pending_op_list_head = e->pending_op_list_tail = NULL;
e->next_op_to_issue = NULL;
@@ -145,9 +145,9 @@ static inline int MPIDI_CH3I_Win_target_free(MPID_Win * win_ptr, MPIDI_RMA_Targe
/* We enqueue elements to the right pool, so when they get freed
* at window free time, they won't conflict with the global pool
* or other windows */
- MPIU_Assert(e->read_op_list_head == NULL);
- MPIU_Assert(e->write_op_list_head == NULL);
- MPIU_Assert(e->dt_op_list_head == NULL);
+ MPIU_Assert(e->issued_read_op_list_head == NULL);
+ MPIU_Assert(e->issued_write_op_list_head == NULL);
+ MPIU_Assert(e->issued_dt_op_list_head == NULL);
MPIU_Assert(e->pending_op_list_head == NULL);
/* use PREPEND when return objects back to the pool
@@ -354,23 +354,23 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
goto fn_exit;
if (target->pending_op_list_head == NULL &&
- target->read_op_list_head == NULL && target->write_op_list_head == NULL &&
- target->dt_op_list_head == NULL)
+ target->issued_read_op_list_head == NULL && target->issued_write_op_list_head == NULL &&
+ target->issued_dt_op_list_head == NULL)
goto cleanup_target;
- if (target->read_op_list_head != NULL) {
- op_list_head = &(target->read_op_list_head);
- op_list_tail = &(target->read_op_list_tail);
+ if (target->issued_read_op_list_head != NULL) {
+ op_list_head = &(target->issued_read_op_list_head);
+ op_list_tail = &(target->issued_read_op_list_tail);
read_flag = 1;
}
- else if (target->write_op_list_head != NULL) {
- op_list_head = &(target->write_op_list_head);
- op_list_tail = &(target->write_op_list_tail);
+ else if (target->issued_write_op_list_head != NULL) {
+ op_list_head = &(target->issued_write_op_list_head);
+ op_list_tail = &(target->issued_write_op_list_tail);
write_flag = 1;
}
- else if (target->dt_op_list_head != NULL) {
- op_list_head = &(target->dt_op_list_head);
- op_list_tail = &(target->dt_op_list_tail);
+ else if (target->issued_dt_op_list_head != NULL) {
+ op_list_head = &(target->issued_dt_op_list_head);
+ op_list_tail = &(target->issued_dt_op_list_tail);
}
else {
/* only pending op list is not NULL, nothing we can do here. */
@@ -421,23 +421,23 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
if (*op_list_head == NULL) {
if (read_flag == 1) {
read_flag = 0;
- if (target->write_op_list_head != NULL) {
- op_list_head = &(target->write_op_list_head);
- op_list_tail = &(target->write_op_list_tail);
+ if (target->issued_write_op_list_head != NULL) {
+ op_list_head = &(target->issued_write_op_list_head);
+ op_list_tail = &(target->issued_write_op_list_tail);
write_flag = 1;
}
- else if (target->dt_op_list_head != NULL) {
- op_list_head = &(target->dt_op_list_head);
- op_list_tail = &(target->dt_op_list_tail);
+ else if (target->issued_dt_op_list_head != NULL) {
+ op_list_head = &(target->issued_dt_op_list_head);
+ op_list_tail = &(target->issued_dt_op_list_tail);
}
else
break;
}
else if (write_flag == 1) {
write_flag = 0;
- if (target->dt_op_list_head != NULL) {
- op_list_head = &(target->dt_op_list_head);
- op_list_tail = &(target->dt_op_list_tail);
+ if (target->issued_dt_op_list_head != NULL) {
+ op_list_head = &(target->issued_dt_op_list_head);
+ op_list_tail = &(target->issued_dt_op_list_tail);
}
else
break;
@@ -452,8 +452,8 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
cleanup_target:
if (target->pending_op_list_head == NULL &&
- target->read_op_list_head == NULL && target->write_op_list_head == NULL &&
- target->dt_op_list_head == NULL) {
+ target->issued_read_op_list_head == NULL && target->issued_write_op_list_head == NULL &&
+ target->issued_dt_op_list_head == NULL) {
(*local_completed) = 1;
diff --git a/src/mpid/ch3/include/mpid_rma_types.h b/src/mpid/ch3/include/mpid_rma_types.h
index 1956488..0bfb49c 100644
--- a/src/mpid/ch3/include/mpid_rma_types.h
+++ b/src/mpid/ch3/include/mpid_rma_types.h
@@ -79,9 +79,9 @@ typedef struct MPIDI_RMA_Op {
} MPIDI_RMA_Op_t;
typedef struct MPIDI_RMA_Target {
- struct MPIDI_RMA_Op *read_op_list_head, *read_op_list_tail;
- struct MPIDI_RMA_Op *write_op_list_head, *write_op_list_tail;
- struct MPIDI_RMA_Op *dt_op_list_head, *dt_op_list_tail;
+ struct MPIDI_RMA_Op *issued_read_op_list_head, *issued_read_op_list_tail;
+ struct MPIDI_RMA_Op *issued_write_op_list_head, *issued_write_op_list_tail;
+ struct MPIDI_RMA_Op *issued_dt_op_list_head, *issued_dt_op_list_tail;
struct MPIDI_RMA_Op *pending_op_list_head, *pending_op_list_tail;
struct MPIDI_RMA_Op *next_op_to_issue;
struct MPIDI_RMA_Target *next;
diff --git a/src/mpid/ch3/include/mpidrma.h b/src/mpid/ch3/include/mpidrma.h
index 58e4c28..0d80984 100644
--- a/src/mpid/ch3/include/mpidrma.h
+++ b/src/mpid/ch3/include/mpidrma.h
@@ -658,19 +658,19 @@ static inline int adjust_op_piggybacked_with_lock(MPID_Win * win_ptr,
}
if (is_derived) {
- MPIDI_CH3I_RMA_Ops_append(&(target->dt_op_list_head),
- &(target->dt_op_list_tail), op);
+ MPIDI_CH3I_RMA_Ops_append(&(target->issued_dt_op_list_head),
+ &(target->issued_dt_op_list_tail), op);
}
else if (op->pkt.type == MPIDI_CH3_PKT_PUT ||
op->pkt.type == MPIDI_CH3_PKT_PUT_IMMED ||
op->pkt.type == MPIDI_CH3_PKT_ACCUMULATE ||
op->pkt.type == MPIDI_CH3_PKT_ACCUMULATE_IMMED) {
- MPIDI_CH3I_RMA_Ops_append(&(target->write_op_list_head),
- &(target->write_op_list_tail), op);
+ MPIDI_CH3I_RMA_Ops_append(&(target->issued_write_op_list_head),
+ &(target->issued_write_op_list_tail), op);
}
else {
- MPIDI_CH3I_RMA_Ops_append(&(target->read_op_list_head),
- &(target->read_op_list_tail), op);
+ MPIDI_CH3I_RMA_Ops_append(&(target->issued_read_op_list_head),
+ &(target->issued_read_op_list_tail), op);
}
}
}
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index e94a171..1d1f395 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -429,19 +429,19 @@ static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * targ
}
if (is_derived) {
- MPIDI_CH3I_RMA_Ops_append(&(target->dt_op_list_head),
- &(target->dt_op_list_tail), curr_op);
+ MPIDI_CH3I_RMA_Ops_append(&(target->issued_dt_op_list_head),
+ &(target->issued_dt_op_list_tail), curr_op);
}
else if (curr_op->pkt.type == MPIDI_CH3_PKT_PUT ||
curr_op->pkt.type == MPIDI_CH3_PKT_PUT_IMMED ||
curr_op->pkt.type == MPIDI_CH3_PKT_ACCUMULATE ||
curr_op->pkt.type == MPIDI_CH3_PKT_ACCUMULATE_IMMED) {
- MPIDI_CH3I_RMA_Ops_append(&(target->write_op_list_head),
- &(target->write_op_list_tail), curr_op);
+ MPIDI_CH3I_RMA_Ops_append(&(target->issued_write_op_list_head),
+ &(target->issued_write_op_list_tail), curr_op);
}
else {
- MPIDI_CH3I_RMA_Ops_append(&(target->read_op_list_head),
- &(target->read_op_list_tail), curr_op);
+ MPIDI_CH3I_RMA_Ops_append(&(target->issued_read_op_list_head),
+ &(target->issued_read_op_list_tail), curr_op);
}
}
@@ -549,8 +549,8 @@ int MPIDI_CH3I_RMA_Free_ops_before_completion(MPID_Win * win_ptr)
if (win_ptr->slots[i].target_list_head != NULL) {
curr_target = win_ptr->slots[i].target_list_head;
while (curr_target != NULL) {
- if (curr_target->read_op_list_head != NULL ||
- curr_target->write_op_list_head != NULL) {
+ if (curr_target->issued_read_op_list_head != NULL ||
+ curr_target->issued_write_op_list_head != NULL) {
if (win_ptr->states.access_state == MPIDI_RMA_PER_TARGET ||
win_ptr->states.access_state == MPIDI_RMA_LOCK_ALL_CALLED) {
if (curr_target->access_state == MPIDI_RMA_LOCK_GRANTED)
@@ -574,14 +574,14 @@ int MPIDI_CH3I_RMA_Free_ops_before_completion(MPID_Win * win_ptr)
* must do a Win_flush instead. */
curr_target->disable_flush_local = 1;
- if (curr_target->read_op_list_head != NULL) {
- op_list_head = &curr_target->read_op_list_head;
- op_list_tail = &curr_target->read_op_list_tail;
+ if (curr_target->issued_read_op_list_head != NULL) {
+ op_list_head = &curr_target->issued_read_op_list_head;
+ op_list_tail = &curr_target->issued_read_op_list_tail;
read_flag = 1;
}
else {
- op_list_head = &curr_target->write_op_list_head;
- op_list_tail = &curr_target->write_op_list_tail;
+ op_list_head = &curr_target->issued_write_op_list_head;
+ op_list_tail = &curr_target->issued_write_op_list_tail;
}
/* free all ops in the list since we do not need to maintain them anymore */
@@ -606,8 +606,8 @@ int MPIDI_CH3I_RMA_Free_ops_before_completion(MPID_Win * win_ptr)
if (*op_list_head == NULL) {
if (read_flag == 1) {
- op_list_head = &curr_target->write_op_list_head;
- op_list_head = &curr_target->write_op_list_tail;
+ op_list_head = &curr_target->issued_write_op_list_head;
+ op_list_head = &curr_target->issued_write_op_list_tail;
read_flag = 0;
}
}
http://git.mpich.org/mpich.git/commitdiff/2db95ef98d98d968af42eeea9d0b9b2a4…
commit 2db95ef98d98d968af42eeea9d0b9b2a4293bfcc
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Mon Mar 9 20:09:49 2015 -0700
Add "_head" to name of linked lists.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_oplist.h b/src/mpid/ch3/include/mpid_rma_oplist.h
index c644cdd..e5b3cff 100644
--- a/src/mpid/ch3/include/mpid_rma_oplist.h
+++ b/src/mpid/ch3/include/mpid_rma_oplist.h
@@ -111,10 +111,10 @@ static inline MPIDI_RMA_Target_t *MPIDI_CH3I_Win_target_alloc(MPID_Win * win_ptr
MPL_LL_DELETE(win_ptr->target_pool, win_ptr->target_pool_tail, e);
}
- e->read_op_list = e->read_op_list_tail = NULL;
- e->write_op_list = e->write_op_list_tail = NULL;
- e->dt_op_list = e->dt_op_list_tail = NULL;
- e->pending_op_list = e->pending_op_list_tail = NULL;
+ e->read_op_list_head = e->read_op_list_tail = NULL;
+ e->write_op_list_head = e->write_op_list_tail = NULL;
+ e->dt_op_list_head = e->dt_op_list_tail = NULL;
+ e->pending_op_list_head = e->pending_op_list_tail = NULL;
e->next_op_to_issue = NULL;
e->target_rank = -1;
@@ -145,10 +145,10 @@ static inline int MPIDI_CH3I_Win_target_free(MPID_Win * win_ptr, MPIDI_RMA_Targe
/* We enqueue elements to the right pool, so when they get freed
* at window free time, they won't conflict with the global pool
* or other windows */
- MPIU_Assert(e->read_op_list == NULL);
- MPIU_Assert(e->write_op_list == NULL);
- MPIU_Assert(e->dt_op_list == NULL);
- MPIU_Assert(e->pending_op_list == NULL);
+ MPIU_Assert(e->read_op_list_head == NULL);
+ MPIU_Assert(e->write_op_list_head == NULL);
+ MPIU_Assert(e->dt_op_list_head == NULL);
+ MPIU_Assert(e->pending_op_list_head == NULL);
/* use PREPEND when return objects back to the pool
* in order to improve cache performance */
@@ -187,11 +187,11 @@ static inline int MPIDI_CH3I_Win_create_target(MPID_Win * win_ptr, int target_ra
t->target_rank = target_rank;
- if (slot->target_list == NULL)
+ if (slot->target_list_head == NULL)
win_ptr->non_empty_slots++;
/* Enqueue target into target list. */
- MPL_LL_APPEND(slot->target_list, slot->target_list_tail, t);
+ MPL_LL_APPEND(slot->target_list_head, slot->target_list_tail, t);
assert(t != NULL);
@@ -221,7 +221,7 @@ static inline int MPIDI_CH3I_Win_find_target(MPID_Win * win_ptr, int target_rank
else
slot = &(win_ptr->slots[target_rank]);
- t = slot->target_list;
+ t = slot->target_list_head;
while (t != NULL) {
if (t->target_rank == target_rank)
break;
@@ -277,7 +277,7 @@ static inline int MPIDI_CH3I_Win_enqueue_op(MPID_Win * win_ptr, MPIDI_RMA_Op_t *
}
/* Enqueue operation into pending list. */
- MPL_LL_APPEND(target->pending_op_list, target->pending_op_list_tail, op);
+ MPL_LL_APPEND(target->pending_op_list_head, target->pending_op_list_tail, op);
if (target->next_op_to_issue == NULL)
target->next_op_to_issue = op;
@@ -309,13 +309,13 @@ static inline int MPIDI_CH3I_Win_target_dequeue_and_free(MPID_Win * win_ptr, MPI
else
slot = &(win_ptr->slots[target_rank]);
- MPL_LL_DELETE(slot->target_list, slot->target_list_tail, e);
+ MPL_LL_DELETE(slot->target_list_head, slot->target_list_tail, e);
mpi_errno = MPIDI_CH3I_Win_target_free(win_ptr, e);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
- if (slot->target_list == NULL)
+ if (slot->target_list_head == NULL)
win_ptr->non_empty_slots--;
fn_exit:
@@ -333,7 +333,7 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
int *local_completed, int *remote_completed)
{
MPIDI_RMA_Op_t *curr_op = NULL;
- MPIDI_RMA_Op_t **op_list = NULL, **op_list_tail = NULL;
+ MPIDI_RMA_Op_t **op_list_head = NULL, **op_list_tail = NULL;
int read_flag = 0, write_flag = 0;
int mpi_errno = MPI_SUCCESS;
int i;
@@ -353,22 +353,23 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
target->access_state == MPIDI_RMA_LOCK_ISSUED)
goto fn_exit;
- if (target->pending_op_list == NULL &&
- target->read_op_list == NULL && target->write_op_list == NULL && target->dt_op_list == NULL)
+ if (target->pending_op_list_head == NULL &&
+ target->read_op_list_head == NULL && target->write_op_list_head == NULL &&
+ target->dt_op_list_head == NULL)
goto cleanup_target;
- if (target->read_op_list != NULL) {
- op_list = &(target->read_op_list);
+ if (target->read_op_list_head != NULL) {
+ op_list_head = &(target->read_op_list_head);
op_list_tail = &(target->read_op_list_tail);
read_flag = 1;
}
- else if (target->write_op_list != NULL) {
- op_list = &(target->write_op_list);
+ else if (target->write_op_list_head != NULL) {
+ op_list_head = &(target->write_op_list_head);
op_list_tail = &(target->write_op_list_tail);
write_flag = 1;
}
- else if (target->dt_op_list != NULL) {
- op_list = &(target->dt_op_list);
+ else if (target->dt_op_list_head != NULL) {
+ op_list_head = &(target->dt_op_list_head);
op_list_tail = &(target->dt_op_list_tail);
}
else {
@@ -376,7 +377,7 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
goto fn_exit;
}
- curr_op = *op_list;
+ curr_op = *op_list_head;
while (curr_op != NULL) {
for (i = 0; i < curr_op->reqs_size; i++) {
if (curr_op->reqs[i] == NULL)
@@ -414,19 +415,19 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
curr_op->reqs_size = 0;
/* dequeue the operation and free it */
- MPL_LL_DELETE(*op_list, *op_list_tail, curr_op);
+ MPL_LL_DELETE(*op_list_head, *op_list_tail, curr_op);
MPIDI_CH3I_Win_op_free(win_ptr, curr_op);
- if (*op_list == NULL) {
+ if (*op_list_head == NULL) {
if (read_flag == 1) {
read_flag = 0;
- if (target->write_op_list != NULL) {
- op_list = &(target->write_op_list);
+ if (target->write_op_list_head != NULL) {
+ op_list_head = &(target->write_op_list_head);
op_list_tail = &(target->write_op_list_tail);
write_flag = 1;
}
- else if (target->dt_op_list != NULL) {
- op_list = &(target->dt_op_list);
+ else if (target->dt_op_list_head != NULL) {
+ op_list_head = &(target->dt_op_list_head);
op_list_tail = &(target->dt_op_list_tail);
}
else
@@ -434,8 +435,8 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
}
else if (write_flag == 1) {
write_flag = 0;
- if (target->dt_op_list != NULL) {
- op_list = &(target->dt_op_list);
+ if (target->dt_op_list_head != NULL) {
+ op_list_head = &(target->dt_op_list_head);
op_list_tail = &(target->dt_op_list_tail);
}
else
@@ -443,16 +444,16 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
}
}
/* next op */
- curr_op = *op_list;
+ curr_op = *op_list_head;
}
else
break;
}
cleanup_target:
- if (target->pending_op_list == NULL &&
- target->read_op_list == NULL && target->write_op_list == NULL &&
- target->dt_op_list == NULL) {
+ if (target->pending_op_list_head == NULL &&
+ target->read_op_list_head == NULL && target->write_op_list_head == NULL &&
+ target->dt_op_list_head == NULL) {
(*local_completed) = 1;
@@ -486,7 +487,7 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_win(MPID_Win * win_ptr,
(*remote_completed) = 0;
for (i = 0; i < win_ptr->num_slots; i++) {
- for (target = win_ptr->slots[i].target_list; target;) {
+ for (target = win_ptr->slots[i].target_list_head; target;) {
int local = 0, remote = 0;
mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, target, &local, &remote);
@@ -544,7 +545,7 @@ static inline int MPIDI_CH3I_RMA_Cleanup_targets_win(MPID_Win * win_ptr)
int i, mpi_errno = MPI_SUCCESS;
for (i = 0; i < win_ptr->num_slots; i++) {
- for (target = win_ptr->slots[i].target_list; target;) {
+ for (target = win_ptr->slots[i].target_list_head; target;) {
next_target = target->next;
mpi_errno = MPIDI_CH3I_RMA_Cleanup_single_target(win_ptr, target);
if (mpi_errno != MPI_SUCCESS)
diff --git a/src/mpid/ch3/include/mpid_rma_types.h b/src/mpid/ch3/include/mpid_rma_types.h
index 732e859..1956488 100644
--- a/src/mpid/ch3/include/mpid_rma_types.h
+++ b/src/mpid/ch3/include/mpid_rma_types.h
@@ -79,10 +79,10 @@ typedef struct MPIDI_RMA_Op {
} MPIDI_RMA_Op_t;
typedef struct MPIDI_RMA_Target {
- struct MPIDI_RMA_Op *read_op_list, *read_op_list_tail;
- struct MPIDI_RMA_Op *write_op_list, *write_op_list_tail;
- struct MPIDI_RMA_Op *dt_op_list, *dt_op_list_tail;
- struct MPIDI_RMA_Op *pending_op_list, *pending_op_list_tail;
+ struct MPIDI_RMA_Op *read_op_list_head, *read_op_list_tail;
+ struct MPIDI_RMA_Op *write_op_list_head, *write_op_list_tail;
+ struct MPIDI_RMA_Op *dt_op_list_head, *dt_op_list_tail;
+ struct MPIDI_RMA_Op *pending_op_list_head, *pending_op_list_tail;
struct MPIDI_RMA_Op *next_op_to_issue;
struct MPIDI_RMA_Target *next;
int target_rank;
@@ -114,7 +114,7 @@ typedef struct MPIDI_RMA_Target {
} MPIDI_RMA_Target_t;
typedef struct MPIDI_RMA_Slot {
- struct MPIDI_RMA_Target *target_list;
+ struct MPIDI_RMA_Target *target_list_head;
struct MPIDI_RMA_Target *target_list_tail;
} MPIDI_RMA_Slot_t;
diff --git a/src/mpid/ch3/include/mpidrma.h b/src/mpid/ch3/include/mpidrma.h
index 2eb7f70..58e4c28 100644
--- a/src/mpid/ch3/include/mpidrma.h
+++ b/src/mpid/ch3/include/mpidrma.h
@@ -619,7 +619,7 @@ static inline int adjust_op_piggybacked_with_lock(MPID_Win * win_ptr,
MPIU_ERR_POP(mpi_errno);
MPIU_Assert(target != NULL);
- op = target->pending_op_list;
+ op = target->pending_op_list_head;
if (op != NULL)
MPIDI_CH3_PKT_RMA_GET_FLAGS(op->pkt, op_flags, mpi_errno);
@@ -636,14 +636,14 @@ static inline int adjust_op_piggybacked_with_lock(MPID_Win * win_ptr,
if (op->reqs_size == 0) {
MPIU_Assert(op->reqs == NULL);
- MPIDI_CH3I_RMA_Ops_free_elem(win_ptr, &(target->pending_op_list),
+ MPIDI_CH3I_RMA_Ops_free_elem(win_ptr, &(target->pending_op_list_head),
&(target->pending_op_list_tail), op);
}
else {
MPI_Datatype target_datatype;
int is_derived = FALSE;
- MPIDI_CH3I_RMA_Ops_unlink(&(target->pending_op_list),
+ MPIDI_CH3I_RMA_Ops_unlink(&(target->pending_op_list_head),
&(target->pending_op_list_tail), op);
MPIDI_CH3_PKT_RMA_GET_TARGET_DATATYPE(op->pkt, target_datatype, mpi_errno);
@@ -658,18 +658,18 @@ static inline int adjust_op_piggybacked_with_lock(MPID_Win * win_ptr,
}
if (is_derived) {
- MPIDI_CH3I_RMA_Ops_append(&(target->dt_op_list),
+ MPIDI_CH3I_RMA_Ops_append(&(target->dt_op_list_head),
&(target->dt_op_list_tail), op);
}
else if (op->pkt.type == MPIDI_CH3_PKT_PUT ||
op->pkt.type == MPIDI_CH3_PKT_PUT_IMMED ||
op->pkt.type == MPIDI_CH3_PKT_ACCUMULATE ||
op->pkt.type == MPIDI_CH3_PKT_ACCUMULATE_IMMED) {
- MPIDI_CH3I_RMA_Ops_append(&(target->write_op_list),
+ MPIDI_CH3I_RMA_Ops_append(&(target->write_op_list_head),
&(target->write_op_list_tail), op);
}
else {
- MPIDI_CH3I_RMA_Ops_append(&(target->read_op_list),
+ MPIDI_CH3I_RMA_Ops_append(&(target->read_op_list_head),
&(target->read_op_list_tail), op);
}
}
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index 825452c..e94a171 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -159,8 +159,8 @@ static inline int check_target_state(MPID_Win * win_ptr, MPIDI_RMA_Target_t * ta
if (target->sync.sync_flag == MPIDI_RMA_SYNC_NONE ||
target->sync.sync_flag == MPIDI_RMA_SYNC_FLUSH_LOCAL ||
target->sync.sync_flag == MPIDI_RMA_SYNC_FLUSH) {
- if (target->pending_op_list == NULL ||
- !target->pending_op_list->piggyback_lock_candidate) {
+ if (target->pending_op_list_head == NULL ||
+ !target->pending_op_list_head->piggyback_lock_candidate) {
/* issue lock request */
target->access_state = MPIDI_RMA_LOCK_ISSUED;
if (target->target_rank == rank) {
@@ -178,7 +178,7 @@ static inline int check_target_state(MPID_Win * win_ptr, MPIDI_RMA_Target_t * ta
}
}
else if (target->sync.sync_flag == MPIDI_RMA_SYNC_UNLOCK) {
- if (target->pending_op_list == NULL) {
+ if (target->pending_op_list_head == NULL) {
/* No RMA operation has ever been posted to this target,
* finish issuing, no need to acquire the lock. Cleanup
* function will clean it up. */
@@ -196,8 +196,8 @@ static inline int check_target_state(MPID_Win * win_ptr, MPIDI_RMA_Target_t * ta
/* if we reach WIN_UNLOCK and there is still operation existing
* in pending list, this operation must be the only operation
* and it is prepared to piggyback LOCK and UNLOCK. */
- MPIU_Assert(target->pending_op_list->next == NULL);
- MPIU_Assert(target->pending_op_list->piggyback_lock_candidate);
+ MPIU_Assert(target->pending_op_list_head->next == NULL);
+ MPIU_Assert(target->pending_op_list_head->piggyback_lock_candidate);
}
}
break;
@@ -205,7 +205,7 @@ static inline int check_target_state(MPID_Win * win_ptr, MPIDI_RMA_Target_t * ta
case MPIDI_RMA_LOCK_GRANTED:
case MPIDI_RMA_NONE:
if (target->sync.sync_flag == MPIDI_RMA_SYNC_FLUSH) {
- if (target->pending_op_list == NULL) {
+ if (target->pending_op_list_head == NULL) {
if (target->target_rank == rank) {
target->sync.outstanding_acks--;
MPIU_Assert(target->sync.outstanding_acks >= 0);
@@ -232,7 +232,7 @@ static inline int check_target_state(MPID_Win * win_ptr, MPIDI_RMA_Target_t * ta
}
}
else if (target->sync.sync_flag == MPIDI_RMA_SYNC_UNLOCK) {
- if (target->pending_op_list == NULL) {
+ if (target->pending_op_list_head == NULL) {
if (target->target_rank == rank) {
target->sync.outstanding_acks--;
MPIU_Assert(target->sync.outstanding_acks >= 0);
@@ -405,7 +405,7 @@ static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * targ
if (curr_op->reqs_size == 0) {
MPIU_Assert(curr_op->reqs == NULL);
/* Sending is completed immediately. */
- MPIDI_CH3I_RMA_Ops_free_elem(win_ptr, &(target->pending_op_list),
+ MPIDI_CH3I_RMA_Ops_free_elem(win_ptr, &(target->pending_op_list_head),
&(target->pending_op_list_tail), curr_op);
}
else {
@@ -414,7 +414,7 @@ static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * targ
/* Sending is not completed immediately. */
- MPIDI_CH3I_RMA_Ops_unlink(&(target->pending_op_list),
+ MPIDI_CH3I_RMA_Ops_unlink(&(target->pending_op_list_head),
&(target->pending_op_list_tail), curr_op);
MPIDI_CH3_PKT_RMA_GET_TARGET_DATATYPE(curr_op->pkt, target_datatype, mpi_errno);
@@ -429,18 +429,18 @@ static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * targ
}
if (is_derived) {
- MPIDI_CH3I_RMA_Ops_append(&(target->dt_op_list),
+ MPIDI_CH3I_RMA_Ops_append(&(target->dt_op_list_head),
&(target->dt_op_list_tail), curr_op);
}
else if (curr_op->pkt.type == MPIDI_CH3_PKT_PUT ||
curr_op->pkt.type == MPIDI_CH3_PKT_PUT_IMMED ||
curr_op->pkt.type == MPIDI_CH3_PKT_ACCUMULATE ||
curr_op->pkt.type == MPIDI_CH3_PKT_ACCUMULATE_IMMED) {
- MPIDI_CH3I_RMA_Ops_append(&(target->write_op_list),
+ MPIDI_CH3I_RMA_Ops_append(&(target->write_op_list_head),
&(target->write_op_list_tail), curr_op);
}
else {
- MPIDI_CH3I_RMA_Ops_append(&(target->read_op_list),
+ MPIDI_CH3I_RMA_Ops_append(&(target->read_op_list_head),
&(target->read_op_list_tail), curr_op);
}
}
@@ -487,7 +487,7 @@ static inline int issue_ops_win(MPID_Win * win_ptr, int *made_progress)
else
idx = i - win_ptr->num_slots;
- target = win_ptr->slots[idx].target_list;
+ target = win_ptr->slots[idx].target_list_head;
while (target != NULL) {
int temp_progress = 0;
@@ -524,7 +524,7 @@ int MPIDI_CH3I_RMA_Free_ops_before_completion(MPID_Win * win_ptr)
{
MPIDI_RMA_Op_t *curr_op = NULL;
MPIDI_RMA_Target_t *curr_target = NULL;
- MPIDI_RMA_Op_t **op_list = NULL, **op_list_tail = NULL;
+ MPIDI_RMA_Op_t **op_list_head = NULL, **op_list_tail = NULL;
int read_flag = 0;
int i, made_progress = 0;
int mpi_errno = MPI_SUCCESS;
@@ -546,10 +546,11 @@ int MPIDI_CH3I_RMA_Free_ops_before_completion(MPID_Win * win_ptr)
/* find targets that have operations */
for (i = 0; i < win_ptr->num_slots; i++) {
- if (win_ptr->slots[i].target_list != NULL) {
- curr_target = win_ptr->slots[i].target_list;
+ if (win_ptr->slots[i].target_list_head != NULL) {
+ curr_target = win_ptr->slots[i].target_list_head;
while (curr_target != NULL) {
- if (curr_target->read_op_list != NULL || curr_target->write_op_list != NULL) {
+ if (curr_target->read_op_list_head != NULL ||
+ curr_target->write_op_list_head != NULL) {
if (win_ptr->states.access_state == MPIDI_RMA_PER_TARGET ||
win_ptr->states.access_state == MPIDI_RMA_LOCK_ALL_CALLED) {
if (curr_target->access_state == MPIDI_RMA_LOCK_GRANTED)
@@ -573,18 +574,18 @@ int MPIDI_CH3I_RMA_Free_ops_before_completion(MPID_Win * win_ptr)
* must do a Win_flush instead. */
curr_target->disable_flush_local = 1;
- if (curr_target->read_op_list != NULL) {
- op_list = &curr_target->read_op_list;
+ if (curr_target->read_op_list_head != NULL) {
+ op_list_head = &curr_target->read_op_list_head;
op_list_tail = &curr_target->read_op_list_tail;
read_flag = 1;
}
else {
- op_list = &curr_target->write_op_list;
+ op_list_head = &curr_target->write_op_list_head;
op_list_tail = &curr_target->write_op_list_tail;
}
/* free all ops in the list since we do not need to maintain them anymore */
- for (curr_op = *op_list; curr_op != NULL;) {
+ for (curr_op = *op_list_head; curr_op != NULL;) {
if (curr_op->reqs_size > 0) {
MPIU_Assert(curr_op->reqs != NULL);
for (i = 0; i < curr_op->reqs_size; i++) {
@@ -600,17 +601,17 @@ int MPIDI_CH3I_RMA_Free_ops_before_completion(MPID_Win * win_ptr)
curr_op->reqs = NULL;
curr_op->reqs_size = 0;
}
- MPL_LL_DELETE(*op_list, *op_list_tail, curr_op);
+ MPL_LL_DELETE(*op_list_head, *op_list_tail, curr_op);
MPIDI_CH3I_Win_op_free(win_ptr, curr_op);
- if (*op_list == NULL) {
+ if (*op_list_head == NULL) {
if (read_flag == 1) {
- op_list = &curr_target->write_op_list;
- op_list = &curr_target->write_op_list_tail;
+ op_list_head = &curr_target->write_op_list_head;
+ op_list_head = &curr_target->write_op_list_tail;
read_flag = 0;
}
}
- curr_op = *op_list;
+ curr_op = *op_list_head;
}
fn_exit:
@@ -638,9 +639,9 @@ int MPIDI_CH3I_RMA_Cleanup_ops_aggressive(MPID_Win * win_ptr)
/* find the first target that has something to issue */
for (i = 0; i < win_ptr->num_slots; i++) {
- if (win_ptr->slots[i].target_list != NULL) {
- curr_target = win_ptr->slots[i].target_list;
- while (curr_target != NULL && curr_target->pending_op_list == NULL)
+ if (win_ptr->slots[i].target_list_head != NULL) {
+ curr_target = win_ptr->slots[i].target_list_head;
+ while (curr_target != NULL && curr_target->pending_op_list_head == NULL)
curr_target = curr_target->next;
if (curr_target != NULL)
break;
@@ -725,9 +726,9 @@ int MPIDI_CH3I_RMA_Cleanup_target_aggressive(MPID_Win * win_ptr, MPIDI_RMA_Targe
* target */
/* TODO: we should think about better strategies on selecting the target */
for (i = 0; i < win_ptr->num_slots; i++)
- if (win_ptr->slots[i].target_list != NULL)
+ if (win_ptr->slots[i].target_list_head != NULL)
break;
- curr_target = win_ptr->slots[i].target_list;
+ curr_target = win_ptr->slots[i].target_list_head;
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
curr_target->sync.outstanding_acks++;
diff --git a/src/mpid/ch3/src/ch3u_rma_sync.c b/src/mpid/ch3/src/ch3u_rma_sync.c
index 9dad49a..0e06bc8 100644
--- a/src/mpid/ch3/src/ch3u_rma_sync.c
+++ b/src/mpid/ch3/src/ch3u_rma_sync.c
@@ -368,7 +368,7 @@ int MPIDI_Win_fence(int assert, MPID_Win * win_ptr)
/* Set sync_flag in target structs. */
for (i = 0; i < win_ptr->num_slots; i++) {
- curr_target = win_ptr->slots[i].target_list;
+ curr_target = win_ptr->slots[i].target_list_head;
while (curr_target != NULL) {
/* set sync_flag in sync struct */
@@ -742,9 +742,9 @@ int MPIDI_Win_complete(MPID_Win * win_ptr)
}
if (win_comm_ptr->local_size <= win_ptr->num_slots)
- curr_target = win_ptr->slots[dst].target_list;
+ curr_target = win_ptr->slots[dst].target_list_head;
else {
- curr_target = win_ptr->slots[dst % win_ptr->num_slots].target_list;
+ curr_target = win_ptr->slots[dst % win_ptr->num_slots].target_list_head;
while (curr_target != NULL && curr_target->target_rank != dst)
curr_target = curr_target->next;
}
@@ -1522,7 +1522,7 @@ int MPIDI_Win_unlock_all(MPID_Win * win_ptr)
if (win_ptr->states.access_state == MPIDI_RMA_LOCK_ALL_CALLED) {
for (i = 0; i < win_ptr->num_slots; i++) {
- curr_target = win_ptr->slots[i].target_list;
+ curr_target = win_ptr->slots[i].target_list_head;
while (curr_target != NULL) {
if (curr_target->sync.sync_flag < sync_flag) {
curr_target->sync.sync_flag = sync_flag;
@@ -1535,9 +1535,9 @@ int MPIDI_Win_unlock_all(MPID_Win * win_ptr)
else {
for (i = 0; i < win_ptr->comm_ptr->local_size; i++) {
if (win_ptr->comm_ptr->local_size <= win_ptr->num_slots)
- curr_target = win_ptr->slots[i].target_list;
+ curr_target = win_ptr->slots[i].target_list_head;
else {
- curr_target = win_ptr->slots[i % win_ptr->num_slots].target_list;
+ curr_target = win_ptr->slots[i % win_ptr->num_slots].target_list_head;
while (curr_target != NULL && curr_target->target_rank != i)
curr_target = curr_target->next;
}
@@ -1662,7 +1662,7 @@ int MPIDI_Win_flush_all(MPID_Win * win_ptr)
/* Set sync_flag in sync struct. */
for (i = 0; i < win_ptr->num_slots; i++) {
- curr_target = win_ptr->slots[i].target_list;
+ curr_target = win_ptr->slots[i].target_list_head;
while (curr_target != NULL) {
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
@@ -1756,7 +1756,7 @@ int MPIDI_Win_flush_local_all(MPID_Win * win_ptr)
/* Set sync_flag in sync struct. */
for (i = 0; i < win_ptr->num_slots; i++) {
- curr_target = win_ptr->slots[i].target_list;
+ curr_target = win_ptr->slots[i].target_list_head;
while (curr_target != NULL) {
if (curr_target->disable_flush_local) {
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
@@ -1788,7 +1788,7 @@ int MPIDI_Win_flush_local_all(MPID_Win * win_ptr)
* and wait for local completion for other targets */
do {
for (i = 0; i < win_ptr->num_slots; i++) {
- curr_target = win_ptr->slots[i].target_list;
+ curr_target = win_ptr->slots[i].target_list_head;
while (curr_target != NULL) {
mpi_errno = MPIDI_CH3I_RMA_Cleanup_ops_target(win_ptr, curr_target,
&local_completed, &remote_completed);
@@ -1825,7 +1825,7 @@ int MPIDI_Win_flush_local_all(MPID_Win * win_ptr)
finish_flush_local_all:
/* reset disable_flush_local flag in target to 0 */
for (i = 0; i < win_ptr->num_slots; i++) {
- curr_target = win_ptr->slots[i].target_list;
+ curr_target = win_ptr->slots[i].target_list_head;
while (curr_target != NULL) {
curr_target->disable_flush_local = 0;
curr_target = curr_target->next;
diff --git a/src/mpid/ch3/src/mpid_rma.c b/src/mpid/ch3/src/mpid_rma.c
index 5e86d3a..0c3892e 100644
--- a/src/mpid/ch3/src/mpid_rma.c
+++ b/src/mpid/ch3/src/mpid_rma.c
@@ -371,7 +371,7 @@ static int win_init(MPI_Aint size, int disp_unit, int create_flavor, int model,
MPIU_CHKPMEM_MALLOC((*win_ptr)->slots, MPIDI_RMA_Slot_t *,
sizeof(MPIDI_RMA_Slot_t) * (*win_ptr)->num_slots, mpi_errno, "RMA slots");
for (i = 0; i < (*win_ptr)->num_slots; i++) {
- (*win_ptr)->slots[i].target_list = NULL;
+ (*win_ptr)->slots[i].target_list_head = NULL;
(*win_ptr)->slots[i].target_list_tail = NULL;
}
http://git.mpich.org/mpich.git/commitdiff/299ede6e194bb0f7329511c83c3d0bf67…
commit 299ede6e194bb0f7329511c83c3d0bf671ced860
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Mon Mar 9 16:12:37 2015 -0700
Remove "is_dt" flag from op structure.
Originally we use is_dt flag stored in op structure
to track if derived datatypes are involved in the
current RMA operation. The flag is actually not
needed and we can directly check datatypes in the
current operation. Here we remove is_dt flag from
the op structure.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_oplist.h b/src/mpid/ch3/include/mpid_rma_oplist.h
index a0c513a..c644cdd 100644
--- a/src/mpid/ch3/include/mpid_rma_oplist.h
+++ b/src/mpid/ch3/include/mpid_rma_oplist.h
@@ -50,10 +50,12 @@ static inline MPIDI_RMA_Op_t *MPIDI_CH3I_Win_op_alloc(MPID_Win * win_ptr)
e->reqs = NULL;
e->reqs_size = 0;
e->ureq = NULL;
- e->is_dt = 0;
e->piggyback_lock_candidate = 0;
e->issued_stream_count = 0;
+ e->origin_datatype = MPI_DATATYPE_NULL;
+ e->result_datatype = MPI_DATATYPE_NULL;
+
return e;
}
diff --git a/src/mpid/ch3/include/mpid_rma_types.h b/src/mpid/ch3/include/mpid_rma_types.h
index 6d8f477..732e859 100644
--- a/src/mpid/ch3/include/mpid_rma_types.h
+++ b/src/mpid/ch3/include/mpid_rma_types.h
@@ -70,7 +70,6 @@ typedef struct MPIDI_RMA_Op {
MPIDI_CH3_Pkt_t pkt;
MPIDI_RMA_Pool_type_t pool_type;
- int is_dt;
int piggyback_lock_candidate;
int issued_stream_count; /* when >= 0, it specifies number of stream units that have been issued;
diff --git a/src/mpid/ch3/include/mpidrma.h b/src/mpid/ch3/include/mpidrma.h
index 3ddb28e..2eb7f70 100644
--- a/src/mpid/ch3/include/mpidrma.h
+++ b/src/mpid/ch3/include/mpidrma.h
@@ -640,9 +640,24 @@ static inline int adjust_op_piggybacked_with_lock(MPID_Win * win_ptr,
&(target->pending_op_list_tail), op);
}
else {
+ MPI_Datatype target_datatype;
+ int is_derived = FALSE;
+
MPIDI_CH3I_RMA_Ops_unlink(&(target->pending_op_list),
&(target->pending_op_list_tail), op);
- if (op->is_dt) {
+
+ MPIDI_CH3_PKT_RMA_GET_TARGET_DATATYPE(op->pkt, target_datatype, mpi_errno);
+
+ if ((target_datatype != MPI_DATATYPE_NULL &&
+ !MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) ||
+ (op->origin_datatype != MPI_DATATYPE_NULL &&
+ !MPIR_DATATYPE_IS_PREDEFINED(op->origin_datatype)) ||
+ (op->result_datatype != MPI_DATATYPE_NULL &&
+ !MPIR_DATATYPE_IS_PREDEFINED(op->result_datatype))) {
+ is_derived = TRUE;
+ }
+
+ if (is_derived) {
MPIDI_CH3I_RMA_Ops_append(&(target->dt_op_list),
&(target->dt_op_list_tail), op);
}
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index 9e9c70a..a8fd127 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -145,12 +145,10 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
if (!MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
MPID_Datatype_get_ptr(origin_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
MPID_Datatype_get_ptr(target_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- op_ptr->is_dt = 1;
}
MPID_Datatype_is_contig(origin_datatype, &is_origin_contig);
@@ -160,13 +158,15 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
MPIU_Assign_trunc(len, origin_count * origin_type_size, size_t);
/* Judge if we can use IMMED data packet */
- if (!op_ptr->is_dt && is_origin_contig && is_target_contig) {
+ if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype) && is_origin_contig && is_target_contig) {
if (len <= MPIDI_RMA_IMMED_BYTES)
use_immed_pkt = TRUE;
}
/* Judge if this operation is an piggyback candidate */
- if (!op_ptr->is_dt) {
+ if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for both origin and target data. We should extend this optimization to derived
* datatypes as well. */
@@ -336,12 +336,10 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
if (!MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
MPID_Datatype_get_ptr(origin_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
MPID_Datatype_get_ptr(target_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- op_ptr->is_dt = 1;
}
MPID_Datatype_is_contig(origin_datatype, &is_origin_contig);
@@ -351,13 +349,15 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
MPIU_Assign_trunc(len, target_count * target_type_size, size_t);
/* Judge if we can use IMMED data response packet */
- if (!op_ptr->is_dt && is_origin_contig && is_target_contig) {
+ if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype) && is_origin_contig && is_target_contig) {
if (len <= MPIDI_RMA_IMMED_BYTES)
use_immed_resp_pkt = TRUE;
}
/* Judge if this operation is an piggyback candidate. */
- if (!op_ptr->is_dt) {
+ if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for both origin and target data. We should extend this optimization to derived
* datatypes as well. */
@@ -518,11 +518,9 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
* reference counts */
if (!MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
MPID_Datatype_get_ptr(origin_datatype, origin_dtp);
- op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
MPID_Datatype_get_ptr(target_datatype, target_dtp);
- op_ptr->is_dt = 1;
}
MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
@@ -562,13 +560,15 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
MPID_Datatype_is_contig(target_datatype, &is_target_contig);
/* Judge if we can use IMMED data packet */
- if (!op_ptr->is_dt && is_origin_contig && is_target_contig) {
+ if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype) && is_origin_contig && is_target_contig) {
if (len <= MPIDI_RMA_IMMED_BYTES)
use_immed_pkt = TRUE;
}
/* Judge if this operation is an piggyback candidate. */
- if (!op_ptr->is_dt) {
+ if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for both origin and target data. We should extend this optimization to derived
* datatypes as well. */
@@ -746,12 +746,10 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
if (!MPIR_DATATYPE_IS_PREDEFINED(result_datatype)) {
MPID_Datatype_get_ptr(result_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
MPID_Datatype_get_ptr(target_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- op_ptr->is_dt = 1;
}
MPID_Datatype_get_size_macro(target_datatype, target_type_size);
@@ -761,13 +759,16 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPID_Datatype_is_contig(target_datatype, &is_target_contig);
/* Judge if we can use IMMED data response packet */
- if (!op_ptr->is_dt && is_result_contig && is_target_contig) {
+ if (MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype) &&
+ is_result_contig && is_target_contig) {
if (len <= MPIDI_RMA_IMMED_BYTES)
use_immed_resp_pkt = TRUE;
}
/* Judge if this operation is a piggyback candidate */
- if (!op_ptr->is_dt) {
+ if (MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for both origin and target data. We should extend this optimization to derived
* datatypes as well. */
@@ -817,15 +818,12 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
* reference counts */
if (!MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
MPID_Datatype_get_ptr(origin_datatype, origin_dtp);
- op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(result_datatype)) {
MPID_Datatype_get_ptr(result_datatype, target_dtp);
- op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
MPID_Datatype_get_ptr(target_datatype, result_dtp);
- op_ptr->is_dt = 1;
}
MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
@@ -869,13 +867,18 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPID_Datatype_is_contig(result_datatype, &is_result_contig);
/* Judge if we can use IMMED data packet */
- if (!op_ptr->is_dt && is_origin_contig && is_target_contig && is_result_contig) {
+ if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype) &&
+ is_origin_contig && is_target_contig && is_result_contig) {
if (orig_len <= MPIDI_RMA_IMMED_BYTES)
use_immed_pkt = TRUE;
}
/* Judge if this operation is a piggyback candidate */
- if (!op_ptr->is_dt) {
+ if (MPIR_DATATYPE_IS_PREDEFINED(origin_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(result_datatype) &&
+ MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for origin, target and result data. We should extend this optimization to derived
* datatypes as well. */
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index 901c190..825452c 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -409,11 +409,26 @@ static inline int issue_ops_target(MPID_Win * win_ptr, MPIDI_RMA_Target_t * targ
&(target->pending_op_list_tail), curr_op);
}
else {
+ MPI_Datatype target_datatype;
+ int is_derived = FALSE;
+
/* Sending is not completed immediately. */
MPIDI_CH3I_RMA_Ops_unlink(&(target->pending_op_list),
&(target->pending_op_list_tail), curr_op);
- if (curr_op->is_dt) {
+
+ MPIDI_CH3_PKT_RMA_GET_TARGET_DATATYPE(curr_op->pkt, target_datatype, mpi_errno);
+
+ if ((target_datatype != MPI_DATATYPE_NULL &&
+ !MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) ||
+ (curr_op->origin_datatype != MPI_DATATYPE_NULL &&
+ !MPIR_DATATYPE_IS_PREDEFINED(curr_op->origin_datatype)) ||
+ (curr_op->result_datatype != MPI_DATATYPE_NULL &&
+ !MPIR_DATATYPE_IS_PREDEFINED(curr_op->result_datatype))) {
+ is_derived = TRUE;
+ }
+
+ if (is_derived) {
MPIDI_CH3I_RMA_Ops_append(&(target->dt_op_list),
&(target->dt_op_list_tail), curr_op);
}
http://git.mpich.org/mpich.git/commitdiff/35a05b3ca1e0cc60b1d1d607f408e0ab1…
commit 35a05b3ca1e0cc60b1d1d607f408e0ab1e1f9ced
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Mon Mar 9 15:33:42 2015 -0700
Remove unused have_remote_incomplete_ops.
have_remote_incomplete_ops is not actually used
in the code, we remove it here.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_oplist.h b/src/mpid/ch3/include/mpid_rma_oplist.h
index e04a742..a0c513a 100644
--- a/src/mpid/ch3/include/mpid_rma_oplist.h
+++ b/src/mpid/ch3/include/mpid_rma_oplist.h
@@ -126,9 +126,7 @@ static inline MPIDI_RMA_Target_t *MPIDI_CH3I_Win_target_alloc(MPID_Win * win_ptr
e->sync.sync_flag = MPIDI_RMA_SYNC_NONE;
e->sync.outstanding_acks = 0;
- e->sync.have_remote_incomplete_ops = 1; /* When I create a new target, there must be
- * incomplete ops until a FLUSH/UNLOCK packet
- * is sent. */
+
return e;
}
@@ -459,8 +457,7 @@ static inline int MPIDI_CH3I_RMA_Cleanup_ops_target(MPID_Win * win_ptr, MPIDI_RM
/* for the conditions that need to be satisfied before we free the
* target, see the MPIDI_RMA_Target definition in
* mpid_rma_types.h */
- if (target->sync.sync_flag == MPIDI_RMA_SYNC_NONE &&
- target->sync.outstanding_acks == 0 && target->sync.have_remote_incomplete_ops == 0) {
+ if (target->sync.sync_flag == MPIDI_RMA_SYNC_NONE && target->sync.outstanding_acks == 0) {
(*remote_completed) = 1;
}
}
diff --git a/src/mpid/ch3/include/mpid_rma_types.h b/src/mpid/ch3/include/mpid_rma_types.h
index be0e869..6d8f477 100644
--- a/src/mpid/ch3/include/mpid_rma_types.h
+++ b/src/mpid/ch3/include/mpid_rma_types.h
@@ -100,7 +100,6 @@ typedef struct MPIDI_RMA_Target {
* following conditions hold true:
* - No operations are queued up (op_list == NULL)
* - There are no outstanding acks (outstanding_acks == 0)
- * - There are no incomplete ops (have_remote_incomplete_ops == 0)
* - There are no sync messages to be sent (sync_flag == NONE)
*/
struct {
@@ -110,12 +109,6 @@ typedef struct MPIDI_RMA_Target {
/* packets sent out that we are expecting an ack for */
int outstanding_acks;
-
- /* if we sent out any operations, but have not waited for
- * their remote completion, this flag is set. When the next
- * FLUSH or UNLOCK sync flag is set, we will clear this
- * variable. */
- int have_remote_incomplete_ops; /* have ops that have not completed remotely */
} sync;
MPIDI_RMA_Pool_type_t pool_type;
diff --git a/src/mpid/ch3/src/ch3u_rma_progress.c b/src/mpid/ch3/src/ch3u_rma_progress.c
index de3c0d2..901c190 100644
--- a/src/mpid/ch3/src/ch3u_rma_progress.c
+++ b/src/mpid/ch3/src/ch3u_rma_progress.c
@@ -715,7 +715,6 @@ int MPIDI_CH3I_RMA_Cleanup_target_aggressive(MPID_Win * win_ptr, MPIDI_RMA_Targe
curr_target = win_ptr->slots[i].target_list;
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- curr_target->sync.have_remote_incomplete_ops = 0;
curr_target->sync.outstanding_acks++;
}
diff --git a/src/mpid/ch3/src/ch3u_rma_sync.c b/src/mpid/ch3/src/ch3u_rma_sync.c
index 94de1c1..9dad49a 100644
--- a/src/mpid/ch3/src/ch3u_rma_sync.c
+++ b/src/mpid/ch3/src/ch3u_rma_sync.c
@@ -374,7 +374,6 @@ int MPIDI_Win_fence(int assert, MPID_Win * win_ptr)
/* set sync_flag in sync struct */
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- curr_target->sync.have_remote_incomplete_ops = 0;
curr_target->sync.outstanding_acks++;
}
curr_target = curr_target->next;
@@ -754,7 +753,6 @@ int MPIDI_Win_complete(MPID_Win * win_ptr)
/* set sync_flag in sync struct */
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- curr_target->sync.have_remote_incomplete_ops = 0;
curr_target->sync.outstanding_acks++;
}
curr_target->win_complete_flag = 1;
@@ -1090,7 +1088,6 @@ int MPIDI_Win_unlock(int dest, MPID_Win * win_ptr)
sync_flag = MPIDI_RMA_SYNC_UNLOCK;
if (target->sync.sync_flag < sync_flag) {
target->sync.sync_flag = sync_flag;
- target->sync.have_remote_incomplete_ops = 0;
target->sync.outstanding_acks++;
}
@@ -1211,7 +1208,6 @@ int MPIDI_Win_flush(int dest, MPID_Win * win_ptr)
/* Set sync_flag in sync struct. */
if (target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- target->sync.have_remote_incomplete_ops = 0;
target->sync.outstanding_acks++;
}
@@ -1318,7 +1314,6 @@ int MPIDI_Win_flush_local(int dest, MPID_Win * win_ptr)
if (target->disable_flush_local) {
if (target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- target->sync.have_remote_incomplete_ops = 0;
target->sync.outstanding_acks++;
}
}
@@ -1531,7 +1526,6 @@ int MPIDI_Win_unlock_all(MPID_Win * win_ptr)
while (curr_target != NULL) {
if (curr_target->sync.sync_flag < sync_flag) {
curr_target->sync.sync_flag = sync_flag;
- curr_target->sync.have_remote_incomplete_ops = 0;
curr_target->sync.outstanding_acks++;
}
curr_target = curr_target->next;
@@ -1551,7 +1545,6 @@ int MPIDI_Win_unlock_all(MPID_Win * win_ptr)
if (curr_target != NULL) {
if (curr_target->sync.sync_flag < sync_flag) {
curr_target->sync.sync_flag = sync_flag;
- curr_target->sync.have_remote_incomplete_ops = 0;
curr_target->sync.outstanding_acks++;
}
}
@@ -1673,7 +1666,6 @@ int MPIDI_Win_flush_all(MPID_Win * win_ptr)
while (curr_target != NULL) {
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- curr_target->sync.have_remote_incomplete_ops = 0;
curr_target->sync.outstanding_acks++;
}
@@ -1769,7 +1761,6 @@ int MPIDI_Win_flush_local_all(MPID_Win * win_ptr)
if (curr_target->disable_flush_local) {
if (curr_target->sync.sync_flag < MPIDI_RMA_SYNC_FLUSH) {
curr_target->sync.sync_flag = MPIDI_RMA_SYNC_FLUSH;
- curr_target->sync.have_remote_incomplete_ops = 0;
curr_target->sync.outstanding_acks++;
}
disable_flush_local_cnt++;
http://git.mpich.org/mpich.git/commitdiff/98c791a6cfbc87698d4304ebdcb994b4c…
commit 98c791a6cfbc87698d4304ebdcb994b4c212fba1
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Mon Mar 9 15:30:26 2015 -0700
Simplify code: delete unncessary calculation in IMMED length.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index f1d9725..9e9c70a 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -118,7 +118,7 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
MPIDI_RMA_Op_t *op_ptr = NULL;
MPIDI_CH3_Pkt_put_t *put_pkt = NULL;
MPI_Aint origin_type_size;
- size_t immed_len, len;
+ size_t len;
int use_immed_pkt = FALSE;
int is_origin_contig, is_target_contig;
@@ -161,10 +161,7 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
/* Judge if we can use IMMED data packet */
if (!op_ptr->is_dt && is_origin_contig && is_target_contig) {
- MPIU_Assign_trunc(immed_len,
- (MPIDI_RMA_IMMED_BYTES / origin_type_size) * origin_type_size,
- size_t);
- if (len <= immed_len)
+ if (len <= MPIDI_RMA_IMMED_BYTES)
use_immed_pkt = TRUE;
}
@@ -312,7 +309,7 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
MPIDI_RMA_Op_t *op_ptr = NULL;
MPIDI_CH3_Pkt_get_t *get_pkt = NULL;
MPI_Aint target_type_size;
- size_t immed_len, len;
+ size_t len;
int use_immed_resp_pkt = FALSE;
int is_origin_contig, is_target_contig;
@@ -355,10 +352,7 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
/* Judge if we can use IMMED data response packet */
if (!op_ptr->is_dt && is_origin_contig && is_target_contig) {
- MPIU_Assign_trunc(immed_len,
- (MPIDI_RMA_IMMED_BYTES / target_type_size) * target_type_size,
- size_t);
- if (len <= immed_len)
+ if (len <= MPIDI_RMA_IMMED_BYTES)
use_immed_resp_pkt = TRUE;
}
@@ -495,7 +489,7 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
MPIDI_RMA_Op_t *op_ptr = NULL;
MPIDI_CH3_Pkt_accum_t *accum_pkt = NULL;
MPI_Aint origin_type_size;
- size_t immed_len, len;
+ size_t len;
int use_immed_pkt = FALSE;
int is_origin_contig, is_target_contig;
MPI_Aint stream_elem_count, stream_unit_count;
@@ -569,10 +563,7 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
/* Judge if we can use IMMED data packet */
if (!op_ptr->is_dt && is_origin_contig && is_target_contig) {
- MPIU_Assign_trunc(immed_len,
- (MPIDI_RMA_IMMED_BYTES / origin_type_size) * origin_type_size,
- size_t);
- if (len <= immed_len)
+ if (len <= MPIDI_RMA_IMMED_BYTES)
use_immed_pkt = TRUE;
}
@@ -738,7 +729,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
/* Convert GAcc to a Get */
MPIDI_CH3_Pkt_get_t *get_pkt;
MPI_Aint target_type_size;
- size_t len, immed_len;
+ size_t len;
int use_immed_resp_pkt = FALSE;
int is_result_contig, is_target_contig;
@@ -771,10 +762,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
/* Judge if we can use IMMED data response packet */
if (!op_ptr->is_dt && is_result_contig && is_target_contig) {
- MPIU_Assign_trunc(immed_len,
- (MPIDI_RMA_IMMED_BYTES / target_type_size) * target_type_size,
- size_t);
- if (len <= immed_len)
+ if (len <= MPIDI_RMA_IMMED_BYTES)
use_immed_resp_pkt = TRUE;
}
@@ -804,7 +792,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
else {
MPIDI_CH3_Pkt_get_accum_t *get_accum_pkt;
MPI_Aint origin_type_size;
- size_t immed_len, orig_len;
+ size_t orig_len;
int use_immed_pkt = FALSE;
int is_origin_contig, is_target_contig, is_result_contig;
MPI_Aint stream_elem_count, stream_unit_count;
@@ -882,10 +870,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
/* Judge if we can use IMMED data packet */
if (!op_ptr->is_dt && is_origin_contig && is_target_contig && is_result_contig) {
- MPIU_Assign_trunc(immed_len,
- (MPIDI_RMA_IMMED_BYTES / origin_type_size) * origin_type_size,
- size_t);
- if (orig_len <= immed_len)
+ if (orig_len <= MPIDI_RMA_IMMED_BYTES)
use_immed_pkt = TRUE;
}
@@ -1293,7 +1278,6 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
/* Convert FOP to a Get */
MPIDI_CH3_Pkt_get_t *get_pkt;
MPI_Aint target_type_size;
- size_t immed_len;
int use_immed_resp_pkt = FALSE;
int is_contig;
@@ -1314,10 +1298,7 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
if (is_contig) {
/* Judege if we can use IMMED data for response packet */
- MPIU_Assign_trunc(immed_len,
- (MPIDI_RMA_IMMED_BYTES / target_type_size) * target_type_size,
- size_t);
- if (target_type_size <= immed_len)
+ if (target_type_size <= MPIDI_RMA_IMMED_BYTES)
use_immed_resp_pkt = TRUE;
}
@@ -1336,7 +1317,6 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
else {
MPIDI_CH3_Pkt_fop_t *fop_pkt;
MPI_Aint type_size;
- size_t immed_len;
int use_immed_pkt = FALSE;
int is_contig;
@@ -1359,9 +1339,7 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
if (is_contig) {
/* Judge if we can use IMMED data packet */
- MPIU_Assign_trunc(immed_len,
- (MPIDI_RMA_IMMED_BYTES / type_size) * type_size, size_t);
- if (type_size <= immed_len) {
+ if (type_size <= MPIDI_RMA_IMMED_BYTES) {
use_immed_pkt = TRUE;
}
}
http://git.mpich.org/mpich.git/commitdiff/6ee07af463b5de7fd11e9b94fc18ed5cd…
commit 6ee07af463b5de7fd11e9b94fc18ed5cd595a4dc
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Mon Mar 9 15:23:27 2015 -0700
Simplify code: use MPIDI_CH3U_Request_complete to complete user request.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/include/mpid_rma_issue.h b/src/mpid/ch3/include/mpid_rma_issue.h
index f530a24..6069ffc 100644
--- a/src/mpid/ch3/include/mpid_rma_issue.h
+++ b/src/mpid/ch3/include/mpid_rma_issue.h
@@ -1298,8 +1298,7 @@ static inline int set_user_req_after_issuing_op(MPIDI_RMA_Op_t * op)
* and release ch3 ref. */
/* Complete user request and release the ch3 ref */
- MPID_Request_set_completed(op->ureq);
- MPID_Request_release(op->ureq);
+ MPIDI_CH3U_Request_complete(op->ureq);
}
else {
/* Sending is not completed immediately. */
@@ -1344,8 +1343,7 @@ static inline int set_user_req_after_issuing_op(MPIDI_RMA_Op_t * op)
else {
/* all requests are completed */
/* Complete user request and release ch3 ref */
- MPID_Request_set_completed(op->ureq);
- MPID_Request_release(op->ureq);
+ MPIDI_CH3U_Request_complete(op->ureq);
op->ureq = NULL;
}
}
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index ded1f1a..f1d9725 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -111,8 +111,7 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
if (ureq) {
/* Complete user request and release the ch3 ref */
- MPID_Request_set_completed(ureq);
- MPID_Request_release(ureq);
+ MPIDI_CH3U_Request_complete(ureq);
}
}
else {
@@ -306,8 +305,7 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
if (ureq) {
/* Complete user request and release the ch3 ref */
- MPID_Request_set_completed(ureq);
- MPID_Request_release(ureq);
+ MPIDI_CH3U_Request_complete(ureq);
}
}
else {
@@ -490,8 +488,7 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
if (ureq) {
/* Complete user request and release the ch3 ref */
- MPID_Request_set_completed(ureq);
- MPID_Request_release(ureq);
+ MPIDI_CH3U_Request_complete(ureq);
}
}
else {
@@ -722,8 +719,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
if (ureq) {
/* Complete user request and release the ch3 ref */
- MPID_Request_set_completed(ureq);
- MPID_Request_release(ureq);
+ MPIDI_CH3U_Request_complete(ureq);
}
}
else {
http://git.mpich.org/mpich.git/commitdiff/6394c667ff22fed27bf0765c558e787a4…
commit 6394c667ff22fed27bf0765c558e787a49ac66f8
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Mon Mar 9 15:19:34 2015 -0700
Delete useless IF branch.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index 3a78163..ded1f1a 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -139,9 +139,7 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
op_ptr->target_rank = target_rank;
/* Remember user request */
- if (ureq) {
- op_ptr->ureq = ureq;
- }
+ op_ptr->ureq = ureq;
/* if source or target datatypes are derived, increment their
* reference counts */
@@ -336,9 +334,7 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
op_ptr->target_rank = target_rank;
/* Remember user request */
- if (ureq) {
- op_ptr->ureq = ureq;
- }
+ op_ptr->ureq = ureq;
/* if source or target datatypes are derived, increment their
* reference counts */
@@ -525,9 +521,7 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
op_ptr->target_rank = target_rank;
/* Remember user request */
- if (ureq) {
- op_ptr->ureq = ureq;
- }
+ op_ptr->ureq = ureq;
/* if source or target datatypes are derived, increment their
* reference counts */
@@ -760,9 +754,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
op_ptr->target_rank = target_rank;
/* Remember user request */
- if (ureq) {
- op_ptr->ureq = ureq;
- }
+ op_ptr->ureq = ureq;
if (!MPIR_DATATYPE_IS_PREDEFINED(result_datatype)) {
MPID_Datatype_get_ptr(result_datatype, dtp);
@@ -835,9 +827,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
op_ptr->target_rank = target_rank;
/* Remember user request */
- if (ureq) {
- op_ptr->ureq = ureq;
- }
+ op_ptr->ureq = ureq;
/* if source or target datatypes are derived, increment their
* reference counts */
http://git.mpich.org/mpich.git/commitdiff/86bb183473bb67c63a22c1b6e16d96d88…
commit 86bb183473bb67c63a22c1b6e16d96d88581159f
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Fri May 15 14:33:01 2015 -0500
Change op pointer name 'new_ptr' to 'op_ptr'.
Originally 'new_ptr' is used for pointer to RMA operation.
Here we change it from 'new_ptr' to 'op_ptr' to make the
name clearer.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index 424ad1e..3a78163 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -116,7 +116,7 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
}
}
else {
- MPIDI_RMA_Op_t *new_ptr = NULL;
+ MPIDI_RMA_Op_t *op_ptr = NULL;
MPIDI_CH3_Pkt_put_t *put_pkt = NULL;
MPI_Aint origin_type_size;
size_t immed_len, len;
@@ -124,7 +124,7 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
int is_origin_contig, is_target_contig;
/* queue it up */
- mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &op_ptr);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
@@ -133,14 +133,14 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
/******************** Setting operation struct areas ***********************/
/* FIXME: For contig and very short operations, use a streamlined op */
- new_ptr->origin_addr = (void *) origin_addr;
- new_ptr->origin_count = origin_count;
- new_ptr->origin_datatype = origin_datatype;
- new_ptr->target_rank = target_rank;
+ op_ptr->origin_addr = (void *) origin_addr;
+ op_ptr->origin_count = origin_count;
+ op_ptr->origin_datatype = origin_datatype;
+ op_ptr->target_rank = target_rank;
/* Remember user request */
if (ureq) {
- new_ptr->ureq = ureq;
+ op_ptr->ureq = ureq;
}
/* if source or target datatypes are derived, increment their
@@ -148,12 +148,12 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
if (!MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
MPID_Datatype_get_ptr(origin_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- new_ptr->is_dt = 1;
+ op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
MPID_Datatype_get_ptr(target_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- new_ptr->is_dt = 1;
+ op_ptr->is_dt = 1;
}
MPID_Datatype_is_contig(origin_datatype, &is_origin_contig);
@@ -163,7 +163,7 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
MPIU_Assign_trunc(len, origin_count * origin_type_size, size_t);
/* Judge if we can use IMMED data packet */
- if (!new_ptr->is_dt && is_origin_contig && is_target_contig) {
+ if (!op_ptr->is_dt && is_origin_contig && is_target_contig) {
MPIU_Assign_trunc(immed_len,
(MPIDI_RMA_IMMED_BYTES / origin_type_size) * origin_type_size,
size_t);
@@ -172,17 +172,17 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
}
/* Judge if this operation is an piggyback candidate */
- if (!new_ptr->is_dt) {
+ if (!op_ptr->is_dt) {
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for both origin and target data. We should extend this optimization to derived
* datatypes as well. */
if (len <= MPIR_CVAR_CH3_RMA_OP_PIGGYBACK_LOCK_DATA_SIZE)
- new_ptr->piggyback_lock_candidate = 1;
+ op_ptr->piggyback_lock_candidate = 1;
}
/************** Setting packet struct areas in operation ****************/
- put_pkt = &(new_ptr->pkt.put);
+ put_pkt = &(op_ptr->pkt.put);
if (use_immed_pkt) {
MPIDI_Pkt_init(put_pkt, MPIDI_CH3_PKT_PUT_IMMED);
@@ -208,7 +208,7 @@ int MPIDI_CH3I_Put(const void *origin_addr, int origin_count, MPI_Datatype
MPIR_T_PVAR_TIMER_END(RMA, rma_rmaqueue_set);
- mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, op_ptr);
if (mpi_errno)
MPIU_ERR_POP(mpi_errno);
@@ -313,7 +313,7 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
}
}
else {
- MPIDI_RMA_Op_t *new_ptr = NULL;
+ MPIDI_RMA_Op_t *op_ptr = NULL;
MPIDI_CH3_Pkt_get_t *get_pkt = NULL;
MPI_Aint target_type_size;
size_t immed_len, len;
@@ -321,7 +321,7 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
int is_origin_contig, is_target_contig;
/* queue it up */
- mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &op_ptr);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
@@ -330,14 +330,14 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
/******************** Setting operation struct areas ***********************/
/* FIXME: For contig and very short operations, use a streamlined op */
- new_ptr->origin_addr = origin_addr;
- new_ptr->origin_count = origin_count;
- new_ptr->origin_datatype = origin_datatype;
- new_ptr->target_rank = target_rank;
+ op_ptr->origin_addr = origin_addr;
+ op_ptr->origin_count = origin_count;
+ op_ptr->origin_datatype = origin_datatype;
+ op_ptr->target_rank = target_rank;
/* Remember user request */
if (ureq) {
- new_ptr->ureq = ureq;
+ op_ptr->ureq = ureq;
}
/* if source or target datatypes are derived, increment their
@@ -345,12 +345,12 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
if (!MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
MPID_Datatype_get_ptr(origin_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- new_ptr->is_dt = 1;
+ op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
MPID_Datatype_get_ptr(target_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- new_ptr->is_dt = 1;
+ op_ptr->is_dt = 1;
}
MPID_Datatype_is_contig(origin_datatype, &is_origin_contig);
@@ -360,7 +360,7 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
MPIU_Assign_trunc(len, target_count * target_type_size, size_t);
/* Judge if we can use IMMED data response packet */
- if (!new_ptr->is_dt && is_origin_contig && is_target_contig) {
+ if (!op_ptr->is_dt && is_origin_contig && is_target_contig) {
MPIU_Assign_trunc(immed_len,
(MPIDI_RMA_IMMED_BYTES / target_type_size) * target_type_size,
size_t);
@@ -369,16 +369,16 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
}
/* Judge if this operation is an piggyback candidate. */
- if (!new_ptr->is_dt) {
+ if (!op_ptr->is_dt) {
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for both origin and target data. We should extend this optimization to derived
* datatypes as well. */
- new_ptr->piggyback_lock_candidate = 1;
+ op_ptr->piggyback_lock_candidate = 1;
}
/************** Setting packet struct areas in operation ****************/
- get_pkt = &(new_ptr->pkt.get);
+ get_pkt = &(op_ptr->pkt.get);
MPIDI_Pkt_init(get_pkt, MPIDI_CH3_PKT_GET);
get_pkt->addr = (char *) win_ptr->basic_info_table[target_rank].base_addr +
win_ptr->basic_info_table[target_rank].disp_unit * target_disp;
@@ -392,7 +392,7 @@ int MPIDI_CH3I_Get(void *origin_addr, int origin_count, MPI_Datatype
MPIR_T_PVAR_TIMER_END(RMA, rma_rmaqueue_set);
- mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, op_ptr);
if (mpi_errno)
MPIU_ERR_POP(mpi_errno);
@@ -499,7 +499,7 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
}
}
else {
- MPIDI_RMA_Op_t *new_ptr = NULL;
+ MPIDI_RMA_Op_t *op_ptr = NULL;
MPIDI_CH3_Pkt_accum_t *accum_pkt = NULL;
MPI_Aint origin_type_size;
size_t immed_len, len;
@@ -511,7 +511,7 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
int i;
/* queue it up */
- mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &op_ptr);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
@@ -519,25 +519,25 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
/******************** Setting operation struct areas ***********************/
- new_ptr->origin_addr = (void *) origin_addr;
- new_ptr->origin_count = origin_count;
- new_ptr->origin_datatype = origin_datatype;
- new_ptr->target_rank = target_rank;
+ op_ptr->origin_addr = (void *) origin_addr;
+ op_ptr->origin_count = origin_count;
+ op_ptr->origin_datatype = origin_datatype;
+ op_ptr->target_rank = target_rank;
/* Remember user request */
if (ureq) {
- new_ptr->ureq = ureq;
+ op_ptr->ureq = ureq;
}
/* if source or target datatypes are derived, increment their
* reference counts */
if (!MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
MPID_Datatype_get_ptr(origin_datatype, origin_dtp);
- new_ptr->is_dt = 1;
+ op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
MPID_Datatype_get_ptr(target_datatype, target_dtp);
- new_ptr->is_dt = 1;
+ op_ptr->is_dt = 1;
}
MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
@@ -577,7 +577,7 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
MPID_Datatype_is_contig(target_datatype, &is_target_contig);
/* Judge if we can use IMMED data packet */
- if (!new_ptr->is_dt && is_origin_contig && is_target_contig) {
+ if (!op_ptr->is_dt && is_origin_contig && is_target_contig) {
MPIU_Assign_trunc(immed_len,
(MPIDI_RMA_IMMED_BYTES / origin_type_size) * origin_type_size,
size_t);
@@ -586,17 +586,17 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
}
/* Judge if this operation is an piggyback candidate. */
- if (!new_ptr->is_dt) {
+ if (!op_ptr->is_dt) {
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for both origin and target data. We should extend this optimization to derived
* datatypes as well. */
if (len <= MPIR_CVAR_CH3_RMA_OP_PIGGYBACK_LOCK_DATA_SIZE)
- new_ptr->piggyback_lock_candidate = 1;
+ op_ptr->piggyback_lock_candidate = 1;
}
/************** Setting packet struct areas in operation ****************/
- accum_pkt = &(new_ptr->pkt.accum);
+ accum_pkt = &(op_ptr->pkt.accum);
if (use_immed_pkt) {
MPIDI_Pkt_init(accum_pkt, MPIDI_CH3_PKT_ACCUMULATE_IMMED);
@@ -623,7 +623,7 @@ int MPIDI_CH3I_Accumulate(const void *origin_addr, int origin_count, MPI_Datatyp
MPIR_T_PVAR_TIMER_END(RMA, rma_rmaqueue_set);
- mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, op_ptr);
if (mpi_errno)
MPIU_ERR_POP(mpi_errno);
@@ -733,10 +733,10 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
}
}
else {
- MPIDI_RMA_Op_t *new_ptr = NULL;
+ MPIDI_RMA_Op_t *op_ptr = NULL;
/* Append the operation to the window's RMA ops queue */
- mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &op_ptr);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
@@ -754,25 +754,25 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
/******************** Setting operation struct areas ***********************/
- new_ptr->origin_addr = result_addr;
- new_ptr->origin_count = result_count;
- new_ptr->origin_datatype = result_datatype;
- new_ptr->target_rank = target_rank;
+ op_ptr->origin_addr = result_addr;
+ op_ptr->origin_count = result_count;
+ op_ptr->origin_datatype = result_datatype;
+ op_ptr->target_rank = target_rank;
/* Remember user request */
if (ureq) {
- new_ptr->ureq = ureq;
+ op_ptr->ureq = ureq;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(result_datatype)) {
MPID_Datatype_get_ptr(result_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- new_ptr->is_dt = 1;
+ op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
MPID_Datatype_get_ptr(target_datatype, dtp);
MPID_Datatype_add_ref(dtp);
- new_ptr->is_dt = 1;
+ op_ptr->is_dt = 1;
}
MPID_Datatype_get_size_macro(target_datatype, target_type_size);
@@ -782,7 +782,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPID_Datatype_is_contig(target_datatype, &is_target_contig);
/* Judge if we can use IMMED data response packet */
- if (!new_ptr->is_dt && is_result_contig && is_target_contig) {
+ if (!op_ptr->is_dt && is_result_contig && is_target_contig) {
MPIU_Assign_trunc(immed_len,
(MPIDI_RMA_IMMED_BYTES / target_type_size) * target_type_size,
size_t);
@@ -791,16 +791,16 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
}
/* Judge if this operation is a piggyback candidate */
- if (!new_ptr->is_dt) {
+ if (!op_ptr->is_dt) {
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for both origin and target data. We should extend this optimization to derived
* datatypes as well. */
- new_ptr->piggyback_lock_candidate = 1;
+ op_ptr->piggyback_lock_candidate = 1;
}
/************** Setting packet struct areas in operation ****************/
- get_pkt = &(new_ptr->pkt.get);
+ get_pkt = &(op_ptr->pkt.get);
MPIDI_Pkt_init(get_pkt, MPIDI_CH3_PKT_GET);
get_pkt->addr = (char *) win_ptr->basic_info_table[target_rank].base_addr +
win_ptr->basic_info_table[target_rank].disp_unit * target_disp;
@@ -826,32 +826,32 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
/******************** Setting operation struct areas ***********************/
- new_ptr->origin_addr = (void *) origin_addr;
- new_ptr->origin_count = origin_count;
- new_ptr->origin_datatype = origin_datatype;
- new_ptr->result_addr = result_addr;
- new_ptr->result_count = result_count;
- new_ptr->result_datatype = result_datatype;
- new_ptr->target_rank = target_rank;
+ op_ptr->origin_addr = (void *) origin_addr;
+ op_ptr->origin_count = origin_count;
+ op_ptr->origin_datatype = origin_datatype;
+ op_ptr->result_addr = result_addr;
+ op_ptr->result_count = result_count;
+ op_ptr->result_datatype = result_datatype;
+ op_ptr->target_rank = target_rank;
/* Remember user request */
if (ureq) {
- new_ptr->ureq = ureq;
+ op_ptr->ureq = ureq;
}
/* if source or target datatypes are derived, increment their
* reference counts */
if (!MPIR_DATATYPE_IS_PREDEFINED(origin_datatype)) {
MPID_Datatype_get_ptr(origin_datatype, origin_dtp);
- new_ptr->is_dt = 1;
+ op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(result_datatype)) {
MPID_Datatype_get_ptr(result_datatype, target_dtp);
- new_ptr->is_dt = 1;
+ op_ptr->is_dt = 1;
}
if (!MPIR_DATATYPE_IS_PREDEFINED(target_datatype)) {
MPID_Datatype_get_ptr(target_datatype, result_dtp);
- new_ptr->is_dt = 1;
+ op_ptr->is_dt = 1;
}
MPID_Datatype_get_size_macro(origin_datatype, origin_type_size);
@@ -895,7 +895,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPID_Datatype_is_contig(result_datatype, &is_result_contig);
/* Judge if we can use IMMED data packet */
- if (!new_ptr->is_dt && is_origin_contig && is_target_contig && is_result_contig) {
+ if (!op_ptr->is_dt && is_origin_contig && is_target_contig && is_result_contig) {
MPIU_Assign_trunc(immed_len,
(MPIDI_RMA_IMMED_BYTES / origin_type_size) * origin_type_size,
size_t);
@@ -904,17 +904,17 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
}
/* Judge if this operation is a piggyback candidate */
- if (!new_ptr->is_dt) {
+ if (!op_ptr->is_dt) {
/* FIXME: currently we only piggyback LOCK flag with op using predefined datatypes
* for origin, target and result data. We should extend this optimization to derived
* datatypes as well. */
if (orig_len <= MPIR_CVAR_CH3_RMA_OP_PIGGYBACK_LOCK_DATA_SIZE)
- new_ptr->piggyback_lock_candidate = 1;
+ op_ptr->piggyback_lock_candidate = 1;
}
/************** Setting packet struct areas in operation ****************/
- get_accum_pkt = &(new_ptr->pkt.get_accum);
+ get_accum_pkt = &(op_ptr->pkt.get_accum);
if (use_immed_pkt) {
MPIDI_Pkt_init(get_accum_pkt, MPIDI_CH3_PKT_GET_ACCUM_IMMED);
@@ -941,7 +941,7 @@ int MPIDI_CH3I_Get_accumulate(const void *origin_addr, int origin_count,
MPIR_T_PVAR_TIMER_END(RMA, rma_rmaqueue_set);
- mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, op_ptr);
if (mpi_errno)
MPIU_ERR_POP(mpi_errno);
@@ -1149,13 +1149,13 @@ int MPIDI_Compare_and_swap(const void *origin_addr, const void *compare_addr,
MPIU_ERR_POP(mpi_errno);
}
else {
- MPIDI_RMA_Op_t *new_ptr = NULL;
+ MPIDI_RMA_Op_t *op_ptr = NULL;
MPIDI_CH3_Pkt_cas_t *cas_pkt = NULL;
MPI_Aint type_size;
void *src = NULL, *dest = NULL;
/* Append this operation to the RMA ops queue */
- mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &op_ptr);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
@@ -1163,19 +1163,19 @@ int MPIDI_Compare_and_swap(const void *origin_addr, const void *compare_addr,
/******************** Setting operation struct areas ***********************/
- new_ptr->origin_addr = (void *) origin_addr;
- new_ptr->origin_count = 1;
- new_ptr->origin_datatype = datatype;
- new_ptr->result_addr = result_addr;
- new_ptr->result_datatype = datatype;
- new_ptr->compare_addr = (void *) compare_addr;
- new_ptr->compare_datatype = datatype;
- new_ptr->target_rank = target_rank;
- new_ptr->piggyback_lock_candidate = 1; /* CAS is always able to piggyback LOCK */
+ op_ptr->origin_addr = (void *) origin_addr;
+ op_ptr->origin_count = 1;
+ op_ptr->origin_datatype = datatype;
+ op_ptr->result_addr = result_addr;
+ op_ptr->result_datatype = datatype;
+ op_ptr->compare_addr = (void *) compare_addr;
+ op_ptr->compare_datatype = datatype;
+ op_ptr->target_rank = target_rank;
+ op_ptr->piggyback_lock_candidate = 1; /* CAS is always able to piggyback LOCK */
/************** Setting packet struct areas in operation ****************/
- cas_pkt = &(new_ptr->pkt.cas);
+ cas_pkt = &(op_ptr->pkt.cas);
MPIDI_Pkt_init(cas_pkt, MPIDI_CH3_PKT_CAS_IMMED);
cas_pkt->addr = (char *) win_ptr->basic_info_table[target_rank].base_addr +
win_ptr->basic_info_table[target_rank].disp_unit * target_disp;
@@ -1200,7 +1200,7 @@ int MPIDI_Compare_and_swap(const void *origin_addr, const void *compare_addr,
MPIR_T_PVAR_TIMER_END(RMA, rma_rmaqueue_set);
- mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, op_ptr);
if (mpi_errno)
MPIU_ERR_POP(mpi_errno);
@@ -1294,10 +1294,10 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
MPIU_ERR_POP(mpi_errno);
}
else {
- MPIDI_RMA_Op_t *new_ptr = NULL;
+ MPIDI_RMA_Op_t *op_ptr = NULL;
/* Append this operation to the RMA ops queue */
- mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_get_op(win_ptr, &op_ptr);
if (mpi_errno != MPI_SUCCESS)
MPIU_ERR_POP(mpi_errno);
@@ -1313,11 +1313,11 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
/******************** Setting operation struct areas ***********************/
- new_ptr->origin_addr = result_addr;
- new_ptr->origin_count = 1;
- new_ptr->origin_datatype = datatype;
- new_ptr->target_rank = target_rank;
- new_ptr->piggyback_lock_candidate = 1;
+ op_ptr->origin_addr = result_addr;
+ op_ptr->origin_count = 1;
+ op_ptr->origin_datatype = datatype;
+ op_ptr->target_rank = target_rank;
+ op_ptr->piggyback_lock_candidate = 1;
/************** Setting packet struct areas in operation ****************/
@@ -1335,7 +1335,7 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
use_immed_resp_pkt = TRUE;
}
- get_pkt = &(new_ptr->pkt.get);
+ get_pkt = &(op_ptr->pkt.get);
MPIDI_Pkt_init(get_pkt, MPIDI_CH3_PKT_GET);
get_pkt->addr = (char *) win_ptr->basic_info_table[target_rank].base_addr +
win_ptr->basic_info_table[target_rank].disp_unit * target_disp;
@@ -1356,13 +1356,13 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
/******************** Setting operation struct areas ***********************/
- new_ptr->origin_addr = (void *) origin_addr;
- new_ptr->origin_count = 1;
- new_ptr->origin_datatype = datatype;
- new_ptr->result_addr = result_addr;
- new_ptr->result_datatype = datatype;
- new_ptr->target_rank = target_rank;
- new_ptr->piggyback_lock_candidate = 1;
+ op_ptr->origin_addr = (void *) origin_addr;
+ op_ptr->origin_count = 1;
+ op_ptr->origin_datatype = datatype;
+ op_ptr->result_addr = result_addr;
+ op_ptr->result_datatype = datatype;
+ op_ptr->target_rank = target_rank;
+ op_ptr->piggyback_lock_candidate = 1;
/************** Setting packet struct areas in operation ****************/
@@ -1380,7 +1380,7 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
}
}
- fop_pkt = &(new_ptr->pkt.fop);
+ fop_pkt = &(op_ptr->pkt.fop);
if (use_immed_pkt) {
MPIDI_Pkt_init(fop_pkt, MPIDI_CH3_PKT_FOP_IMMED);
@@ -1404,7 +1404,7 @@ int MPIDI_Fetch_and_op(const void *origin_addr, void *result_addr,
MPIR_T_PVAR_TIMER_END(RMA, rma_rmaqueue_set);
- mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, new_ptr);
+ mpi_errno = MPIDI_CH3I_Win_enqueue_op(win_ptr, op_ptr);
if (mpi_errno)
MPIU_ERR_POP(mpi_errno);
http://git.mpich.org/mpich.git/commitdiff/5a1dd95606ad83a8671a41ccc682076b9…
commit 5a1dd95606ad83a8671a41ccc682076b9c19d63b
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Mon Mar 9 11:32:25 2015 -0700
Delete macros that no longer needed.
We already drop the code that uses those macros when
re-implementing RMA, here we just delete those macros.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index 6a23a9f..424ad1e 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -8,9 +8,6 @@
MPIR_T_PVAR_DOUBLE_TIMER_DECL_EXTERN(RMA, rma_rmaqueue_set);
-#define MPIDI_PASSIVE_TARGET_DONE_TAG 348297
-#define MPIDI_PASSIVE_TARGET_RMA_TAG 563924
-
/*
=== BEGIN_MPI_T_CVAR_INFO_BLOCK ===
http://git.mpich.org/mpich.git/commitdiff/1e321d463ba394c1b6fe9bc818c81be22…
commit 1e321d463ba394c1b6fe9bc818c81be22e39f24c
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Sun May 31 13:19:58 2015 -0500
Add a test to test atomic GET (GACC/FOP + MPI_NO_OP).
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/test/mpi/rma/Makefile.am b/test/mpi/rma/Makefile.am
index f27e3be..656afc6 100644
--- a/test/mpi/rma/Makefile.am
+++ b/test/mpi/rma/Makefile.am
@@ -144,6 +144,7 @@ noinst_PROGRAMS = \
atomic_rmw_fop \
atomic_rmw_cas \
atomic_rmw_gacc \
+ atomic_get \
acc-pairtype \
manyget \
derived-acc-flush_local\
diff --git a/test/mpi/rma/atomic_get.c b/test/mpi/rma/atomic_get.c
new file mode 100644
index 0000000..54bffa6
--- /dev/null
+++ b/test/mpi/rma/atomic_get.c
@@ -0,0 +1,183 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ * (C) 2015 by Argonne National Laboratory.
+ * See COPYRIGHT in top-level directory.
+ */
+
+/* This test is going to test atomic GET (GACC/FOP+MPI_NO_OP).
+ *
+ * There are totally three processes involved in this test. Both
+ * rank 1 and rank 2 issue RMA operations to rank 0. Rank 2 issues
+ * atomic PUT (ACC+MPI_REPLACE), whereas rank 1 issues atomic
+ * GET (GACC/FOP+MPI_NO_OP). The datatype used in the test is
+ * pair-type. The initial value of pair-type data in origin buffer
+ * of atomic PUT is set so that the two basic values equal with
+ * each other. Due to the atomicity of GET, the expected resulting
+ * data should also have equivalent basic values. */
+
+#include "mpi.h"
+#include <stdio.h>
+
+#define LOOP 100
+#define DATA_SIZE 100
+#define OPS_NUM 10000
+#define GACC_SZ 10
+
+typedef struct pair_struct {
+ long double a;
+ int b;
+} pair_struct_t;
+
+int main(int argc, char *argv[])
+{
+ int rank, nproc;
+ int i, j, k;
+ int errors = 0, curr_errors = 0;
+ MPI_Win win;
+ pair_struct_t *tar_buf = NULL;
+ pair_struct_t *orig_buf = NULL;
+ pair_struct_t *result_buf = NULL;
+
+ /* This test needs to work with 3 processes. */
+
+ MPI_Init(&argc, &argv);
+
+ MPI_Comm_size(MPI_COMM_WORLD, &nproc);
+ MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+ MPI_Alloc_mem(sizeof(pair_struct_t) * DATA_SIZE, MPI_INFO_NULL, &orig_buf);
+ MPI_Alloc_mem(sizeof(pair_struct_t) * DATA_SIZE, MPI_INFO_NULL, &result_buf);
+
+ MPI_Win_allocate(sizeof(pair_struct_t) * DATA_SIZE, sizeof(pair_struct_t),
+ MPI_INFO_NULL, MPI_COMM_WORLD, &tar_buf, &win);
+
+ for (j = 0; j < LOOP * 6; j++) {
+
+ MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, win);
+
+ /* initialize data */
+ for (i = 0; i < DATA_SIZE; i++) {
+ tar_buf[i].a = 0.0;
+ tar_buf[i].b = 0;
+ result_buf[i].a = 0.0;
+ result_buf[i].b = 0;
+ }
+
+ MPI_Win_unlock(rank, win);
+
+ MPI_Barrier(MPI_COMM_WORLD);
+
+ MPI_Win_fence(0, win);
+
+ if (rank == 2) {
+ if (j < 2 * LOOP) {
+ /* Work with FOP test (Test #1 to Test #2) */
+ for (i = 0; i < OPS_NUM; i++) {
+
+ int curr_val = j * OPS_NUM + i;
+ orig_buf[0].a = (long double) (curr_val);
+ orig_buf[0].b = curr_val;
+
+ MPI_Accumulate(orig_buf, 1, MPI_LONG_DOUBLE_INT,
+ 0, 0, 1, MPI_LONG_DOUBLE_INT, MPI_REPLACE, win);
+ }
+ }
+ else {
+ /* Work with GACC test (Test #3 to Test #6) */
+ for (i = 0; i < OPS_NUM / GACC_SZ; i++) {
+
+ for (k = 0; k < GACC_SZ; k++) {
+ int curr_val = j * OPS_NUM + i * GACC_SZ + k;
+ orig_buf[k].a = (long double) (curr_val);
+ orig_buf[k].b = curr_val;
+ }
+
+ MPI_Accumulate(orig_buf, GACC_SZ, MPI_LONG_DOUBLE_INT,
+ 0, 0, GACC_SZ, MPI_LONG_DOUBLE_INT, MPI_REPLACE, win);
+ }
+ }
+ }
+ else if (rank == 1) {
+ /* equals to an atomic GET */
+ if (j < LOOP) {
+ for (i = 0; i < DATA_SIZE; i++) {
+ /* Test #1: FOP + MPI_NO_OP */
+ MPI_Fetch_and_op(orig_buf, &(result_buf[i]), MPI_LONG_DOUBLE_INT,
+ 0, 0, MPI_NO_OP, win);
+ }
+ }
+ else if (j < 2 * LOOP) {
+ for (i = 0; i < DATA_SIZE; i++) {
+ /* Test #2: FOP + MPI_NO_OP + NULL origin buffer address */
+ MPI_Fetch_and_op(NULL, &(result_buf[i]), MPI_LONG_DOUBLE_INT,
+ 0, 0, MPI_NO_OP, win);
+ }
+ }
+ else if (j < 3 * LOOP) {
+ for (i = 0; i < DATA_SIZE / GACC_SZ; i++) {
+ /* Test #3: GACC + MPI_NO_OP */
+ MPI_Get_accumulate(orig_buf, GACC_SZ, MPI_LONG_DOUBLE_INT,
+ &(result_buf[i * GACC_SZ]), GACC_SZ, MPI_LONG_DOUBLE_INT,
+ 0, 0, GACC_SZ, MPI_LONG_DOUBLE_INT, MPI_NO_OP, win);
+ }
+ }
+ else if (j < 4 * LOOP) {
+ for (i = 0; i < DATA_SIZE / GACC_SZ; i++) {
+ /* Test #4: GACC + MPI_NO_OP + NULL origin buffer address */
+ MPI_Get_accumulate(NULL, GACC_SZ, MPI_LONG_DOUBLE_INT,
+ &(result_buf[i * GACC_SZ]), GACC_SZ, MPI_LONG_DOUBLE_INT,
+ 0, 0, GACC_SZ, MPI_LONG_DOUBLE_INT, MPI_NO_OP, win);
+ }
+ }
+ else if (j < 5 * LOOP) {
+ for (i = 0; i < DATA_SIZE / GACC_SZ; i++) {
+ /* Test #5: GACC + MPI_NO_OP + zero origin count */
+ MPI_Get_accumulate(orig_buf, 0, MPI_LONG_DOUBLE_INT,
+ &(result_buf[i * GACC_SZ]), GACC_SZ, MPI_LONG_DOUBLE_INT,
+ 0, 0, GACC_SZ, MPI_LONG_DOUBLE_INT, MPI_NO_OP, win);
+ }
+ }
+ else if (j < 6 * LOOP) {
+ for (i = 0; i < DATA_SIZE / GACC_SZ; i++) {
+ /* Test #5: GACC + MPI_NO_OP + NULL origin datatype */
+ MPI_Get_accumulate(orig_buf, GACC_SZ, MPI_DATATYPE_NULL,
+ &(result_buf[i * GACC_SZ]), GACC_SZ, MPI_LONG_DOUBLE_INT,
+ 0, 0, GACC_SZ, MPI_LONG_DOUBLE_INT, MPI_NO_OP, win);
+ }
+ }
+ }
+
+ MPI_Win_fence(0, win);
+
+ /* check results */
+ if (rank == 1) {
+ for (i = 0; i < DATA_SIZE; i++) {
+ if (result_buf[i].a != (long double) (result_buf[i].b)) {
+ if (curr_errors < 10) {
+ printf("LOOP %d: result_buf[%d].a = %Lf, result_buf[%d].b = %d\n",
+ j, i, result_buf[i].a, i, result_buf[i].b);
+ }
+ curr_errors++;
+ }
+ }
+ }
+
+ if (j % LOOP == 0) {
+ errors += curr_errors;
+ curr_errors = 0;
+ }
+ }
+
+ MPI_Win_free(&win);
+
+ MPI_Free_mem(orig_buf);
+ MPI_Free_mem(result_buf);
+
+ if (rank == 1) {
+ if (errors == 0)
+ printf(" No Errors\n");
+ }
+
+ MPI_Finalize();
+ return 0;
+}
diff --git a/test/mpi/rma/testlist.in b/test/mpi/rma/testlist.in
index e0f994b..475cc43 100644
--- a/test/mpi/rma/testlist.in
+++ b/test/mpi/rma/testlist.in
@@ -131,6 +131,7 @@ at_complete 2
atomic_rmw_fop 3
atomic_rmw_cas 3
atomic_rmw_gacc 3
+atomic_get 3 mpiversion=3.0
aint 2 mpiversion=3.1
acc-pairtype 2
manyget 2
-----------------------------------------------------------------------
Summary of changes:
src/mpi/rma/fetch_and_op.c | 4 +-
src/mpi/rma/get_accumulate.c | 4 +
.../ch3/channels/nemesis/include/mpid_nem_inline.h | 3 +-
.../ch3/channels/nemesis/include/mpidi_ch3_pre.h | 2 +-
src/mpid/ch3/channels/nemesis/src/ch3_progress.c | 4 +-
src/mpid/ch3/channels/sock/include/mpidi_ch3_pre.h | 2 +-
src/mpid/ch3/channels/sock/src/ch3_progress.c | 6 +-
src/mpid/ch3/include/mpid_rma_issue.h | 106 +++-
src/mpid/ch3/include/mpid_rma_oplist.h | 257 ++++-----
src/mpid/ch3/include/mpid_rma_shm.h | 65 ++-
src/mpid/ch3/include/mpid_rma_types.h | 20 +-
src/mpid/ch3/include/mpidpkt.h | 23 +
src/mpid/ch3/include/mpidrma.h | 130 +++--
src/mpid/ch3/src/ch3u_handle_recv_req.c | 154 +++--
src/mpid/ch3/src/ch3u_rma_ops.c | 610 ++++++++------------
src/mpid/ch3/src/ch3u_rma_pkthandler.c | 111 +++--
src/mpid/ch3/src/ch3u_rma_progress.c | 349 ++++++------
src/mpid/ch3/src/ch3u_rma_sync.c | 105 ++--
src/mpid/ch3/src/mpid_rma.c | 2 +-
test/mpi/rma/Makefile.am | 1 +
test/mpi/rma/atomic_get.c | 183 ++++++
test/mpi/rma/testlist.in | 1 +
22 files changed, 1141 insertions(+), 1001 deletions(-)
create mode 100644 test/mpi/rma/atomic_get.c
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.2b3-60-g5bb0374
by noreply@mpich.org 12 Jun '15
by noreply@mpich.org 12 Jun '15
12 Jun '15
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 5bb037479a079a5e940a9c0e4e1f10f045cb9d7d (commit)
from ed749773a9e4fd793c2f517a2029a29c61ed9526 (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/5bb037479a079a5e940a9c0e4e1f10f04…
commit 5bb037479a079a5e940a9c0e4e1f10f045cb9d7d
Author: Halim Amer <aamer(a)anl.gov>
Date: Wed Jun 10 13:23:43 2015 -0500
Test send cancellation issues with unmatched sends
In this test, two messages are sent with the same rank, comm, and tag,
and one of them is cancelled before it gets matched. If the
destination does not differentiate between the messages, e.g. by using
sequence numbers or the origin request handle, the wrong message might
be canceled.
Signed-off-by: Ken Raffenetti <raffenet(a)mcs.anl.gov>
diff --git a/test/mpi/.gitignore b/test/mpi/.gitignore
index a16a496..d5fcfe6 100644
--- a/test/mpi/.gitignore
+++ b/test/mpi/.gitignore
@@ -953,6 +953,7 @@
/pt2pt/rqstatus
/pt2pt/scancel
/pt2pt/scancel2
+/pt2pt/scancel_unmatch
/pt2pt/sendall
/pt2pt/sendflood
/pt2pt/sendrecv1
diff --git a/test/mpi/pt2pt/Makefile.am b/test/mpi/pt2pt/Makefile.am
index 0135272..9c5d352 100644
--- a/test/mpi/pt2pt/Makefile.am
+++ b/test/mpi/pt2pt/Makefile.am
@@ -38,6 +38,7 @@ noinst_PROGRAMS = \
scancel2 \
rcancel \
pscancel \
+ scancel_unmatch\
sendflood \
sendrecv1 \
sendrecv2 \
diff --git a/test/mpi/pt2pt/scancel_unmatch.c b/test/mpi/pt2pt/scancel_unmatch.c
new file mode 100644
index 0000000..350e387
--- /dev/null
+++ b/test/mpi/pt2pt/scancel_unmatch.c
@@ -0,0 +1,61 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ * (C) 2015 by Argonne National Laboratory.
+ * See COPYRIGHT in top-level directory.
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpitest.h"
+
+/*
+static char MTEST_Descrip[] = "Test message reception ordering issues
+after cancelling a send";
+*/
+
+int main(int argc, char *argv[])
+{
+
+ int a, b, flag = 0, errs = 0;
+ MPI_Request requests[2];
+ MPI_Status statuses[2];
+
+ MPI_Init(&argc, &argv);
+
+ int rank, size;
+ MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+ MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+ int source = 0;
+ int dest = size - 1;
+
+ if (rank == 0) {
+ a = 10;
+ b = 20;
+ MPI_Isend(&a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &requests[0]);
+ MPI_Isend(&b, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &requests[1]);
+ MPI_Cancel(&requests[1]);
+ MPI_Wait(&requests[1], &statuses[1]);
+ MPI_Test_cancelled(&statuses[1], &flag);
+
+ if (!flag) {
+ printf("Failed to cancel send");
+ errs++;
+ }
+ MPI_Barrier(MPI_COMM_WORLD);
+ MPI_Wait(&requests[0], MPI_STATUS_IGNORE);
+ }
+ else if (rank == 1) {
+ MPI_Barrier(MPI_COMM_WORLD);
+ MPI_Recv(&a, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+ if (a == 20) {
+ printf("Failed! got the data from the wrong send!\n");
+ errs++;
+ }
+ }
+
+ MTest_Finalize(errs);
+ MPI_Finalize();
+ return 0;
+}
diff --git a/test/mpi/pt2pt/testlist b/test/mpi/pt2pt/testlist
index 25714ad..8f5afbb 100644
--- a/test/mpi/pt2pt/testlist
+++ b/test/mpi/pt2pt/testlist
@@ -30,6 +30,7 @@ scancel2 2
pscancel 2 xfail=ticket2266 xfail=ticket2270
rcancel 2
cancelrecv 2 xfail=ticket2266 xfail=ticket2270
+scancel_unmatch 2 xfail=ticket2276
cancelanysrc 2
isendselfprobe 1
inactivereq 1
-----------------------------------------------------------------------
Summary of changes:
test/mpi/.gitignore | 1 +
test/mpi/pt2pt/Makefile.am | 1 +
test/mpi/pt2pt/scancel_unmatch.c | 61 ++++++++++++++++++++++++++++++++++++++
test/mpi/pt2pt/testlist | 1 +
4 files changed, 64 insertions(+), 0 deletions(-)
create mode 100644 test/mpi/pt2pt/scancel_unmatch.c
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.2b3-59-ged74977
by noreply@mpich.org 12 Jun '15
by noreply@mpich.org 12 Jun '15
12 Jun '15
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 ed749773a9e4fd793c2f517a2029a29c61ed9526 (commit)
from d2680c3c91a5508a934de4169960f8589740e235 (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/ed749773a9e4fd793c2f517a2029a29c6…
commit ed749773a9e4fd793c2f517a2029a29c61ed9526
Author: Ken Raffenetti <raffenet(a)mcs.anl.gov>
Date: Thu Jun 11 13:42:31 2015 -0500
answer FIXME in comment for MPIDI_CH3U_Recvq_FDU
Signed-off-by: Halim Amer <aamer(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_recvq.c b/src/mpid/ch3/src/ch3u_recvq.c
index 8ac6d89..e6c2c56 100644
--- a/src/mpid/ch3/src/ch3u_recvq.c
+++ b/src/mpid/ch3/src/ch3u_recvq.c
@@ -318,8 +318,14 @@ MPID_Request * MPIDI_CH3U_Recvq_FDU(MPI_Request sreq_id,
MPIR_TAG_CLEAR_ERROR_BITS(mask.parts.tag);
/* Note that since this routine is used only in the case of send_cancel,
- there can be only one match if at all. */
- /* FIXME: Why doesn't this exit after it finds the first match? */
+ * there can be only one match, if at all. The reason the loop continues
+ * after finding a match is that send request handles are reused. In the
+ * case multiple requests with the same sender_req_id are present, only
+ * the last message is cancellable. This is because previous instances
+ * must have been tested or waited on the sender side, indicating completion
+ * and freeing the handle for reuse. Those completed operations cannot be
+ * cancelled.
+ */
cur_rreq = recvq_unexpected_head;
while (cur_rreq != NULL) {
MPIR_T_PVAR_TIMER_START(RECVQ, time_matching_unexpectedq);
-----------------------------------------------------------------------
Summary of changes:
src/mpid/ch3/src/ch3u_recvq.c | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.2b3-58-gd2680c3
by noreply@mpich.org 11 Jun '15
by noreply@mpich.org 11 Jun '15
11 Jun '15
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 d2680c3c91a5508a934de4169960f8589740e235 (commit)
from e7142a23e39c5c35943431913779ebd5c1bc3bfc (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/d2680c3c91a5508a934de4169960f8589…
commit d2680c3c91a5508a934de4169960f8589740e235
Author: Sangmin Seo <sseo(a)anl.gov>
Date: Thu Jun 11 01:07:14 2015 -0500
tsuite: add MPI version setting to runtests.
To specify the MPI version to use in runtests, -mpiversion option and
the environment variable MPITEST_MPIVERSION were added to runtests.
If neither -mpiversion nor MPITEST_MPIVERSION is set, the default MPI
version, which has been detected by configure, is used for testing.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/test/mpi/runtests.in b/test/mpi/runtests.in
index a6d05f3..185e90f 100644
--- a/test/mpi/runtests.in
+++ b/test/mpi/runtests.in
@@ -167,6 +167,15 @@ if (defined($ENV{'MPITEST_TIMELIMITARG'})) {
$timelimitArg = $ENV{'MPITEST_TIMELIMITARG'};
}
+# MPI version for testing
+if (defined($ENV{'MPITEST_MPIVERSION'})) {
+ $_ = $ENV{'MPITEST_MPIVERSION'};
+ if (/(\d+)\.(\d+)/) {
+ $MPIMajorVersion = $1;
+ $MPIMinorVersion = $2;
+ }
+}
+
#---------------------------------------------------------------------------
# Process arguments and override any defaults
#---------------------------------------------------------------------------
@@ -176,6 +185,8 @@ foreach $_ (@ARGV) {
# we don't want to bother to try and find it.
$mpiexec = $1;
}
+ elsif (/--?mpiversion=(\d+)\.(\d+)/) { $MPIMajorVersion = $1;
+ $MPIMinorVersion = $2; }
elsif (/--?np=(\d+)/) { $np_default = $1; }
elsif (/--?maxnp=(\d+)/) { $np_max = $1; }
elsif (/--?ppn=(\d+)/) { $ppnMax = $1; }
@@ -252,7 +263,7 @@ foreach $_ (@ARGV) {
print STDERR "runtests [-tests=testfile] [-np=nprocesses] \
[-maxnp=max-nprocesses] [-srcdir=location-of-tests] \
[-ppn=max-proc-per-node] [-ppnarg=string] \
- [-timelimitarg=string] \
+ [-timelimitarg=string] [-mpiversion=major.minor] \
[-xmlfile=filename ] [-tapfile=filename ] \
[-junitfile=filename ] [-noxmlclose] \
[-verbose] [-showprogress] [-debug] [-batch]\n";
-----------------------------------------------------------------------
Summary of changes:
test/mpi/runtests.in | 13 ++++++++++++-
1 files changed, 12 insertions(+), 1 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.2b3-57-ge7142a2
by noreply@mpich.org 11 Jun '15
by noreply@mpich.org 11 Jun '15
11 Jun '15
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 e7142a23e39c5c35943431913779ebd5c1bc3bfc (commit)
from 2efebedc447b05d307d708a4f579b03ee64df814 (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/e7142a23e39c5c35943431913779ebd5c…
commit e7142a23e39c5c35943431913779ebd5c1bc3bfc
Author: Halim Amer <aamer(a)anl.gov>
Date: Tue Jun 9 22:11:33 2015 -0500
Mark the failing send cancel related tests as xfail
Signed-off-by: Ken Raffenetti <raffenet(a)mcs.anl.gov>
diff --git a/test/mpi/pt2pt/testlist b/test/mpi/pt2pt/testlist
index 514f7b8..25714ad 100644
--- a/test/mpi/pt2pt/testlist
+++ b/test/mpi/pt2pt/testlist
@@ -25,11 +25,11 @@ greq1 1
probe-unexp 4
probenull 1
# For testing, scancel will run with 1 process as well
-scancel 2
+scancel 2 xfail=ticket2266 xfail=ticket2270
scancel2 2
-pscancel 2
+pscancel 2 xfail=ticket2266 xfail=ticket2270
rcancel 2
-cancelrecv 2
+cancelrecv 2 xfail=ticket2266 xfail=ticket2270
cancelanysrc 2
isendselfprobe 1
inactivereq 1
-----------------------------------------------------------------------
Summary of changes:
test/mpi/pt2pt/testlist | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.2b3-56-g2efebed
by noreply@mpich.org 11 Jun '15
by noreply@mpich.org 11 Jun '15
11 Jun '15
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 2efebedc447b05d307d708a4f579b03ee64df814 (commit)
via 9d149761cc5bfd3395b1ecce35b7b3903f9646b5 (commit)
via 6d9d084ae73b87af05f8be7cb817468d46595e12 (commit)
from c229b00e9f8a0e5acbc4cff8cac8957a46a9d6d5 (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/2efebedc447b05d307d708a4f579b03ee…
commit 2efebedc447b05d307d708a4f579b03ee64df814
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Sun Jun 7 09:53:48 2015 -0500
Bug-fix: free lock entry queue when it was allocated.
Originally we allocate the lock entry queue in Win_create/allocate
(if no_locks is not set), and free the queue in Win_free (if no_locks
is not set). This is not correct because no_locks may be set after
Win_create/allocate and before Win_free. In this patch, we free
the queue in Win_free if the queue was allocated in Win_create/allocate.
Thanks to Lisandro Dalcin [dalcinl(a)gmail.com] for reporting this bug.
Fix #2273
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/mpidi_rma.c b/src/mpid/ch3/src/mpidi_rma.c
index 58a55a6..4cbec01 100644
--- a/src/mpid/ch3/src/mpidi_rma.c
+++ b/src/mpid/ch3/src/mpidi_rma.c
@@ -241,7 +241,7 @@ int MPIDI_Win_free(MPID_Win ** win_ptr)
MPIU_Free((*win_ptr)->op_pool_start);
MPIU_Free((*win_ptr)->target_pool_start);
MPIU_Free((*win_ptr)->slots);
- if (!(*win_ptr)->info_args.no_locks) {
+ if ((*win_ptr)->lock_entry_pool_start != NULL) {
MPIU_Free((*win_ptr)->lock_entry_pool_start);
}
MPIU_Assert((*win_ptr)->current_lock_data_bytes == 0);
http://git.mpich.org/mpich.git/commitdiff/9d149761cc5bfd3395b1ecce35b7b3903…
commit 9d149761cc5bfd3395b1ecce35b7b3903f9646b5
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Sun Jun 7 09:36:43 2015 -0500
Bug-fix: fix typo error in Win_set_info.
Thanks to Lisandro Dalcin [dalcinl(a)gmail.com] for reporting this bug.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_win_fns.c b/src/mpid/ch3/src/ch3u_win_fns.c
index 974ef66..45b7007 100644
--- a/src/mpid/ch3/src/ch3u_win_fns.c
+++ b/src/mpid/ch3/src/ch3u_win_fns.c
@@ -304,8 +304,8 @@ int MPIDI_Win_set_info(MPID_Win * win, MPID_Info * info)
if (info_flag) {
if (!strncmp(info_value, "true", strlen("true")))
win->info_args.no_locks = 1;
- if (!strncmp(info_value, "false", strlen("true")))
- win->info_args.no_locks = 1;
+ if (!strncmp(info_value, "false", strlen("false")))
+ win->info_args.no_locks = 0;
}
}
http://git.mpich.org/mpich.git/commitdiff/6d9d084ae73b87af05f8be7cb817468d4…
commit 6d9d084ae73b87af05f8be7cb817468d46595e12
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Sun Jun 7 09:55:06 2015 -0500
Add tests of setting window info no_locks to TRUE / FALSE.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/test/mpi/rma/win_info.c b/test/mpi/rma/win_info.c
index 3a2222d..7a3ee3a 100644
--- a/test/mpi/rma/win_info.c
+++ b/test/mpi/rma/win_info.c
@@ -7,6 +7,7 @@
#include <stdio.h>
#include <mpi.h>
+#include <string.h>
#include "mpitest.h"
#define VERBOSE 0
@@ -26,11 +27,13 @@ int main(int argc, char **argv) {
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nproc);
+ MPI_Win_allocate(sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &base, &win);
+
+ /* Test#1: setting and getting invalid key */
+
MPI_Info_create(&info_in);
MPI_Info_set(info_in, invalid_key, "true");
- MPI_Win_allocate(sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &base, &win);
-
MPI_Win_set_info(win, info_in);
MPI_Win_get_info(win, &info_out);
@@ -45,9 +48,55 @@ int main(int argc, char **argv) {
}
#endif
+ MPI_Info_free(&info_in);
+ MPI_Info_free(&info_out);
+
+ /* Test#2: setting info key "no_lock" to false and getting the key */
+
+ MPI_Info_create(&info_in);
+ MPI_Info_set(info_in, "no_locks", "false");
+
+ MPI_Win_set_info(win, info_in);
+ MPI_Win_get_info(win, &info_out);
+
MPI_Info_get(info_out, "no_locks", MPI_MAX_INFO_VAL, buf, &flag);
+ if (!flag || strncmp(buf, "false", strlen("false")) != 0) {
+ if (!flag)
+ printf("%d: no_locks is not defined\n", rank);
+ else
+ printf("%d: no_locks = %s, expected false\n", rank, buf);
+ errors++;
+ }
if (flag && VERBOSE) printf("%d: no_locks = %s\n", rank, buf);
+ MPI_Info_free(&info_in);
+ MPI_Info_free(&info_out);
+
+ /* Test#3: setting info key "no_lock" to true and getting the key */
+
+ MPI_Info_create(&info_in);
+ MPI_Info_set(info_in, "no_locks", "true");
+
+ MPI_Win_set_info(win, info_in);
+ MPI_Win_get_info(win, &info_out);
+
+ MPI_Info_get(info_out, "no_locks", MPI_MAX_INFO_VAL, buf, &flag);
+ if (!flag || strncmp(buf, "true", strlen("true")) != 0) {
+ if (!flag)
+ printf("%d: no_locks is not defined\n", rank);
+ else
+ printf("%d: no_locks = %s, expected true\n", rank, buf);
+ errors++;
+ }
+ if (flag && VERBOSE) printf("%d: no_locks = %s\n", rank, buf);
+
+ MPI_Info_free(&info_in);
+ MPI_Info_free(&info_out);
+
+ /* Test#4: getting other info keys */
+
+ MPI_Win_get_info(win, &info_out);
+
MPI_Info_get(info_out, "accumulate_ordering", MPI_MAX_INFO_VAL, buf, &flag);
if (flag && VERBOSE) printf("%d: accumulate_ordering = %s\n", rank, buf);
@@ -60,7 +109,6 @@ int main(int argc, char **argv) {
MPI_Info_get(info_out, "alloc_shm", MPI_MAX_INFO_VAL, buf, &flag);
if (flag && VERBOSE) printf("%d: alloc_shm = %s\n", rank, buf);
- MPI_Info_free(&info_in);
MPI_Info_free(&info_out);
MPI_Win_free(&win);
-----------------------------------------------------------------------
Summary of changes:
src/mpid/ch3/src/ch3u_win_fns.c | 4 +-
src/mpid/ch3/src/mpidi_rma.c | 2 +-
test/mpi/rma/win_info.c | 54 ++++++++++++++++++++++++++++++++++++--
3 files changed, 54 insertions(+), 6 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0