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
@@ -87,6 +88,7 @@ int ompi_request_default_wait_any(size_t count,
8788 int rc = OMPI_SUCCESS ;
8889 ompi_request_t * request = NULL ;
8990 ompi_wait_sync_t sync ;
91+ int sync_sets = 0 , sync_unsets = 0 ;
9092
9193 WAIT_SYNC_INIT (& sync , 1 );
9294
@@ -108,6 +110,8 @@ int ompi_request_default_wait_any(size_t count,
108110 completed = i ;
109111 * index = i ;
110112 goto after_sync_wait ;
113+ } else {
114+ sync_sets ++ ;
111115 }
112116 }
113117
@@ -116,7 +120,8 @@ int ompi_request_default_wait_any(size_t count,
116120 if (MPI_STATUS_IGNORE != status ) {
117121 * status = ompi_status_empty ;
118122 }
119- WAIT_SYNC_RELEASE (& sync );
123+ /* No signal-in-flight can be in this case */
124+ WAIT_SYNC_RELEASE_NOWAIT (& sync );
120125 return rc ;
121126 }
122127
@@ -138,8 +143,17 @@ int ompi_request_default_wait_any(size_t count,
138143 */
139144 if ( !OPAL_ATOMIC_CMPSET_PTR (& request -> req_complete , & sync , REQUEST_PENDING ) ) {
140145 * index = i ;
146+ } else {
147+ sync_unsets ++ ;
141148 }
142149 }
150+
151+ if ( sync_sets == sync_unsets ){
152+ /* set signalled flag so we won't
153+ * block in WAIT_SYNC_RELEASE
154+ */
155+ WAIT_SYNC_SIGNALLED (& sync );
156+ }
143157
144158 request = requests [* index ];
145159 assert ( REQUEST_COMPLETE (request ) );
@@ -361,7 +375,8 @@ int ompi_request_default_wait_some(size_t count,
361375 ompi_request_t * * rptr = NULL ;
362376 ompi_request_t * request = NULL ;
363377 ompi_wait_sync_t sync ;
364-
378+ size_t sync_sets = 0 , sync_unsets = 0 ;
379+
365380 WAIT_SYNC_INIT (& sync , 1 );
366381
367382 * outcount = 0 ;
@@ -386,10 +401,12 @@ int ompi_request_default_wait_some(size_t count,
386401 num_requests_done ++ ;
387402 }
388403 }
404+ sync_sets = count - num_requests_null_inactive - num_requests_done ;
389405
390406 if (num_requests_null_inactive == count ) {
391407 * outcount = MPI_UNDEFINED ;
392- WAIT_SYNC_RELEASE (& sync );
408+ /* nobody will signall us */
409+ WAIT_SYNC_RELEASE_NOWAIT (& sync );
393410 return rc ;
394411 }
395412
@@ -420,6 +437,14 @@ int ompi_request_default_wait_some(size_t count,
420437 num_requests_done ++ ;
421438 }
422439 }
440+ sync_unsets = count - num_requests_null_inactive - num_requests_done ;
441+
442+ if ( sync_sets == sync_unsets ){
443+ /* nobody knows about us,
444+ * set signa-in-progress flag to false
445+ */
446+ WAIT_SYNC_SIGNALLED (& sync );
447+ }
423448
424449 WAIT_SYNC_RELEASE (& sync );
425450
0 commit comments