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-2015 The University of Tennessee and The University
6+ * Copyright (c) 2004-2016 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,
@@ -43,7 +43,7 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
4343{
4444 mca_coll_base_module_t * base_module = (mca_coll_base_module_t * ) module ;
4545 int i , j , size , rank , err = MPI_SUCCESS , line ;
46- MPI_Request * preq ;
46+ ompi_request_t * * preq , * * reqs ;
4747 char * tmp_buffer ;
4848 size_t max_size ;
4949 ptrdiff_t ext , true_lb , true_ext ;
@@ -63,18 +63,19 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
6363 ompi_datatype_get_true_extent ( rdtype , & true_lb , & true_ext );
6464 max_size = true_ext + ext * (rcount - 1 );
6565
66+ /* Initiate all send/recv to/from others. */
67+ reqs = coll_base_comm_get_reqs (base_module -> base_data , 2 );
68+ if ( NULL == reqs ) { err = OMPI_ERR_OUT_OF_RESOURCE ; line = __LINE__ ; goto error_hndl ; }
69+
6670 /* Allocate a temporary buffer */
6771 tmp_buffer = calloc (max_size , 1 );
68- if (NULL == tmp_buffer ) {
69- return OMPI_ERR_OUT_OF_RESOURCE ;
70- }
72+ if (NULL == tmp_buffer ) { return OMPI_ERR_OUT_OF_RESOURCE ; }
7173 max_size = ext * rcount ;
7274
7375 /* in-place alltoall slow algorithm (but works) */
7476 for (i = 0 ; i < size ; ++ i ) {
7577 for (j = i + 1 ; j < size ; ++ j ) {
76- /* Initiate all send/recv to/from others. */
77- preq = coll_base_comm_get_reqs (base_module -> base_data , size * 2 );
78+ preq = reqs ;
7879
7980 if (i == rank ) {
8081 /* Copy the data into the temporary buffer */
@@ -111,7 +112,7 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
111112 }
112113
113114 /* Wait for the requests to complete */
114- err = ompi_request_wait_all (2 , base_module -> base_data -> mcct_reqs , MPI_STATUSES_IGNORE );
115+ err = ompi_request_wait_all (2 , reqs , MPI_STATUSES_IGNORE );
115116 if (MPI_SUCCESS != err ) { line = __LINE__ ; goto error_hndl ; }
116117 }
117118 }
@@ -124,7 +125,7 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
124125 OPAL_OUTPUT ((ompi_coll_base_framework .framework_output ,
125126 "%s:%4d\tError occurred %d, rank %2d" , __FILE__ , line , err ,
126127 rank ));
127- ompi_coll_base_free_reqs (base_module -> base_data -> mcct_reqs , 2 );
128+ ompi_coll_base_free_reqs (reqs , 2 );
128129 }
129130
130131 /* All done */
@@ -399,20 +400,20 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
399400
400401 /* Post first batch or ireceive and isend requests */
401402 for (nreqs = 0 , nrreqs = 0 , ri = (rank + 1 ) % size ; nreqs < total_reqs ;
402- ri = (ri + 1 ) % size , ++ nreqs , ++ nrreqs ) {
403- error =
404- MCA_PML_CALL (irecv
405- (prcv + (ptrdiff_t )ri * rext , rcount , rdtype , ri ,
406- MCA_COLL_BASE_TAG_ALLTOALL , comm , & reqs [nreqs ]));
403+ ri = (ri + 1 ) % size , ++ nrreqs ) {
404+ nreqs ++ ;
405+ error = MCA_PML_CALL (irecv
406+ (prcv + (ptrdiff_t )ri * rext , rcount , rdtype , ri ,
407+ MCA_COLL_BASE_TAG_ALLTOALL , comm , & reqs [nreqs ]));
407408 if (MPI_SUCCESS != error ) { line = __LINE__ ; goto error_hndl ; }
408409 }
409- for ( nsreqs = 0 , si = (rank + size - 1 ) % size ; nreqs < 2 * total_reqs ;
410- si = (si + size - 1 ) % size , ++ nreqs , ++ nsreqs ) {
411- error =
412- MCA_PML_CALL (isend
413- (psnd + (ptrdiff_t )si * sext , scount , sdtype , si ,
414- MCA_COLL_BASE_TAG_ALLTOALL ,
415- MCA_PML_BASE_SEND_STANDARD , comm , & reqs [nreqs ]));
410+ for (nsreqs = 0 , si = (rank + size - 1 ) % size ; nreqs < 2 * total_reqs ;
411+ si = (si + size - 1 ) % size , ++ nsreqs ) {
412+ nreqs ++ ;
413+ error = MCA_PML_CALL (isend
414+ (psnd + (ptrdiff_t )si * sext , scount , sdtype , si ,
415+ MCA_COLL_BASE_TAG_ALLTOALL ,
416+ MCA_PML_BASE_SEND_STANDARD , comm , & reqs [nreqs ]));
416417 if (MPI_SUCCESS != error ) { line = __LINE__ ; goto error_hndl ; }
417418 }
418419
@@ -440,11 +441,10 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
440441 ncreqs ++ ;
441442 if (completed < total_reqs ) {
442443 if (nrreqs < (size - 1 )) {
443- error =
444- MCA_PML_CALL (irecv
445- (prcv + (ptrdiff_t )ri * rext , rcount , rdtype , ri ,
446- MCA_COLL_BASE_TAG_ALLTOALL , comm ,
447- & reqs [completed ]));
444+ error = MCA_PML_CALL (irecv
445+ (prcv + (ptrdiff_t )ri * rext , rcount , rdtype , ri ,
446+ MCA_COLL_BASE_TAG_ALLTOALL , comm ,
447+ & reqs [completed ]));
448448 if (MPI_SUCCESS != error ) { line = __LINE__ ; goto error_hndl ; }
449449 ++ nrreqs ;
450450 ri = (ri + 1 ) % size ;
@@ -456,6 +456,7 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
456456 MCA_COLL_BASE_TAG_ALLTOALL ,
457457 MCA_PML_BASE_SEND_STANDARD , comm ,
458458 & reqs [completed ]));
459+ if (MPI_SUCCESS != error ) { line = __LINE__ ; goto error_hndl ; }
459460 ++ nsreqs ;
460461 si = (si + size - 1 ) % size ;
461462 }
@@ -470,7 +471,7 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
470471 OPAL_OUTPUT ((ompi_coll_base_framework .framework_output ,
471472 "%s:%4d\tError occurred %d, rank %2d" , __FILE__ , line , error ,
472473 rank ));
473- ompi_coll_base_free_reqs (reqs , 2 * total_reqs );
474+ ompi_coll_base_free_reqs (reqs , nreqs );
474475 return error ;
475476}
476477
@@ -607,14 +608,16 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount,
607608 /* Initiate all send/recv to/from others. */
608609
609610 req = rreq = coll_base_comm_get_reqs (data , (size - 1 ) * 2 );
611+ if (NULL == req ) { err = OMPI_ERR_OUT_OF_RESOURCE ; line = __LINE__ ; goto err_hndl ; }
610612
611613 prcv = (char * ) rbuf ;
612614 psnd = (char * ) sbuf ;
613615
614616 /* Post all receives first -- a simple optimization */
615617
616618 for (nreqs = 0 , i = (rank + 1 ) % size ; i != rank ;
617- i = (i + 1 ) % size , ++ rreq , ++ nreqs ) {
619+ i = (i + 1 ) % size , ++ rreq ) {
620+ nreqs ++ ;
618621 err = MCA_PML_CALL (irecv_init
619622 (prcv + (ptrdiff_t )i * rcvinc , rcount , rdtype , i ,
620623 MCA_COLL_BASE_TAG_ALLTOALL , comm , rreq ));
@@ -627,7 +630,8 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount,
627630 */
628631 sreq = rreq ;
629632 for (i = (rank + size - 1 ) % size ; i != rank ;
630- i = (i + size - 1 ) % size , ++ sreq , ++ nreqs ) {
633+ i = (i + size - 1 ) % size , ++ sreq ) {
634+ nreqs ++ ;
631635 err = MCA_PML_CALL (isend_init
632636 (psnd + (ptrdiff_t )i * sndinc , scount , sdtype , i ,
633637 MCA_COLL_BASE_TAG_ALLTOALL ,
0 commit comments