Skip to content
This repository was archived by the owner on Sep 30, 2022. It is now read-only.

Commit f390926

Browse files
artpol84hjelmn
authored andcommitted
Fix MPI_Waitany and MPI_Waitsome
(request handling related) (cherry picked from open-mpi/ompi@5417155) Signed-off-by: Nathan Hjelm <[email protected]>
1 parent 74dd155 commit f390926

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

ompi/request/req_wait.c

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
* Copyright (c) 2012 Oak Ridge National Labs. All rights reserved.
1616
* Copyright (c) 2016 Los Alamos National Security, LLC. All rights
1717
* reserved.
18+
* Copyright (c) 2016 Mellanox Technologies. All rights reserved.
1819
* $COPYRIGHT$
1920
*
2021
* Additional copyrights may follow
@@ -116,7 +117,8 @@ int ompi_request_default_wait_any(size_t count,
116117
if (MPI_STATUS_IGNORE != status) {
117118
*status = ompi_status_empty;
118119
}
119-
WAIT_SYNC_RELEASE(&sync);
120+
/* No signal-in-flight can be in this case */
121+
WAIT_SYNC_RELEASE_NOWAIT(&sync);
120122
return rc;
121123
}
122124

@@ -140,6 +142,15 @@ int ompi_request_default_wait_any(size_t count,
140142
*index = i;
141143
}
142144
}
145+
146+
if( *index == completed ){
147+
/* Only one request has triggered. There was no
148+
* in-flight completions.
149+
* Drop the signalled flag so we won't block
150+
* in WAIT_SYNC_RELEASE
151+
*/
152+
WAIT_SYNC_SIGNALLED(&sync);
153+
}
143154

144155
request = requests[*index];
145156
assert( REQUEST_COMPLETE(request) );
@@ -348,7 +359,8 @@ int ompi_request_default_wait_some(size_t count,
348359
ompi_request_t **rptr = NULL;
349360
ompi_request_t *request = NULL;
350361
ompi_wait_sync_t sync;
351-
362+
size_t sync_sets = 0, sync_unsets = 0;
363+
352364
WAIT_SYNC_INIT(&sync, 1);
353365

354366
*outcount = 0;
@@ -373,10 +385,12 @@ int ompi_request_default_wait_some(size_t count,
373385
num_requests_done++;
374386
}
375387
}
388+
sync_sets = count - num_requests_null_inactive - num_requests_done;
376389

377390
if(num_requests_null_inactive == count) {
378391
*outcount = MPI_UNDEFINED;
379-
WAIT_SYNC_RELEASE(&sync);
392+
/* nobody will signall us */
393+
WAIT_SYNC_RELEASE_NOWAIT(&sync);
380394
return rc;
381395
}
382396

@@ -407,6 +421,14 @@ int ompi_request_default_wait_some(size_t count,
407421
num_requests_done++;
408422
}
409423
}
424+
sync_unsets = count - num_requests_null_inactive - num_requests_done;
425+
426+
if( sync_sets == sync_unsets ){
427+
/* nobody knows about us,
428+
* set signa-in-progress flag to false
429+
*/
430+
WAIT_SYNC_SIGNALLED(&sync);
431+
}
410432

411433
WAIT_SYNC_RELEASE(&sync);
412434

opal/threads/wait_sync.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,32 @@ typedef struct ompi_wait_sync_t {
4545
* the critical path. */
4646
#define WAIT_SYNC_RELEASE(sync) \
4747
if (opal_using_threads()) { \
48-
while ((sync)->signaling) { \
48+
while ((sync)->signaling) { \
4949
continue; \
5050
} \
5151
pthread_cond_destroy(&(sync)->condition); \
5252
pthread_mutex_destroy(&(sync)->lock); \
5353
}
5454

55+
#define WAIT_SYNC_RELEASE_NOWAIT(sync) \
56+
if (opal_using_threads()) { \
57+
pthread_cond_destroy(&(sync)->condition); \
58+
pthread_mutex_destroy(&(sync)->lock); \
59+
}
60+
61+
5562
#define WAIT_SYNC_SIGNAL(sync) \
5663
if (opal_using_threads()) { \
5764
pthread_mutex_lock(&(sync->lock)); \
5865
pthread_cond_signal(&sync->condition); \
5966
pthread_mutex_unlock(&(sync->lock)); \
60-
sync->signaling = false; \
67+
sync->signaling = false; \
6168
}
6269

70+
#define WAIT_SYNC_SIGNALLED(sync){ \
71+
(sync)->signaling = false; \
72+
}
73+
6374
OPAL_DECLSPEC int sync_wait_mt(ompi_wait_sync_t *sync);
6475
static inline int sync_wait_st (ompi_wait_sync_t *sync)
6576
{

0 commit comments

Comments
 (0)