3
3
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
4
4
* University Research and Technology
5
5
* 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
7
7
* of Tennessee Research Foundation. All rights
8
8
* reserved.
9
9
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
@@ -44,7 +44,7 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
44
44
mca_coll_base_module_t * base_module = (mca_coll_base_module_t * ) module ;
45
45
int i , j , size , rank , err = MPI_SUCCESS , line ;
46
46
OPAL_PTRDIFF_TYPE ext , gap ;
47
- MPI_Request * preq ;
47
+ ompi_request_t * * preq , * * reqs ;
48
48
char * tmp_buffer ;
49
49
size_t max_size ;
50
50
@@ -62,19 +62,20 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
62
62
ompi_datatype_type_extent (rdtype , & ext );
63
63
max_size = opal_datatype_span (& rdtype -> super , rcount , & gap );
64
64
65
+ /* Initiate all send/recv to/from others. */
66
+ reqs = coll_base_comm_get_reqs (base_module -> base_data , 2 );
67
+ if ( NULL == reqs ) { err = OMPI_ERR_OUT_OF_RESOURCE ; line = __LINE__ ; goto error_hndl ; }
68
+
65
69
/* Allocate a temporary buffer */
66
70
tmp_buffer = calloc (max_size , 1 );
67
- if (NULL == tmp_buffer ) {
68
- return OMPI_ERR_OUT_OF_RESOURCE ;
69
- }
71
+ if (NULL == tmp_buffer ) { return OMPI_ERR_OUT_OF_RESOURCE ; }
70
72
tmp_buffer -= gap ;
71
73
max_size = ext * rcount ;
72
74
73
75
/* in-place alltoall slow algorithm (but works) */
74
76
for (i = 0 ; i < size ; ++ i ) {
75
77
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 ;
78
79
79
80
if (i == rank ) {
80
81
/* Copy the data into the temporary buffer */
@@ -111,7 +112,7 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
111
112
}
112
113
113
114
/* 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 );
115
116
if (MPI_SUCCESS != err ) { line = __LINE__ ; goto error_hndl ; }
116
117
}
117
118
}
@@ -125,7 +126,7 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
125
126
"%s:%4d\tError occurred %d, rank %2d" , __FILE__ , line , err ,
126
127
rank ));
127
128
(void )line ; // silence compiler warning
128
- ompi_coll_base_free_reqs (base_module -> base_data -> mcct_reqs , 2 );
129
+ ompi_coll_base_free_reqs (reqs , 2 );
129
130
}
130
131
131
132
/* All done */
@@ -400,20 +401,20 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
400
401
401
402
/* Post first batch or ireceive and isend requests */
402
403
for (nreqs = 0 , nrreqs = 0 , ri = (rank + 1 ) % size ; nreqs < total_reqs ;
403
- ri = (ri + 1 ) % size , ++ nreqs , ++ nrreqs ) {
404
- error =
405
- MCA_PML_CALL (irecv
406
- (prcv + (ptrdiff_t )ri * rext , rcount , rdtype , ri ,
407
- MCA_COLL_BASE_TAG_ALLTOALL , comm , & reqs [nreqs ]));
404
+ ri = (ri + 1 ) % size , ++ nrreqs ) {
405
+ nreqs ++ ;
406
+ error = MCA_PML_CALL (irecv
407
+ (prcv + (ptrdiff_t )ri * rext , rcount , rdtype , ri ,
408
+ MCA_COLL_BASE_TAG_ALLTOALL , comm , & reqs [nreqs ]));
408
409
if (MPI_SUCCESS != error ) { line = __LINE__ ; goto error_hndl ; }
409
410
}
410
- for ( nsreqs = 0 , si = (rank + size - 1 ) % size ; nreqs < 2 * total_reqs ;
411
- si = (si + size - 1 ) % size , ++ nreqs , ++ nsreqs ) {
412
- error =
413
- 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 ]));
411
+ for (nsreqs = 0 , si = (rank + size - 1 ) % size ; nreqs < 2 * total_reqs ;
412
+ si = (si + size - 1 ) % size , ++ nsreqs ) {
413
+ nreqs ++ ;
414
+ error = MCA_PML_CALL (isend
415
+ (psnd + (ptrdiff_t )si * sext , scount , sdtype , si ,
416
+ MCA_COLL_BASE_TAG_ALLTOALL ,
417
+ MCA_PML_BASE_SEND_STANDARD , comm , & reqs [nreqs ]));
417
418
if (MPI_SUCCESS != error ) { line = __LINE__ ; goto error_hndl ; }
418
419
}
419
420
@@ -441,11 +442,10 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
441
442
ncreqs ++ ;
442
443
if (completed < total_reqs ) {
443
444
if (nrreqs < (size - 1 )) {
444
- error =
445
- MCA_PML_CALL (irecv
446
- (prcv + (ptrdiff_t )ri * rext , rcount , rdtype , ri ,
447
- MCA_COLL_BASE_TAG_ALLTOALL , comm ,
448
- & reqs [completed ]));
445
+ error = MCA_PML_CALL (irecv
446
+ (prcv + (ptrdiff_t )ri * rext , rcount , rdtype , ri ,
447
+ MCA_COLL_BASE_TAG_ALLTOALL , comm ,
448
+ & reqs [completed ]));
449
449
if (MPI_SUCCESS != error ) { line = __LINE__ ; goto error_hndl ; }
450
450
++ nrreqs ;
451
451
ri = (ri + 1 ) % size ;
@@ -457,6 +457,7 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
457
457
MCA_COLL_BASE_TAG_ALLTOALL ,
458
458
MCA_PML_BASE_SEND_STANDARD , comm ,
459
459
& reqs [completed ]));
460
+ if (MPI_SUCCESS != error ) { line = __LINE__ ; goto error_hndl ; }
460
461
++ nsreqs ;
461
462
si = (si + size - 1 ) % size ;
462
463
}
@@ -472,7 +473,7 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
472
473
"%s:%4d\tError occurred %d, rank %2d" , __FILE__ , line , error ,
473
474
rank ));
474
475
(void )line ; // silence compiler warning
475
- ompi_coll_base_free_reqs (reqs , 2 * total_reqs );
476
+ ompi_coll_base_free_reqs (reqs , nreqs );
476
477
return error ;
477
478
}
478
479
@@ -610,14 +611,16 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount,
610
611
/* Initiate all send/recv to/from others. */
611
612
612
613
req = rreq = coll_base_comm_get_reqs (data , (size - 1 ) * 2 );
614
+ if (NULL == req ) { err = OMPI_ERR_OUT_OF_RESOURCE ; line = __LINE__ ; goto err_hndl ; }
613
615
614
616
prcv = (char * ) rbuf ;
615
617
psnd = (char * ) sbuf ;
616
618
617
619
/* Post all receives first -- a simple optimization */
618
620
619
621
for (nreqs = 0 , i = (rank + 1 ) % size ; i != rank ;
620
- i = (i + 1 ) % size , ++ rreq , ++ nreqs ) {
622
+ i = (i + 1 ) % size , ++ rreq ) {
623
+ nreqs ++ ;
621
624
err = MCA_PML_CALL (irecv_init
622
625
(prcv + (ptrdiff_t )i * rcvinc , rcount , rdtype , i ,
623
626
MCA_COLL_BASE_TAG_ALLTOALL , comm , rreq ));
@@ -630,7 +633,8 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount,
630
633
*/
631
634
sreq = rreq ;
632
635
for (i = (rank + size - 1 ) % size ; i != rank ;
633
- i = (i + size - 1 ) % size , ++ sreq , ++ nreqs ) {
636
+ i = (i + size - 1 ) % size , ++ sreq ) {
637
+ nreqs ++ ;
634
638
err = MCA_PML_CALL (isend_init
635
639
(psnd + (ptrdiff_t )i * sndinc , scount , sdtype , i ,
636
640
MCA_COLL_BASE_TAG_ALLTOALL ,
0 commit comments