15
15
* Copyright (c) 2012 Oak Ridge National Labs. All rights reserved.
16
16
* Copyright (c) 2016 Los Alamos National Security, LLC. All rights
17
17
* reserved.
18
+ * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
18
19
* $COPYRIGHT$
19
20
*
20
21
* Additional copyrights may follow
@@ -87,6 +88,7 @@ int ompi_request_default_wait_any(size_t count,
87
88
int rc = OMPI_SUCCESS ;
88
89
ompi_request_t * request = NULL ;
89
90
ompi_wait_sync_t sync ;
91
+ int sync_sets = 0 , sync_unsets = 0 ;
90
92
91
93
WAIT_SYNC_INIT (& sync , 1 );
92
94
@@ -108,6 +110,8 @@ int ompi_request_default_wait_any(size_t count,
108
110
completed = i ;
109
111
* index = i ;
110
112
goto after_sync_wait ;
113
+ } else {
114
+ sync_sets ++ ;
111
115
}
112
116
}
113
117
@@ -116,7 +120,8 @@ int ompi_request_default_wait_any(size_t count,
116
120
if (MPI_STATUS_IGNORE != status ) {
117
121
* status = ompi_status_empty ;
118
122
}
119
- WAIT_SYNC_RELEASE (& sync );
123
+ /* No signal-in-flight can be in this case */
124
+ WAIT_SYNC_RELEASE_NOWAIT (& sync );
120
125
return rc ;
121
126
}
122
127
@@ -138,8 +143,17 @@ int ompi_request_default_wait_any(size_t count,
138
143
*/
139
144
if ( !OPAL_ATOMIC_CMPSET_PTR (& request -> req_complete , & sync , REQUEST_PENDING ) ) {
140
145
* index = i ;
146
+ } else {
147
+ sync_unsets ++ ;
141
148
}
142
149
}
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
+ }
143
157
144
158
request = requests [* index ];
145
159
assert ( REQUEST_COMPLETE (request ) );
@@ -361,7 +375,8 @@ int ompi_request_default_wait_some(size_t count,
361
375
ompi_request_t * * rptr = NULL ;
362
376
ompi_request_t * request = NULL ;
363
377
ompi_wait_sync_t sync ;
364
-
378
+ size_t sync_sets = 0 , sync_unsets = 0 ;
379
+
365
380
WAIT_SYNC_INIT (& sync , 1 );
366
381
367
382
* outcount = 0 ;
@@ -384,12 +399,15 @@ int ompi_request_default_wait_some(size_t count,
384
399
/* If the request is completed go ahead and mark it as such */
385
400
assert ( REQUEST_COMPLETE (request ) );
386
401
num_requests_done ++ ;
402
+ } else {
403
+ sync_sets ++ ;
387
404
}
388
405
}
389
406
390
407
if (num_requests_null_inactive == count ) {
391
408
* outcount = MPI_UNDEFINED ;
392
- WAIT_SYNC_RELEASE (& sync );
409
+ /* nobody will signall us */
410
+ WAIT_SYNC_RELEASE_NOWAIT (& sync );
393
411
return rc ;
394
412
}
395
413
@@ -418,9 +436,19 @@ int ompi_request_default_wait_some(size_t count,
418
436
if ( !OPAL_ATOMIC_CMPSET_PTR (& request -> req_complete , & sync , REQUEST_PENDING ) ) {
419
437
indices [num_requests_done ] = i ;
420
438
num_requests_done ++ ;
439
+ } else {
440
+ /* request wasn't finished during this call */
441
+ sync_unsets ++ ;
421
442
}
422
443
}
423
444
445
+ if ( sync_sets == sync_unsets ){
446
+ /* nobody knows about us,
447
+ * set signa-in-progress flag to false
448
+ */
449
+ WAIT_SYNC_SIGNALLED (& sync );
450
+ }
451
+
424
452
WAIT_SYNC_RELEASE (& sync );
425
453
426
454
* outcount = num_requests_done ;
0 commit comments