33 * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
44 * University Research and Technology
55 * Corporation. All rights reserved.
6- * Copyright (c) 2004-2016 The University of Tennessee and The University
6+ * Copyright (c) 2004-2017 The University of Tennessee and The University
77 * of Tennessee Research Foundation. All rights
88 * reserved.
99 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
@@ -102,8 +102,10 @@ int ompi_coll_base_barrier_intra_doublering(struct ompi_communicator_t *comm,
102102{
103103 int rank , size , err = 0 , line = 0 , left , right ;
104104
105- rank = ompi_comm_rank (comm );
106105 size = ompi_comm_size (comm );
106+ if ( 1 == size )
107+ return OMPI_SUCCESS ;
108+ rank = ompi_comm_rank (comm );
107109
108110 OPAL_OUTPUT ((ompi_coll_base_framework .framework_output ,"ompi_coll_base_barrier_intra_doublering rank %d" , rank ));
109111
@@ -172,8 +174,10 @@ int ompi_coll_base_barrier_intra_recursivedoubling(struct ompi_communicator_t *c
172174{
173175 int rank , size , adjsize , err , line , mask , remote ;
174176
175- rank = ompi_comm_rank (comm );
176177 size = ompi_comm_size (comm );
178+ if ( 1 == size )
179+ return OMPI_SUCCESS ;
180+ rank = ompi_comm_rank (comm );
177181 OPAL_OUTPUT ((ompi_coll_base_framework .framework_output ,
178182 "ompi_coll_base_barrier_intra_recursivedoubling rank %d" ,
179183 rank ));
@@ -251,8 +255,10 @@ int ompi_coll_base_barrier_intra_bruck(struct ompi_communicator_t *comm,
251255{
252256 int rank , size , distance , to , from , err , line = 0 ;
253257
254- rank = ompi_comm_rank (comm );
255258 size = ompi_comm_size (comm );
259+ if ( 1 == size )
260+ return MPI_SUCCESS ;
261+ rank = ompi_comm_rank (comm );
256262 OPAL_OUTPUT ((ompi_coll_base_framework .framework_output ,
257263 "ompi_coll_base_barrier_intra_bruck rank %d" , rank ));
258264
@@ -285,16 +291,19 @@ int ompi_coll_base_barrier_intra_bruck(struct ompi_communicator_t *comm,
285291int ompi_coll_base_barrier_intra_two_procs (struct ompi_communicator_t * comm ,
286292 mca_coll_base_module_t * module )
287293{
288- int remote , err ;
294+ int remote , size , err ;
295+
296+ size = ompi_comm_size (comm );
297+ if ( 1 == size )
298+ return MPI_SUCCESS ;
299+ if ( 2 != ompi_comm_size (comm ) ) {
300+ return MPI_ERR_UNSUPPORTED_OPERATION ;
301+ }
289302
290303 remote = ompi_comm_rank (comm );
291304 OPAL_OUTPUT ((ompi_coll_base_framework .framework_output ,
292305 "ompi_coll_base_barrier_intra_two_procs rank %d" , remote ));
293306
294- if (2 != ompi_comm_size (comm )) {
295- return MPI_ERR_UNSUPPORTED_OPERATION ;
296- }
297-
298307 remote = (remote + 1 ) & 0x1 ;
299308
300309 err = ompi_coll_base_sendrecv_zero (remote , MCA_COLL_BASE_TAG_BARRIER ,
@@ -324,8 +333,10 @@ int ompi_coll_base_barrier_intra_basic_linear(struct ompi_communicator_t *comm,
324333 int i , err , rank , size , line ;
325334 ompi_request_t * * requests = NULL ;
326335
327- rank = ompi_comm_rank (comm );
328336 size = ompi_comm_size (comm );
337+ if ( 1 == size )
338+ return MPI_SUCCESS ;
339+ rank = ompi_comm_rank (comm );
329340
330341 /* All non-root send & receive zero-length message. */
331342 if (rank > 0 ) {
@@ -367,11 +378,21 @@ int ompi_coll_base_barrier_intra_basic_linear(struct ompi_communicator_t *comm,
367378 /* All done */
368379 return MPI_SUCCESS ;
369380 err_hndl :
381+ if ( NULL != requests ) {
382+ /* find a real error code */
383+ if (MPI_ERR_IN_STATUS == err ) {
384+ for ( i = 0 ; i < size ; i ++ ) {
385+ if (MPI_REQUEST_NULL == requests [i ]) continue ;
386+ if (MPI_ERR_PENDING == requests [i ]-> req_status .MPI_ERROR ) continue ;
387+ err = requests [i ]-> req_status .MPI_ERROR ;
388+ break ;
389+ }
390+ }
391+ ompi_coll_base_free_reqs (requests , size );
392+ }
370393 OPAL_OUTPUT ( (ompi_coll_base_framework .framework_output ,"%s:%4d\tError occurred %d, rank %2d" ,
371394 __FILE__ , line , err , rank ) );
372395 (void )line ; // silence compiler warning
373- if ( NULL != requests )
374- ompi_coll_base_free_reqs (requests , size );
375396 return err ;
376397}
377398/* copied function (with appropriate renaming) ends here */
@@ -385,8 +406,10 @@ int ompi_coll_base_barrier_intra_tree(struct ompi_communicator_t *comm,
385406{
386407 int rank , size , depth , err , jump , partner ;
387408
388- rank = ompi_comm_rank (comm );
389409 size = ompi_comm_size (comm );
410+ if ( 1 == size )
411+ return MPI_SUCCESS ;
412+ rank = ompi_comm_rank (comm );
390413 OPAL_OUTPUT ((ompi_coll_base_framework .framework_output ,
391414 "ompi_coll_base_barrier_intra_tree %d" ,
392415 rank ));
0 commit comments