Skip to content

Commit 5656a09

Browse files
authored
Merge pull request #11665 from devreal/request-test-memory-barrier
Use acquire/release barrier to synchronize completion of request and test/wait
2 parents 18a7064 + 51b01cd commit 5656a09

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)