Skip to content

Commit 51b01cd

Browse files
committed
Use acquire/release barrier to synchronize completion of request and test/wait
Before completing the request we should make sure that all other pieces are visible, the status. The release barrier should synchronize with an acquire barrier before reading the status in test/wait. This also removes a full memory barrier at the beginning of test functions that does not seem to serve any purpose. Signed-off-by: Joseph Schuchart <schuchart@icl.utk.edu>
1 parent 479c746 commit 51b01cd

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

ompi/request/req_test.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ int ompi_request_default_test(ompi_request_t ** rptr,
3737

3838
recheck_request_status:
3939
#endif
40-
opal_atomic_mb();
4140
if( request->req_state == OMPI_REQUEST_INACTIVE ) {
4241
*completed = true;
4342
if (MPI_STATUS_IGNORE != status) {
@@ -55,6 +54,8 @@ int ompi_request_default_test(ompi_request_t ** rptr,
5554
ompi_grequest_invoke_query(request, &request->req_status);
5655
}
5756
if (MPI_STATUS_IGNORE != status) {
57+
/* make sure we get the correct status */
58+
opal_atomic_rmb();
5859
OMPI_COPY_STATUS(status, request->req_status, false);
5960
}
6061
if( request->req_persistent ) {
@@ -108,7 +109,6 @@ int ompi_request_default_test_any(
108109
ompi_request_t **rptr;
109110
ompi_request_t *request;
110111

111-
opal_atomic_mb();
112112
rptr = requests;
113113
for (i = 0; i < count; i++, rptr++) {
114114
request = *rptr;
@@ -129,6 +129,8 @@ int ompi_request_default_test_any(
129129
ompi_grequest_invoke_query(request, &request->req_status);
130130
}
131131
if (MPI_STATUS_IGNORE != status) {
132+
/* make sure we get the correct status */
133+
opal_atomic_rmb();
132134
OMPI_COPY_STATUS(status, request->req_status, false);
133135
}
134136

@@ -186,7 +188,6 @@ int ompi_request_default_test_all(
186188
ompi_request_t *request;
187189
int do_it_once = 0;
188190

189-
opal_atomic_mb();
190191
for (i = 0; i < count; i++) {
191192
request = requests[i];
192193

@@ -231,6 +232,8 @@ int ompi_request_default_test_all(
231232

232233
rc = MPI_SUCCESS;
233234
if (MPI_STATUSES_IGNORE != statuses) {
235+
/* make sure we get the correct statuses */
236+
opal_atomic_rmb();
234237
/* fill out completion status and free request if required */
235238
for( i = 0; i < count; i++, rptr++ ) {
236239
request = *rptr;
@@ -318,7 +321,6 @@ int ompi_request_default_test_some(
318321
ompi_request_t **rptr;
319322
ompi_request_t *request;
320323

321-
opal_atomic_mb();
322324
rptr = requests;
323325
for (i = 0; i < count; i++, rptr++) {
324326
request = *rptr;
@@ -357,6 +359,9 @@ int ompi_request_default_test_some(
357359
return OMPI_SUCCESS;
358360
}
359361

362+
/* make sure we get the correct statuses */
363+
opal_atomic_rmb();
364+
360365
/* fill out completion status and free request if required */
361366
for( i = 0; i < num_requests_done; i++) {
362367
request = requests[indices[i]];

ompi/request/req_wait.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ int ompi_request_default_wait(
3939

4040
ompi_request_wait_completion(req);
4141

42+
/* make sure we get the correct status */
43+
opal_atomic_rmb();
44+
4245
#if OPAL_ENABLE_FT_MPI
4346
/* Special case for MPI_ANY_SOURCE */
4447
if( MPI_ERR_PROC_FAILED_PENDING == req->req_status.MPI_ERROR ) {
@@ -198,6 +201,8 @@ int ompi_request_default_wait_any(size_t count,
198201
rc = ompi_grequest_invoke_query(request, &request->req_status);
199202
}
200203
if (MPI_STATUS_IGNORE != status) {
204+
/* make sure we get the correct status */
205+
opal_atomic_rmb();
201206
OMPI_COPY_STATUS(status, request->req_status, false);
202207
}
203208
rc = request->req_status.MPI_ERROR;
@@ -302,6 +307,9 @@ int ompi_request_default_wait_all( size_t count,
302307
finish:
303308
rptr = requests;
304309
if (MPI_STATUSES_IGNORE != statuses) {
310+
/* make sure we get the correct status */
311+
opal_atomic_rmb();
312+
305313
/* fill out status and free request if required */
306314
for( i = 0; i < count; i++, rptr++ ) {
307315
void *_tmp_ptr = &sync;
@@ -574,6 +582,9 @@ int ompi_request_default_wait_some(size_t count,
574582

575583
*outcount = num_requests_done;
576584

585+
/* make sure we get the correct status */
586+
opal_atomic_rmb();
587+
577588
for (size_t i = 0; i < num_requests_done; i++) {
578589
request = requests[indices[i]];
579590
#if OPAL_ENABLE_FT_MPI

ompi/request/request.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,8 @@ static inline int ompi_request_complete(ompi_request_t* request, bool with_signa
527527

528528
if (0 == rc) {
529529
if (OPAL_LIKELY(with_signal)) {
530+
/* make sure everything in the request is visible before we mark it complete */
531+
opal_atomic_wmb();
530532

531533
ompi_wait_sync_t *tmp_sync = (ompi_wait_sync_t *) OPAL_ATOMIC_SWAP_PTR(&request->req_complete,
532534
REQUEST_COMPLETED);

0 commit comments

Comments
 (0)