From a32460217495398f89c64f8f715ce661d2e149c7 Mon Sep 17 00:00:00 2001 From: George Bosilca Date: Sat, 19 Sep 2015 21:14:40 -0400 Subject: [PATCH 1/6] Never allocate a temporary array for the requests. Instead rely on the module_data to hold one with the largest necessary size. This array is only allocated when needed, and it is released upon communicator destruction. --- ompi/mca/coll/base/coll_base_alltoall.c | 53 ++++++++++++------------ ompi/mca/coll/base/coll_base_alltoallv.c | 17 ++++---- ompi/mca/coll/base/coll_base_barrier.c | 34 +++++++-------- ompi/mca/coll/base/coll_base_bcast.c | 28 +++++-------- ompi/mca/coll/base/coll_base_frame.c | 16 ++----- ompi/mca/coll/base/coll_base_functions.h | 10 ++++- ompi/mca/coll/base/coll_base_gather.c | 8 +--- ompi/mca/coll/base/coll_base_reduce.c | 15 +++---- 8 files changed, 82 insertions(+), 99 deletions(-) diff --git a/ompi/mca/coll/base/coll_base_alltoall.c b/ompi/mca/coll/base/coll_base_alltoall.c index 325377a892..90a35c52ba 100644 --- a/ompi/mca/coll/base/coll_base_alltoall.c +++ b/ompi/mca/coll/base/coll_base_alltoall.c @@ -42,7 +42,7 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount, mca_coll_base_module_t *module) { mca_coll_base_module_t *base_module = (mca_coll_base_module_t*) module; - int i, j, size, rank, err=MPI_SUCCESS; + int i, j, size, rank, err = MPI_SUCCESS, line; MPI_Request *preq; char *tmp_buffer; size_t max_size; @@ -78,39 +78,39 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount, /* Copy the data into the temporary buffer */ err = ompi_datatype_copy_content_same_ddt (rdtype, rcount, tmp_buffer, (char *) rbuf + j * max_size); - if (MPI_SUCCESS != err) { goto error_hndl; } + if (MPI_SUCCESS != err) { line = __LINE__; goto error_hndl; } /* Exchange data with the peer */ err = MCA_PML_CALL(irecv ((char *) rbuf + max_size * j, rcount, rdtype, j, MCA_COLL_BASE_TAG_ALLTOALL, comm, preq++)); - if (MPI_SUCCESS != err) { goto error_hndl; } + if (MPI_SUCCESS != err) { line = __LINE__; goto error_hndl; } err = MCA_PML_CALL(isend ((char *) tmp_buffer, rcount, rdtype, j, MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, preq++)); - if (MPI_SUCCESS != err) { goto error_hndl; } + if (MPI_SUCCESS != err) { line = __LINE__; goto error_hndl; } } else if (j == rank) { /* Copy the data into the temporary buffer */ err = ompi_datatype_copy_content_same_ddt (rdtype, rcount, tmp_buffer, (char *) rbuf + i * max_size); - if (MPI_SUCCESS != err) { goto error_hndl; } + if (MPI_SUCCESS != err) { line = __LINE__; goto error_hndl; } /* Exchange data with the peer */ err = MCA_PML_CALL(irecv ((char *) rbuf + max_size * i, rcount, rdtype, i, MCA_COLL_BASE_TAG_ALLTOALL, comm, preq++)); - if (MPI_SUCCESS != err) { goto error_hndl; } + if (MPI_SUCCESS != err) { line = __LINE__; goto error_hndl; } err = MCA_PML_CALL(isend ((char *) tmp_buffer, rcount, rdtype, i, MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, preq++)); - if (MPI_SUCCESS != err) { goto error_hndl; } + if (MPI_SUCCESS != err) { line = __LINE__; goto error_hndl; } } else { continue; } /* Wait for the requests to complete */ err = ompi_request_wait_all (2, base_module->base_data->mcct_reqs, MPI_STATUSES_IGNORE); - if (MPI_SUCCESS != err) { goto error_hndl; } + if (MPI_SUCCESS != err) { line = __LINE__; goto error_hndl; } } } @@ -118,8 +118,14 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount, /* Free the temporary buffer */ free (tmp_buffer); - /* All done */ + if( MPI_SUCCESS != err ) { + OPAL_OUTPUT((ompi_coll_base_framework.framework_output, + "%s:%4d\tError occurred %d, rank %2d", __FILE__, line, err, + rank)); + ompi_coll_base_free_reqs(base_module->base_data->mcct_reqs, 2); + } + /* All done */ return err; } @@ -383,8 +389,7 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount, total_reqs = (((max_outstanding_reqs > (size - 1)) || (max_outstanding_reqs <= 0)) ? (size - 1) : (max_outstanding_reqs)); - reqs = (ompi_request_t**) malloc( 2 * total_reqs * - sizeof(ompi_request_t*)); + reqs = coll_base_comm_get_reqs(module->base_data, 2 * total_reqs); if (NULL == reqs) { error = -1; line = __LINE__; goto error_hndl; } prcv = (char *) rbuf; @@ -456,9 +461,6 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount, } } - /* Free the reqs */ - free(reqs); - /* All done */ return MPI_SUCCESS; @@ -466,7 +468,7 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount, OPAL_OUTPUT((ompi_coll_base_framework.framework_output, "%s:%4d\tError occurred %d, rank %2d", __FILE__, line, error, rank)); - if (NULL != reqs) free(reqs); + ompi_coll_base_free_reqs(reqs, 2 * total_reqs); return error; } @@ -552,7 +554,7 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - int i, rank, size, err, nreqs; + int i, rank, size, err, nreqs, line; char *psnd, *prcv; MPI_Aint lb, sndinc, rcvinc; ompi_request_t **req, **sreq, **rreq; @@ -614,10 +616,7 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount, err = MCA_PML_CALL(irecv_init (prcv + (ptrdiff_t)i * rcvinc, rcount, rdtype, i, MCA_COLL_BASE_TAG_ALLTOALL, comm, rreq)); - if (MPI_SUCCESS != err) { - ompi_coll_base_free_reqs(req, nreqs); - return err; - } + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } } /* Now post all sends in reverse order @@ -631,10 +630,7 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount, (psnd + (ptrdiff_t)i * sndinc, scount, sdtype, i, MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, sreq)); - if (MPI_SUCCESS != err) { - ompi_coll_base_free_reqs(req, nreqs); - return err; - } + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } } /* Start your engines. This will never return an error. */ @@ -650,8 +646,13 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount, err = ompi_request_wait_all(nreqs, req, MPI_STATUSES_IGNORE); - /* Free the reqs */ - ompi_coll_base_free_reqs(req, nreqs); + err_hndl: + if( MPI_SUCCESS != err ) { + OPAL_OUTPUT( (ompi_coll_base_framework.framework_output,"%s:%4d\tError occurred %d, rank %2d", + __FILE__, line, err, rank) ); + /* Free the reqs */ + ompi_coll_base_free_reqs(req, nreqs); + } /* All done */ return err; diff --git a/ompi/mca/coll/base/coll_base_alltoallv.c b/ompi/mca/coll/base/coll_base_alltoallv.c index 55bd5b62f0..6d69c9eccc 100644 --- a/ompi/mca/coll/base/coll_base_alltoallv.c +++ b/ompi/mca/coll/base/coll_base_alltoallv.c @@ -123,9 +123,11 @@ mca_coll_base_alltoallv_intra_basic_inplace(const void *rbuf, const int *rcounts error_hndl: /* Free the temporary buffer */ free (tmp_buffer); + if( MPI_SUCCESS != err ) { + ompi_coll_base_free_reqs(base_module->base_data->mcct_reqs, 2 ); + } /* All done */ - return err; } @@ -253,8 +255,7 @@ ompi_coll_base_alltoallv_intra_basic_linear(const void *sbuf, const int *scounts preq++)); ++nreqs; if (MPI_SUCCESS != err) { - ompi_coll_base_free_reqs(data->mcct_reqs, nreqs); - return err; + goto err_hndl; } } @@ -271,8 +272,7 @@ ompi_coll_base_alltoallv_intra_basic_linear(const void *sbuf, const int *scounts preq++)); ++nreqs; if (MPI_SUCCESS != err) { - ompi_coll_base_free_reqs(data->mcct_reqs, nreqs); - return err; + goto err_hndl; } } @@ -287,9 +287,10 @@ ompi_coll_base_alltoallv_intra_basic_linear(const void *sbuf, const int *scounts * error after we free everything. */ err = ompi_request_wait_all(nreqs, data->mcct_reqs, MPI_STATUSES_IGNORE); - - /* Free the requests. */ - ompi_coll_base_free_reqs(data->mcct_reqs, nreqs); + err_hndl: + if( MPI_SUCCESS != err ) { /* Free the requests. */ + ompi_coll_base_free_reqs(data->mcct_reqs, nreqs); + } return err; } diff --git a/ompi/mca/coll/base/coll_base_barrier.c b/ompi/mca/coll/base/coll_base_barrier.c index 1896f23e22..7aafd8d6a6 100644 --- a/ompi/mca/coll/base/coll_base_barrier.c +++ b/ompi/mca/coll/base/coll_base_barrier.c @@ -324,7 +324,8 @@ int ompi_coll_base_barrier_intra_two_procs(struct ompi_communicator_t *comm, int ompi_coll_base_barrier_intra_basic_linear(struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - int i, err, rank, size; + int i, err, rank, size, line; + ompi_request_t** requests = NULL; rank = ompi_comm_rank(comm); size = ompi_comm_size(comm); @@ -334,50 +335,43 @@ int ompi_coll_base_barrier_intra_basic_linear(struct ompi_communicator_t *comm, err = MCA_PML_CALL(send (NULL, 0, MPI_BYTE, 0, MCA_COLL_BASE_TAG_BARRIER, MCA_PML_BASE_SEND_STANDARD, comm)); - if (MPI_SUCCESS != err) { - return err; - } + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } err = MCA_PML_CALL(recv (NULL, 0, MPI_BYTE, 0, MCA_COLL_BASE_TAG_BARRIER, comm, MPI_STATUS_IGNORE)); - if (MPI_SUCCESS != err) { - return err; - } + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } } /* The root collects and broadcasts the messages. */ else { - ompi_request_t** requests; - - requests = (ompi_request_t**)malloc( size * sizeof(ompi_request_t*) ); + requests = coll_base_comm_get_reqs(module->base_data, size); for (i = 1; i < size; ++i) { err = MCA_PML_CALL(irecv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE, MCA_COLL_BASE_TAG_BARRIER, comm, &(requests[i]))); - if (MPI_SUCCESS != err) { - return err; - } + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } } ompi_request_wait_all( size-1, requests+1, MPI_STATUSES_IGNORE ); + requests = NULL; /* we're done the requests array is clean */ for (i = 1; i < size; ++i) { err = MCA_PML_CALL(send(NULL, 0, MPI_BYTE, i, MCA_COLL_BASE_TAG_BARRIER, MCA_PML_BASE_SEND_STANDARD, comm)); - if (MPI_SUCCESS != err) { - return err; - } + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } } - - free( requests ); } /* All done */ - return MPI_SUCCESS; - + err_hndl: + OPAL_OUTPUT( (ompi_coll_base_framework.framework_output,"%s:%4d\tError occurred %d, rank %2d", + __FILE__, line, err, rank) ); + if( NULL != requests ) + ompi_coll_base_free_reqs(requests, size-1); + return err; } /* copied function (with appropriate renaming) ends here */ diff --git a/ompi/mca/coll/base/coll_base_bcast.c b/ompi/mca/coll/base/coll_base_bcast.c index 0480b95f8d..ffb151e179 100644 --- a/ompi/mca/coll/base/coll_base_bcast.c +++ b/ompi/mca/coll/base/coll_base_bcast.c @@ -66,8 +66,7 @@ ompi_coll_base_bcast_intra_generic( void* buffer, #if !defined(COLL_BASE_BCAST_USE_BLOCKING) if( tree->tree_nextsize != 0 ) { - send_reqs = (ompi_request_t**)malloc( (ptrdiff_t)tree->tree_nextsize * - sizeof(ompi_request_t*) ); + send_reqs = coll_base_comm_get_reqs(module->base_data, tree->tree_nextsize); } #endif @@ -236,19 +235,16 @@ ompi_coll_base_bcast_intra_generic( void* buffer, if (err != MPI_SUCCESS) { line = __LINE__; goto error_hndl; } } -#if !defined(COLL_BASE_BCAST_USE_BLOCKING) - if( NULL != send_reqs ) free(send_reqs); -#endif - return (MPI_SUCCESS); error_hndl: OPAL_OUTPUT( (ompi_coll_base_framework.framework_output,"%s:%4d\tError occurred %d, rank %2d", __FILE__, line, err, rank) ); -#if !defined(COLL_BASE_BCAST_USE_BLOCKING) - if( NULL != send_reqs ) free(send_reqs); -#endif - return (err); + if( (MPI_SUCCESS != err) && (NULL != send_reqs) ) { + ompi_coll_base_free_reqs( send_reqs, tree->tree_nextsize); + } + + return err; } int @@ -665,10 +661,7 @@ ompi_coll_base_bcast_intra_basic_linear(void *buff, int count, MCA_COLL_BASE_TAG_BCAST, MCA_PML_BASE_SEND_STANDARD, comm, preq++)); - if (MPI_SUCCESS != err) { - ompi_coll_base_free_reqs(data->mcct_reqs, i); - return err; - } + if (MPI_SUCCESS != err) { goto err_hndl; } } --i; @@ -684,9 +677,10 @@ ompi_coll_base_bcast_intra_basic_linear(void *buff, int count, * the error after we free everything. */ err = ompi_request_wait_all(i, reqs, MPI_STATUSES_IGNORE); - - /* Free the reqs */ - ompi_coll_base_free_reqs(reqs, i); + err_hndl: + if( MPI_SUCCESS != err ) { /* Free the reqs */ + ompi_coll_base_free_reqs(reqs, i); + } /* All done */ return err; diff --git a/ompi/mca/coll/base/coll_base_frame.c b/ompi/mca/coll/base/coll_base_frame.c index a4e1038b10..b74fcbc04a 100644 --- a/ompi/mca/coll/base/coll_base_frame.c +++ b/ompi/mca/coll/base/coll_base_frame.c @@ -83,10 +83,7 @@ static void coll_base_comm_destruct(mca_coll_base_comm_t *data) { if( NULL != data->mcct_reqs ) { - for( int i = 0; i < data->mcct_num_reqs; ++i ) { - if( MPI_REQUEST_NULL != data->mcct_reqs[i] ) - ompi_request_free(&data->mcct_reqs[i]); - } + ompi_coll_base_free_reqs( data->mcct_reqs, data->mcct_num_reqs ); free(data->mcct_reqs); data->mcct_reqs = NULL; data->mcct_num_reqs = 0; @@ -122,18 +119,13 @@ OBJ_CLASS_INSTANCE(mca_coll_base_comm_t, opal_object_t, ompi_request_t** coll_base_comm_get_reqs(mca_coll_base_comm_t* data, int nreqs) { - int startfrom = data->mcct_num_reqs; - - if( NULL == data->mcct_reqs ) { - assert(0 == data->mcct_num_reqs); - data->mcct_reqs = (ompi_request_t**)malloc(sizeof(ompi_request_t*) * nreqs); - } else if( data->mcct_num_reqs <= nreqs ) { + if( data->mcct_num_reqs <= nreqs ) { data->mcct_reqs = (ompi_request_t**)realloc(data->mcct_reqs, sizeof(ompi_request_t*) * nreqs); } if( NULL != data->mcct_reqs ) { - data->mcct_num_reqs = nreqs; - for( int i = startfrom; i < data->mcct_num_reqs; i++ ) + for( int i = data->mcct_num_reqs; i < nreqs; i++ ) data->mcct_reqs[i] = MPI_REQUEST_NULL; + data->mcct_num_reqs = nreqs; } else data->mcct_num_reqs = 0; /* nothing to return */ return data->mcct_reqs; diff --git a/ompi/mca/coll/base/coll_base_functions.h b/ompi/mca/coll/base/coll_base_functions.h index 58c086026c..2387c67580 100644 --- a/ompi/mca/coll/base/coll_base_functions.h +++ b/ompi/mca/coll/base/coll_base_functions.h @@ -343,11 +343,19 @@ struct mca_coll_base_comm_t { typedef struct mca_coll_base_comm_t mca_coll_base_comm_t; OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_coll_base_comm_t); +/** + * Free all requests in an array. As these requests are usually used during + * collective communications, and as on a succesful collective they are + * expected to be released during the corresponding wait, the array should + * generally be empty. However, this function might be used on error conditions + * where it will allow a correct cleanup. + */ static inline void ompi_coll_base_free_reqs(ompi_request_t **reqs, int count) { int i; for (i = 0; i < count; ++i) - ompi_request_free(&reqs[i]); + if( MPI_REQUEST_NULL != reqs[i] ) + ompi_request_free(&reqs[i]); } /** diff --git a/ompi/mca/coll/base/coll_base_gather.c b/ompi/mca/coll/base/coll_base_gather.c index 854148b9b1..bd2004f80f 100644 --- a/ompi/mca/coll/base/coll_base_gather.c +++ b/ompi/mca/coll/base/coll_base_gather.c @@ -266,7 +266,7 @@ ompi_coll_base_gather_intra_linear_sync(const void *sbuf, int scount, */ char *ptmp; ompi_request_t *first_segment_req; - reqs = (ompi_request_t**) calloc(size, sizeof(ompi_request_t*)); + reqs = coll_base_comm_get_reqs(module->base_data, size); if (NULL == reqs) { ret = -1; line = __LINE__; goto error_hndl; } ompi_datatype_type_size(rdtype, &typelng); @@ -319,16 +319,13 @@ ompi_coll_base_gather_intra_linear_sync(const void *sbuf, int scount, /* wait all second segments to complete */ ret = ompi_request_wait_all(size, reqs, MPI_STATUSES_IGNORE); if (ret != MPI_SUCCESS) { line = __LINE__; goto error_hndl; } - - free(reqs); } /* All done */ - return MPI_SUCCESS; error_hndl: if (NULL != reqs) { - free(reqs); + ompi_coll_base_free_reqs(reqs, size); } OPAL_OUTPUT (( ompi_coll_base_framework.framework_output, "ERROR_HNDL: node %d file %s line %d error %d\n", @@ -405,7 +402,6 @@ ompi_coll_base_gather_intra_basic_linear(const void *sbuf, int scount, } /* All done */ - return MPI_SUCCESS; } diff --git a/ompi/mca/coll/base/coll_base_reduce.c b/ompi/mca/coll/base/coll_base_reduce.c index afc2009f2c..b6ea005f3f 100644 --- a/ompi/mca/coll/base/coll_base_reduce.c +++ b/ompi/mca/coll/base/coll_base_reduce.c @@ -56,10 +56,10 @@ int ompi_coll_base_reduce_generic( const void* sendbuf, void* recvbuf, int origi char *accumbuf = NULL, *accumbuf_free = NULL; char *local_op_buffer = NULL, *sendtmpbuf = NULL; ptrdiff_t extent, lower_bound, segment_increment; - size_t typelng; - ompi_request_t* reqs[2] = {MPI_REQUEST_NULL, MPI_REQUEST_NULL}; + ompi_request_t **sreq = NULL, *reqs[2] = {MPI_REQUEST_NULL, MPI_REQUEST_NULL}; int num_segments, line, ret, segindex, i, rank; int recvcount, prevcount, inbi; + size_t typelng; /** * Determine number of segments and number of elements @@ -279,10 +279,8 @@ int ompi_coll_base_reduce_generic( const void* sendbuf, void* recvbuf, int origi else { int creq = 0; - ompi_request_t **sreq = NULL; - sreq = (ompi_request_t**) calloc( max_outstanding_reqs, - sizeof(ompi_request_t*) ); + sreq = coll_base_comm_get_reqs(module->base_data, max_outstanding_reqs); if (NULL == sreq) { line = __LINE__; ret = -1; goto error_hndl; } /* post first group of requests */ @@ -303,7 +301,6 @@ int ompi_coll_base_reduce_generic( const void* sendbuf, void* recvbuf, int origi /* wait on a posted request to complete */ ret = ompi_request_wait(&sreq[creq], MPI_STATUS_IGNORE); if (ret != MPI_SUCCESS) { line = __LINE__; goto error_hndl; } - sreq[creq] = MPI_REQUEST_NULL; if( original_count < count_by_segment ) { count_by_segment = original_count; @@ -325,9 +322,6 @@ int ompi_coll_base_reduce_generic( const void* sendbuf, void* recvbuf, int origi ret = ompi_request_wait_all( max_outstanding_reqs, sreq, MPI_STATUSES_IGNORE ); if (ret != MPI_SUCCESS) { line = __LINE__; goto error_hndl; } - - /* free requests */ - free(sreq); } } return OMPI_SUCCESS; @@ -339,6 +333,9 @@ int ompi_coll_base_reduce_generic( const void* sendbuf, void* recvbuf, int origi if( inbuf_free[0] != NULL ) free(inbuf_free[0]); if( inbuf_free[1] != NULL ) free(inbuf_free[1]); if( accumbuf_free != NULL ) free(accumbuf); + if( NULL != sreq ) { + ompi_coll_base_free_reqs(sreq, max_outstanding_reqs); + } return ret; } From 01b32caf980e3b4961f425cad374f10448683faf Mon Sep 17 00:00:00 2001 From: George Bosilca Date: Tue, 22 Sep 2015 03:32:24 +0200 Subject: [PATCH 2/6] Update the basic module to dynamically allocate the right number of requests. Remove unnecessary fields.We don't need these fields. --- ompi/mca/coll/base/coll_base_frame.c | 6 +- ompi/mca/coll/base/coll_base_functions.h | 6 +- ompi/mca/coll/basic/coll_basic.h | 28 ++++--- ompi/mca/coll/basic/coll_basic_allgather.c | 72 ++++++----------- ompi/mca/coll/basic/coll_basic_allreduce.c | 61 ++++++-------- ompi/mca/coll/basic/coll_basic_alltoall.c | 13 +-- ompi/mca/coll/basic/coll_basic_alltoallv.c | 13 +-- ompi/mca/coll/basic/coll_basic_alltoallw.c | 62 +++++++------- ompi/mca/coll/basic/coll_basic_bcast.c | 21 ++--- ompi/mca/coll/basic/coll_basic_gatherv.c | 10 ++- ompi/mca/coll/basic/coll_basic_module.c | 3 - .../basic/coll_basic_neighbor_allgather.c | 58 ++++++++------ .../basic/coll_basic_neighbor_allgatherv.c | 68 +++++++++------- .../coll/basic/coll_basic_neighbor_alltoall.c | 80 +++++++++++-------- .../basic/coll_basic_neighbor_alltoallv.c | 80 +++++++++++-------- .../basic/coll_basic_neighbor_alltoallw.c | 80 +++++++++++-------- ompi/mca/coll/basic/coll_basic_scatter.c | 13 +-- ompi/mca/coll/basic/coll_basic_scatterv.c | 10 ++- ompi/mca/coll/self/coll_self.h | 3 - 19 files changed, 363 insertions(+), 324 deletions(-) diff --git a/ompi/mca/coll/base/coll_base_frame.c b/ompi/mca/coll/base/coll_base_frame.c index b74fcbc04a..b293780df2 100644 --- a/ompi/mca/coll/base/coll_base_frame.c +++ b/ompi/mca/coll/base/coll_base_frame.c @@ -119,9 +119,11 @@ OBJ_CLASS_INSTANCE(mca_coll_base_comm_t, opal_object_t, ompi_request_t** coll_base_comm_get_reqs(mca_coll_base_comm_t* data, int nreqs) { - if( data->mcct_num_reqs <= nreqs ) { + if( 0 == nreqs ) return NULL; + + if( data->mcct_num_reqs <= nreqs ) data->mcct_reqs = (ompi_request_t**)realloc(data->mcct_reqs, sizeof(ompi_request_t*) * nreqs); - } + if( NULL != data->mcct_reqs ) { for( int i = data->mcct_num_reqs; i < nreqs; i++ ) data->mcct_reqs[i] = MPI_REQUEST_NULL; diff --git a/ompi/mca/coll/base/coll_base_functions.h b/ompi/mca/coll/base/coll_base_functions.h index 2387c67580..0aeb2d2c2d 100644 --- a/ompi/mca/coll/base/coll_base_functions.h +++ b/ompi/mca/coll/base/coll_base_functions.h @@ -353,9 +353,11 @@ OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_coll_base_comm_t); static inline void ompi_coll_base_free_reqs(ompi_request_t **reqs, int count) { int i; - for (i = 0; i < count; ++i) - if( MPI_REQUEST_NULL != reqs[i] ) + for (i = 0; i < count; ++i) { + if( MPI_REQUEST_NULL != reqs[i] ) { ompi_request_free(&reqs[i]); + } + } } /** diff --git a/ompi/mca/coll/basic/coll_basic.h b/ompi/mca/coll/basic/coll_basic.h index c4b8f6c362..78b9c231b3 100644 --- a/ompi/mca/coll/basic/coll_basic.h +++ b/ompi/mca/coll/basic/coll_basic.h @@ -283,17 +283,6 @@ BEGIN_C_DECLS int mca_coll_basic_ft_event(int status); -/* Utility functions */ - - static inline void mca_coll_basic_free_reqs(ompi_request_t ** reqs, - int count) - { - int i; - for (i = 0; i < count; ++i) - ompi_request_free(&reqs[i]); - } - - struct mca_coll_basic_module_t { mca_coll_base_module_t super; @@ -303,6 +292,23 @@ struct mca_coll_basic_module_t { typedef struct mca_coll_basic_module_t mca_coll_basic_module_t; OBJ_CLASS_DECLARATION(mca_coll_basic_module_t); +/* Utility functions */ + +static inline void mca_coll_basic_free_reqs(ompi_request_t ** reqs, int count) +{ + int i; + for (i = 0; i < count; ++i) + if( MPI_REQUEST_NULL != reqs[i] ) { + ompi_request_free(&reqs[i]); + } +} + +/** + * Return the array of requests on the data. If the array was not initialized + * or if it's size was too small, allocate it to fit the requested size. + */ +ompi_request_t** mca_coll_basic_get_reqs(mca_coll_basic_module_t* data, int nreqs); + END_C_DECLS #endif /* MCA_COLL_BASIC_EXPORT_H */ diff --git a/ompi/mca/coll/basic/coll_basic_allgather.c b/ompi/mca/coll/basic/coll_basic_allgather.c index 7d0de48b8f..5d393c1626 100644 --- a/ompi/mca/coll/basic/coll_basic_allgather.c +++ b/ompi/mca/coll/basic/coll_basic_allgather.c @@ -47,12 +47,12 @@ mca_coll_basic_allgather_inter(const void *sbuf, int scount, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - int rank, root = 0, size, rsize, err, i; + int rank, root = 0, size, rsize, err, i, line; char *tmpbuf = NULL, *ptmp; ptrdiff_t rlb, slb, rextent, sextent, incr; ompi_request_t *req; mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; - ompi_request_t **reqs = basic_module->mccb_reqs; + ompi_request_t **reqs = NULL; rank = ompi_comm_rank(comm); size = ompi_comm_size(comm); @@ -71,35 +71,29 @@ mca_coll_basic_allgather_inter(const void *sbuf, int scount, err = MCA_PML_CALL(send(sbuf, scount, sdtype, root, MCA_COLL_BASE_TAG_ALLGATHER, MCA_PML_BASE_SEND_STANDARD, comm)); - if (OMPI_SUCCESS != err) { - return err; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } } else { /* receive a msg. from all other procs. */ err = ompi_datatype_get_extent(rdtype, &rlb, &rextent); - if (OMPI_SUCCESS != err) { - return err; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } err = ompi_datatype_get_extent(sdtype, &slb, &sextent); - if (OMPI_SUCCESS != err) { - return err; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } + + /* Get a requests arrays of the right size */ + reqs = mca_coll_basic_get_reqs(basic_module, rsize + 1); + if( NULL == reqs ) { line = __LINE__; goto exit; } /* Do a send-recv between the two root procs. to avoid deadlock */ err = MCA_PML_CALL(isend(sbuf, scount, sdtype, 0, MCA_COLL_BASE_TAG_ALLGATHER, MCA_PML_BASE_SEND_STANDARD, comm, &reqs[rsize])); - if (OMPI_SUCCESS != err) { - return err; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } err = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, 0, MCA_COLL_BASE_TAG_ALLGATHER, comm, &reqs[0])); - if (OMPI_SUCCESS != err) { - return err; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } incr = rextent * rcount; ptmp = (char *) rbuf + incr; @@ -107,45 +101,33 @@ mca_coll_basic_allgather_inter(const void *sbuf, int scount, err = MCA_PML_CALL(irecv(ptmp, rcount, rdtype, i, MCA_COLL_BASE_TAG_ALLGATHER, comm, &reqs[i])); - if (MPI_SUCCESS != err) { - return err; - } + if (MPI_SUCCESS != err) { line = __LINE__; goto exit; } } err = ompi_request_wait_all(rsize + 1, reqs, MPI_STATUSES_IGNORE); - if (OMPI_SUCCESS != err) { - return err; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } /* Step 2: exchange the resuts between the root processes */ tmpbuf = (char *) malloc(scount * size * sextent); - if (NULL == tmpbuf) { - return err; - } + if (NULL == tmpbuf) { line = __LINE__; goto exit; } err = MCA_PML_CALL(isend(rbuf, rsize * rcount, rdtype, 0, MCA_COLL_BASE_TAG_ALLGATHER, MCA_PML_BASE_SEND_STANDARD, comm, &req)); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } err = MCA_PML_CALL(recv(tmpbuf, size * scount, sdtype, 0, MCA_COLL_BASE_TAG_ALLGATHER, comm, MPI_STATUS_IGNORE)); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } err = ompi_request_wait( &req, MPI_STATUS_IGNORE); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } } /* Step 3: bcast the data to the remote group. This - * happens in both groups simultaniously, thus we can + * happens in both groups simultaneously, thus we can * not use coll_bcast (this would deadlock). */ if (rank != root) { @@ -153,9 +135,7 @@ mca_coll_basic_allgather_inter(const void *sbuf, int scount, err = MCA_PML_CALL(recv(rbuf, rsize * rcount, rdtype, 0, MCA_COLL_BASE_TAG_ALLGATHER, comm, MPI_STATUS_IGNORE)); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } } else { /* Send the data to every other process in the remote group @@ -165,19 +145,19 @@ mca_coll_basic_allgather_inter(const void *sbuf, int scount, MCA_COLL_BASE_TAG_ALLGATHER, MCA_PML_BASE_SEND_STANDARD, comm, &reqs[i - 1])); - if (OMPI_SUCCESS != err) { - goto exit; - } - + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } } err = ompi_request_wait_all(rsize - 1, reqs, MPI_STATUSES_IGNORE); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } } exit: + if( MPI_SUCCESS != err ) { + OPAL_OUTPUT( (ompi_coll_base_framework.framework_output,"%s:%4d\tError occurred %d, rank %2d", + __FILE__, line, err, rank) ); + if( NULL != reqs ) mca_coll_basic_free_reqs(reqs, rsize+1); + } if (NULL != tmpbuf) { free(tmpbuf); } diff --git a/ompi/mca/coll/basic/coll_basic_allreduce.c b/ompi/mca/coll/basic/coll_basic_allreduce.c index a319a429c4..ab5f9820b8 100644 --- a/ompi/mca/coll/basic/coll_basic_allreduce.c +++ b/ompi/mca/coll/basic/coll_basic_allreduce.c @@ -2,7 +2,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2014 The University of Tennessee and The University + * Copyright (c) 2004-2015 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -80,13 +80,13 @@ mca_coll_basic_allreduce_inter(const void *sbuf, void *rbuf, int count, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - int err, i, rank, root = 0, rsize; + int err, i, rank, root = 0, rsize, line; ptrdiff_t lb, extent; ptrdiff_t true_lb, true_extent; char *tmpbuf = NULL, *pml_buffer = NULL; ompi_request_t *req[2]; mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; - ompi_request_t **reqs = basic_module->mccb_reqs; + ompi_request_t **reqs = NULL; rank = ompi_comm_rank(comm); rsize = ompi_comm_remote_size(comm); @@ -111,41 +111,33 @@ mca_coll_basic_allreduce_inter(const void *sbuf, void *rbuf, int count, } tmpbuf = (char *) malloc(true_extent + (count - 1) * extent); - if (NULL == tmpbuf) { - return OMPI_ERR_OUT_OF_RESOURCE; - } + if (NULL == tmpbuf) { err = OMPI_ERR_OUT_OF_RESOURCE; line = __LINE__; goto exit; } pml_buffer = tmpbuf - true_lb; + reqs = mca_coll_basic_get_reqs(basic_module, rsize - 1); + if( NULL == reqs ) { err = OMPI_ERR_OUT_OF_RESOURCE; line = __LINE__; goto exit; } + /* Do a send-recv between the two root procs. to avoid deadlock */ err = MCA_PML_CALL(irecv(rbuf, count, dtype, 0, MCA_COLL_BASE_TAG_ALLREDUCE, comm, &(req[0]))); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } err = MCA_PML_CALL(isend(sbuf, count, dtype, 0, MCA_COLL_BASE_TAG_ALLREDUCE, MCA_PML_BASE_SEND_STANDARD, comm, &(req[1]))); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } err = ompi_request_wait_all(2, req, MPI_STATUSES_IGNORE); - if (OMPI_SUCCESS != err) { - goto exit; - } - + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } /* Loop receiving and calling reduction function (C or Fortran). */ for (i = 1; i < rsize; i++) { err = MCA_PML_CALL(recv(pml_buffer, count, dtype, i, MCA_COLL_BASE_TAG_ALLREDUCE, comm, MPI_STATUS_IGNORE)); - if (MPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } /* Perform the reduction */ ompi_op_reduce(op, pml_buffer, rbuf, count, dtype); @@ -155,9 +147,7 @@ mca_coll_basic_allreduce_inter(const void *sbuf, void *rbuf, int count, err = MCA_PML_CALL(send(sbuf, count, dtype, root, MCA_COLL_BASE_TAG_ALLREDUCE, MCA_PML_BASE_SEND_STANDARD, comm)); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } } @@ -171,21 +161,16 @@ mca_coll_basic_allreduce_inter(const void *sbuf, void *rbuf, int count, err = MCA_PML_CALL(irecv(pml_buffer, count, dtype, 0, MCA_COLL_BASE_TAG_ALLREDUCE, comm, &(req[1]))); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } err = MCA_PML_CALL(isend(rbuf, count, dtype, 0, MCA_COLL_BASE_TAG_ALLREDUCE, MCA_PML_BASE_SEND_STANDARD, comm, &(req[0]))); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } + err = ompi_request_wait_all(2, req, MPI_STATUSES_IGNORE); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } /* distribute the data to other processes in remote group. * Note that we start from 1 (not from zero), since zero @@ -198,17 +183,13 @@ mca_coll_basic_allreduce_inter(const void *sbuf, void *rbuf, int count, MCA_COLL_BASE_TAG_ALLREDUCE, MCA_PML_BASE_SEND_STANDARD, comm, &reqs[i - 1])); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } } err = ompi_request_wait_all(rsize - 1, reqs, MPI_STATUSES_IGNORE); - if (OMPI_SUCCESS != err) { - goto exit; - } + if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } } } else { err = MCA_PML_CALL(recv(rbuf, count, dtype, root, @@ -217,10 +198,14 @@ mca_coll_basic_allreduce_inter(const void *sbuf, void *rbuf, int count, } exit: + if( MPI_SUCCESS != err ) { + OPAL_OUTPUT((ompi_coll_base_framework.framework_output,"%s:%4d\tError occurred %d, rank %2d", __FILE__, + line, err, rank)); + mca_coll_basic_free_reqs(reqs, rsize - 1); + } if (NULL != tmpbuf) { free(tmpbuf); } - return err; } diff --git a/ompi/mca/coll/basic/coll_basic_alltoall.c b/ompi/mca/coll/basic/coll_basic_alltoall.c index 625c7f3146..80907cd39b 100644 --- a/ompi/mca/coll/basic/coll_basic_alltoall.c +++ b/ompi/mca/coll/basic/coll_basic_alltoall.c @@ -57,11 +57,7 @@ mca_coll_basic_alltoall_inter(const void *sbuf, int scount, MPI_Aint sndinc; MPI_Aint rcvinc; - ompi_request_t **req; - ompi_request_t **sreq; - ompi_request_t **rreq; - - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; + ompi_request_t **req, **sreq, **rreq; /* Initialize. */ @@ -81,7 +77,7 @@ mca_coll_basic_alltoall_inter(const void *sbuf, int scount, /* Initiate all send/recv to/from others. */ nreqs = size * 2; - req = rreq = basic_module->mccb_reqs; + req = rreq = mca_coll_basic_get_reqs( (mca_coll_basic_module_t*) module, nreqs); sreq = rreq + size; prcv = (char *) rbuf; @@ -92,6 +88,7 @@ mca_coll_basic_alltoall_inter(const void *sbuf, int scount, err = MCA_PML_CALL(irecv(prcv + (i * rcvinc), rcount, rdtype, i, MCA_COLL_BASE_TAG_ALLTOALL, comm, rreq)); if (OMPI_SUCCESS != err) { + mca_coll_basic_free_reqs(req, nreqs); return err; } } @@ -102,6 +99,7 @@ mca_coll_basic_alltoall_inter(const void *sbuf, int scount, MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, sreq)); if (OMPI_SUCCESS != err) { + mca_coll_basic_free_reqs(req, nreqs); return err; } } @@ -113,6 +111,9 @@ mca_coll_basic_alltoall_inter(const void *sbuf, int scount, * So free them anyway -- even if there was an error, and return * the error after we free everything. */ err = ompi_request_wait_all(nreqs, req, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != err) { + mca_coll_basic_free_reqs(req, nreqs); + } /* All done */ return err; diff --git a/ompi/mca/coll/basic/coll_basic_alltoallv.c b/ompi/mca/coll/basic/coll_basic_alltoallv.c index ef8f46ba2c..b2deef8cfe 100644 --- a/ompi/mca/coll/basic/coll_basic_alltoallv.c +++ b/ompi/mca/coll/basic/coll_basic_alltoallv.c @@ -57,8 +57,7 @@ mca_coll_basic_alltoallv_inter(const void *sbuf, const int *scounts, const int * MPI_Aint sndextent; MPI_Aint rcvextent; - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; - ompi_request_t **preq = basic_module->mccb_reqs; + ompi_request_t **preq; /* Initialize. */ @@ -69,6 +68,7 @@ mca_coll_basic_alltoallv_inter(const void *sbuf, const int *scounts, const int * /* Initiate all send/recv to/from others. */ nreqs = rsize * 2; + preq = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, nreqs); /* Post all receives first */ /* A simple optimization: do not send and recv msgs of length zero */ @@ -79,10 +79,9 @@ mca_coll_basic_alltoallv_inter(const void *sbuf, const int *scounts, const int * i, MCA_COLL_BASE_TAG_ALLTOALLV, comm, &preq[i])); if (MPI_SUCCESS != err) { + mca_coll_basic_free_reqs(preq, i); return err; } - } else { - preq[i] = MPI_REQUEST_NULL; } } @@ -95,14 +94,16 @@ mca_coll_basic_alltoallv_inter(const void *sbuf, const int *scounts, const int * MCA_PML_BASE_SEND_STANDARD, comm, &preq[rsize + i])); if (MPI_SUCCESS != err) { + mca_coll_basic_free_reqs(preq, rsize + i); return err; } - } else { - preq[rsize + i] = MPI_REQUEST_NULL; } } err = ompi_request_wait_all(nreqs, preq, MPI_STATUSES_IGNORE); + if (MPI_SUCCESS != err) { + mca_coll_basic_free_reqs(preq, nreqs); + } /* All done */ return err; diff --git a/ompi/mca/coll/basic/coll_basic_alltoallw.c b/ompi/mca/coll/basic/coll_basic_alltoallw.c index 6228805cea..15dd4ed0ba 100644 --- a/ompi/mca/coll/basic/coll_basic_alltoallw.c +++ b/ompi/mca/coll/basic/coll_basic_alltoallw.c @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2005 The University of Tennessee and The University + * Copyright (c) 2004-2015 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -41,9 +41,8 @@ mca_coll_basic_alltoallw_intra_inplace(const void *rbuf, const int *rcounts, con struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; int i, j, size, rank, err=MPI_SUCCESS, max_size; - MPI_Request *preq; + MPI_Request *preq, *reqs = NULL; char *tmp_buffer; ptrdiff_t ext; @@ -71,6 +70,7 @@ mca_coll_basic_alltoallw_intra_inplace(const void *rbuf, const int *rcounts, con return OMPI_ERR_OUT_OF_RESOURCE; } + reqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t*) module, 2); /* in-place alltoallw slow algorithm (but works) */ for (i = 0 ; i < size ; ++i) { size_t msg_size_i; @@ -82,7 +82,7 @@ mca_coll_basic_alltoallw_intra_inplace(const void *rbuf, const int *rcounts, con msg_size_j *= rcounts[j]; /* Initiate all send/recv to/from others. */ - preq = basic_module->mccb_reqs; + preq = reqs; if (i == rank && msg_size_j != 0) { /* Copy the data into the temporary buffer */ @@ -119,17 +119,19 @@ mca_coll_basic_alltoallw_intra_inplace(const void *rbuf, const int *rcounts, con } /* Wait for the requests to complete */ - err = ompi_request_wait_all (2, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + err = ompi_request_wait_all (2, reqs, MPI_STATUSES_IGNORE); if (MPI_SUCCESS != err) { goto error_hndl; } - - /* Free the requests. */ - mca_coll_basic_free_reqs(basic_module->mccb_reqs, 2); } } error_hndl: /* Free the temporary buffer */ free (tmp_buffer); + if( MPI_SUCCESS != err ) { /* Free the requests. */ + if( NULL != reqs ) { + mca_coll_basic_free_reqs(reqs, 2); + } + } /* All done */ @@ -159,8 +161,7 @@ mca_coll_basic_alltoallw_intra(const void *sbuf, const int *scounts, const int * char *psnd; char *prcv; int nreqs; - MPI_Request *preq; - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; + MPI_Request *preq, *reqs; /* Initialize. */ if (MPI_IN_PLACE == sbuf) { @@ -191,7 +192,7 @@ mca_coll_basic_alltoallw_intra(const void *sbuf, const int *scounts, const int * /* Initiate all send/recv to/from others. */ nreqs = 0; - preq = basic_module->mccb_reqs; + reqs = preq = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, 2 * size); /* Post all receives first -- a simple optimization */ @@ -209,8 +210,7 @@ mca_coll_basic_alltoallw_intra(const void *sbuf, const int *scounts, const int * preq++)); ++nreqs; if (MPI_SUCCESS != err) { - mca_coll_basic_free_reqs(basic_module->mccb_reqs, - nreqs); + mca_coll_basic_free_reqs(reqs, nreqs); return err; } } @@ -232,15 +232,14 @@ mca_coll_basic_alltoallw_intra(const void *sbuf, const int *scounts, const int * preq++)); ++nreqs; if (MPI_SUCCESS != err) { - mca_coll_basic_free_reqs(basic_module->mccb_reqs, - nreqs); + mca_coll_basic_free_reqs(reqs, nreqs); return err; } } /* Start your engines. This will never return an error. */ - MCA_PML_CALL(start(nreqs, basic_module->mccb_reqs)); + MCA_PML_CALL(start(nreqs, reqs)); /* Wait for them all. If there's an error, note that we don't care * what the error was -- just that there *was* an error. The PML @@ -249,13 +248,11 @@ mca_coll_basic_alltoallw_intra(const void *sbuf, const int *scounts, const int * * So free them anyway -- even if there was an error, and return the * error after we free everything. */ - err = ompi_request_wait_all(nreqs, basic_module->mccb_reqs, - MPI_STATUSES_IGNORE); - + err = ompi_request_wait_all(nreqs, reqs, MPI_STATUSES_IGNORE); /* Free the requests. */ - - mca_coll_basic_free_reqs(basic_module->mccb_reqs, nreqs); - + if( MPI_SUCCESS != err ) { + mca_coll_basic_free_reqs(reqs, nreqs); + } /* All done */ return err; @@ -283,15 +280,14 @@ mca_coll_basic_alltoallw_inter(const void *sbuf, const int *scounts, const int * char *psnd; char *prcv; int nreqs; - MPI_Request *preq; - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; + MPI_Request *preq, *reqs; /* Initialize. */ size = ompi_comm_remote_size(comm); /* Initiate all send/recv to/from others. */ nreqs = 0; - preq = basic_module->mccb_reqs; + reqs = preq = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, 2 * size); /* Post all receives first -- a simple optimization */ for (i = 0; i < size; ++i) { @@ -308,8 +304,7 @@ mca_coll_basic_alltoallw_inter(const void *sbuf, const int *scounts, const int * comm, preq++)); ++nreqs; if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(basic_module->mccb_reqs, - nreqs); + mca_coll_basic_free_reqs(reqs, nreqs); return err; } } @@ -330,14 +325,13 @@ mca_coll_basic_alltoallw_inter(const void *sbuf, const int *scounts, const int * preq++)); ++nreqs; if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(basic_module->mccb_reqs, - nreqs); + mca_coll_basic_free_reqs(reqs, nreqs); return err; } } /* Start your engines. This will never return an error. */ - MCA_PML_CALL(start(nreqs, basic_module->mccb_reqs)); + MCA_PML_CALL(start(nreqs, reqs)); /* Wait for them all. If there's an error, note that we don't care * what the error was -- just that there *was* an error. The PML @@ -345,11 +339,11 @@ mca_coll_basic_alltoallw_inter(const void *sbuf, const int *scounts, const int * * i.e., by the end of this call, all the requests are free-able. * So free them anyway -- even if there was an error, and return the * error after we free everything. */ - err = ompi_request_wait_all(nreqs, basic_module->mccb_reqs, - MPI_STATUSES_IGNORE); + err = ompi_request_wait_all(nreqs, reqs, MPI_STATUSES_IGNORE); - /* Free the requests. */ - mca_coll_basic_free_reqs(basic_module->mccb_reqs, nreqs); + if (OMPI_SUCCESS != err) { /* Free the requests. */ + mca_coll_basic_free_reqs(reqs, nreqs); + } /* All done */ return err; diff --git a/ompi/mca/coll/basic/coll_basic_bcast.c b/ompi/mca/coll/basic/coll_basic_bcast.c index 667430afff..bf0757f1fa 100644 --- a/ompi/mca/coll/basic/coll_basic_bcast.c +++ b/ompi/mca/coll/basic/coll_basic_bcast.c @@ -53,9 +53,7 @@ mca_coll_basic_bcast_log_intra(void *buff, int count, int mask; int err; int nreqs; - ompi_request_t **preq; - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; - ompi_request_t **reqs = basic_module->mccb_reqs; + ompi_request_t **preq, **reqs; size = ompi_comm_size(comm); rank = ompi_comm_rank(comm); @@ -83,6 +81,8 @@ mca_coll_basic_bcast_log_intra(void *buff, int count, /* Send data to the children. */ + reqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, size); + err = MPI_SUCCESS; preq = reqs; nreqs = 0; @@ -119,12 +119,11 @@ mca_coll_basic_bcast_log_intra(void *buff, int count, * error, and return the error after we free everything. */ err = ompi_request_wait_all(nreqs, reqs, MPI_STATUSES_IGNORE); - - /* Free the reqs */ - - mca_coll_basic_free_reqs(reqs, nreqs); } + if( MPI_SUCCESS != err ) { + mca_coll_basic_free_reqs(reqs, nreqs); + } /* All done */ return err; @@ -147,8 +146,7 @@ mca_coll_basic_bcast_lin_inter(void *buff, int count, int i; int rsize; int err; - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; - ompi_request_t **reqs = basic_module->mccb_reqs; + ompi_request_t **reqs = NULL; rsize = ompi_comm_remote_size(comm); @@ -161,6 +159,7 @@ mca_coll_basic_bcast_lin_inter(void *buff, int count, MCA_COLL_BASE_TAG_BCAST, comm, MPI_STATUS_IGNORE)); } else { + reqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, rsize); /* root section */ for (i = 0; i < rsize; i++) { err = MCA_PML_CALL(isend(buff, count, datatype, i, @@ -168,10 +167,14 @@ mca_coll_basic_bcast_lin_inter(void *buff, int count, MCA_PML_BASE_SEND_STANDARD, comm, &(reqs[i]))); if (OMPI_SUCCESS != err) { + mca_coll_basic_free_reqs(reqs, rsize); return err; } } err = ompi_request_wait_all(rsize, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != err) { + mca_coll_basic_free_reqs(reqs, rsize); + } } diff --git a/ompi/mca/coll/basic/coll_basic_gatherv.c b/ompi/mca/coll/basic/coll_basic_gatherv.c index 9b974d6601..9c9f748b40 100644 --- a/ompi/mca/coll/basic/coll_basic_gatherv.c +++ b/ompi/mca/coll/basic/coll_basic_gatherv.c @@ -2,7 +2,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2005 The University of Tennessee and The University + * Copyright (c) 2004-2015 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -120,8 +120,7 @@ mca_coll_basic_gatherv_inter(const void *sbuf, int scount, int i, size, err; char *ptmp; ptrdiff_t lb, extent; - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; - ompi_request_t **reqs = basic_module->mccb_reqs; + ompi_request_t **reqs = NULL; size = ompi_comm_remote_size(comm); @@ -143,17 +142,22 @@ mca_coll_basic_gatherv_inter(const void *sbuf, int scount, return OMPI_ERROR; } + reqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, size); for (i = 0; i < size; ++i) { ptmp = ((char *) rbuf) + (extent * disps[i]); err = MCA_PML_CALL(irecv(ptmp, rcounts[i], rdtype, i, MCA_COLL_BASE_TAG_GATHERV, comm, &reqs[i])); if (OMPI_SUCCESS != err) { + mca_coll_basic_free_reqs(reqs, size); return err; } } err = ompi_request_wait_all(size, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != err) { + mca_coll_basic_free_reqs(reqs, size); + } } /* All done */ diff --git a/ompi/mca/coll/basic/coll_basic_module.c b/ompi/mca/coll/basic/coll_basic_module.c index 7acdf063aa..08e15cebe0 100644 --- a/ompi/mca/coll/basic/coll_basic_module.c +++ b/ompi/mca/coll/basic/coll_basic_module.c @@ -101,9 +101,6 @@ mca_coll_basic_comm_query(struct ompi_communicator_t *comm, size = dist_graph_size; } } - basic_module->mccb_num_reqs = size; - basic_module->mccb_reqs = (ompi_request_t**) - malloc(sizeof(ompi_request_t *) * basic_module->mccb_num_reqs); /* Choose whether to use [intra|inter], and [linear|log]-based * algorithms. */ diff --git a/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c b/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c index 5b39b7647d..1b323d644b 100644 --- a/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c +++ b/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2006 The University of Tennessee and The University + * Copyright (c) 2004-2015 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -42,7 +42,6 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_cart_2_2_0_t *cart = comm->c_topo->mtc.cart; const int rank = ompi_comm_rank (comm); ompi_request_t **reqs; @@ -51,9 +50,10 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount, ompi_datatype_get_extent(rdtype, &lb, &extent); + reqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 4 * cart->ndims ); /* The ordering is defined as -1 then +1 in each dimension in * order of dimension. */ - for (dim = 0, reqs = basic_module->mccb_reqs, nreqs = 0 ; dim < cart->ndims ; ++dim) { + for (dim = 0, nreqs = 0 ; dim < cart->ndims ; ++dim) { int srank = MPI_PROC_NULL, drank = MPI_PROC_NULL; if (cart->dims[dim] > 1) { @@ -63,6 +63,7 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount, } if (MPI_PROC_NULL != srank) { + nreqs += 2; rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, srank, MCA_COLL_BASE_TAG_ALLGATHER, comm, reqs++)); @@ -75,13 +76,12 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount, MCA_PML_BASE_SEND_STANDARD, comm, reqs++)); if (OMPI_SUCCESS != rc) break; - - nreqs += 2; } rbuf = (char *) rbuf + extent * rcount; if (MPI_PROC_NULL != drank) { + nreqs += 2; rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, drank, MCA_COLL_BASE_TAG_ALLGATHER, comm, reqs++)); @@ -93,19 +93,21 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount, MCA_PML_BASE_SEND_STANDARD, comm, reqs++)); if (OMPI_SUCCESS != rc) break; - - nreqs += 2; } rbuf = (char *) rbuf + extent * rcount; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs(reqs, nreqs); return rc; } - return ompi_request_wait_all (nreqs, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (nreqs, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs(reqs, nreqs); + } + return rc; } static int @@ -115,12 +117,11 @@ mca_coll_basic_neighbor_allgather_graph(const void *sbuf, int scount, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_graph_2_2_0_t *graph = comm->c_topo->mtc.graph; const int rank = ompi_comm_rank (comm); const int *edges; int degree; - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; ptrdiff_t lb, extent; int rc = MPI_SUCCESS, neighbor; @@ -132,10 +133,11 @@ mca_coll_basic_neighbor_allgather_graph(const void *sbuf, int scount, } ompi_datatype_get_extent(rdtype, &lb, &extent); + reqs = preqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t *) module, 2 * degree); - for (neighbor = 0, reqs = basic_module->mccb_reqs ; neighbor < degree ; ++neighbor) { + for (neighbor = 0; neighbor < degree ; ++neighbor) { rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, edges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; rbuf = (char *) rbuf + extent * rcount; @@ -143,16 +145,20 @@ mca_coll_basic_neighbor_allgather_graph(const void *sbuf, int scount, * a const for the send buffer. */ rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, edges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, (2 * neighbor + 1)); return rc; } - return ompi_request_wait_all (degree * 2, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (degree * 2, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs( reqs, degree * 2); + } + return rc; } static int @@ -162,11 +168,10 @@ mca_coll_basic_neighbor_allgather_dist_graph(const void *sbuf, int scount, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_dist_graph_2_2_0_t *dist_graph = comm->c_topo->mtc.dist_graph; const int *inedges, *outedges; int indegree, outdegree; - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; ptrdiff_t lb, extent; int rc = MPI_SUCCESS, neighbor; @@ -177,17 +182,18 @@ mca_coll_basic_neighbor_allgather_dist_graph(const void *sbuf, int scount, outedges = dist_graph->out; ompi_datatype_get_extent(rdtype, &lb, &extent); + reqs = preqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t *) module, indegree + outdegree); - for (neighbor = 0, reqs = basic_module->mccb_reqs ; neighbor < indegree ; ++neighbor) { + for (neighbor = 0; neighbor < indegree ; ++neighbor) { rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, inedges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; rbuf = (char *) rbuf + extent * rcount; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs(reqs, neighbor); return rc; } @@ -197,16 +203,20 @@ mca_coll_basic_neighbor_allgather_dist_graph(const void *sbuf, int scount, rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, outedges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs(reqs, indegree + neighbor); return rc; } - return ompi_request_wait_all (indegree + outdegree, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (indegree + outdegree, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs(reqs, indegree + outdegree); + } + return rc; } int mca_coll_basic_neighbor_allgather(const void *sbuf, int scount, diff --git a/ompi/mca/coll/basic/coll_basic_neighbor_allgatherv.c b/ompi/mca/coll/basic/coll_basic_neighbor_allgatherv.c index 32b79697cc..7e401f73e7 100644 --- a/ompi/mca/coll/basic/coll_basic_neighbor_allgatherv.c +++ b/ompi/mca/coll/basic/coll_basic_neighbor_allgatherv.c @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2006 The University of Tennessee and The University + * Copyright (c) 2004-2015 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -41,16 +41,15 @@ mca_coll_basic_neighbor_allgatherv_cart(const void *sbuf, int scount, struct omp struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_cart_2_2_0_t *cart = comm->c_topo->mtc.cart; const int rank = ompi_comm_rank (comm); - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; ptrdiff_t lb, extent; int rc = MPI_SUCCESS, dim, i, nreqs; ompi_datatype_get_extent(rdtype, &lb, &extent); - reqs = basic_module->mccb_reqs; + reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 4 * cart->ndims); /* The ordering is defined as -1 then +1 in each dimension in * order of dimension. */ @@ -64,36 +63,40 @@ mca_coll_basic_neighbor_allgatherv_cart(const void *sbuf, int scount, struct omp } if (MPI_PROC_NULL != srank) { + nreqs += 2; rc = MCA_PML_CALL(irecv((char *) rbuf + disps[i] * extent, rcounts[i], rdtype, srank, - MCA_COLL_BASE_TAG_ALLGATHER, comm, reqs++)); + MCA_COLL_BASE_TAG_ALLGATHER, comm, preqs++)); if (OMPI_SUCCESS != rc) break; /* remove cast from const when the pml layer is updated to take * a const for the send buffer. */ rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, srank, MCA_COLL_BASE_TAG_ALLGATHER, - MCA_PML_BASE_SEND_STANDARD, comm, reqs++)); + MCA_PML_BASE_SEND_STANDARD, comm, preqs++)); if (OMPI_SUCCESS != rc) break; - nreqs += 2; } if (MPI_PROC_NULL != drank) { + nreqs += 2; rc = MCA_PML_CALL(irecv((char *) rbuf + disps[i+1] * extent, rcounts[i+1], rdtype, drank, - MCA_COLL_BASE_TAG_ALLGATHER, comm, reqs++)); + MCA_COLL_BASE_TAG_ALLGATHER, comm, preqs++)); if (OMPI_SUCCESS != rc) break; rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, drank, MCA_COLL_BASE_TAG_ALLGATHER, - MCA_PML_BASE_SEND_STANDARD, comm, reqs++)); + MCA_PML_BASE_SEND_STANDARD, comm, preqs++)); if (OMPI_SUCCESS != rc) break; - nreqs += 2; } } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, nreqs ); return rc; } - return ompi_request_wait_all (nreqs, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (nreqs, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs( reqs, nreqs ); + } + return rc; } static int @@ -102,14 +105,12 @@ mca_coll_basic_neighbor_allgatherv_graph(const void *sbuf, int scount, struct om struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_graph_2_2_0_t *graph = comm->c_topo->mtc.graph; const int rank = ompi_comm_rank (comm); const int *edges; - int degree; - ompi_request_t **reqs; + int rc = MPI_SUCCESS, neighbor, degree; + ompi_request_t **reqs, **preqs; ptrdiff_t lb, extent; - int rc = MPI_SUCCESS, neighbor; mca_topo_base_graph_neighbors_count (comm, rank, °ree); @@ -119,26 +120,31 @@ mca_coll_basic_neighbor_allgatherv_graph(const void *sbuf, int scount, struct om } ompi_datatype_get_extent(rdtype, &lb, &extent); + reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 2 * degree); - for (neighbor = 0, reqs = basic_module->mccb_reqs ; neighbor < degree ; ++neighbor) { + for (neighbor = 0; neighbor < degree ; ++neighbor) { rc = MCA_PML_CALL(irecv((char *) rbuf + disps[neighbor] * extent, rcounts[neighbor], - rdtype, edges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER, comm, reqs++)); + rdtype, edges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER, comm, preqs++)); if (OMPI_SUCCESS != rc) break; /* remove cast from const when the pml layer is updated to take * a const for the send buffer. */ rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, edges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, 2 * (neighbor + 1) ); return rc; } - return ompi_request_wait_all (degree * 2, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (degree * 2, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs( reqs, 2 * degree ); + } + return rc; } static int @@ -147,11 +153,10 @@ mca_coll_basic_neighbor_allgatherv_dist_graph(const void *sbuf, int scount, stru struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_dist_graph_2_2_0_t *dist_graph = comm->c_topo->mtc.dist_graph; const int *inedges, *outedges; int indegree, outdegree; - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; ptrdiff_t lb, extent; int rc = MPI_SUCCESS, neighbor; @@ -162,15 +167,16 @@ mca_coll_basic_neighbor_allgatherv_dist_graph(const void *sbuf, int scount, stru outedges = dist_graph->out; ompi_datatype_get_extent(rdtype, &lb, &extent); + reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, indegree + outdegree); - for (neighbor = 0, reqs = basic_module->mccb_reqs ; neighbor < indegree ; ++neighbor) { + for (neighbor = 0; neighbor < indegree ; ++neighbor) { rc = MCA_PML_CALL(irecv((char *) rbuf + disps[neighbor] * extent, rcounts[neighbor], rdtype, - inedges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER, comm, reqs++)); + inedges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER, comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs(reqs, neighbor); return rc; } @@ -179,16 +185,20 @@ mca_coll_basic_neighbor_allgatherv_dist_graph(const void *sbuf, int scount, stru * a const for the send buffer. */ rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, outedges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs(reqs, indegree + neighbor); return rc; } - return ompi_request_wait_all (indegree + outdegree, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (indegree + outdegree, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs(reqs, indegree + outdegree); + } + return rc; } int mca_coll_basic_neighbor_allgatherv(const void *sbuf, int scount, struct ompi_datatype_t *sdtype, diff --git a/ompi/mca/coll/basic/coll_basic_neighbor_alltoall.c b/ompi/mca/coll/basic/coll_basic_neighbor_alltoall.c index 8d65e8d485..9382138b7f 100644 --- a/ompi/mca/coll/basic/coll_basic_neighbor_alltoall.c +++ b/ompi/mca/coll/basic/coll_basic_neighbor_alltoall.c @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2006 The University of Tennessee and The University + * Copyright (c) 2004-2015 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -40,18 +40,18 @@ mca_coll_basic_neighbor_alltoall_cart(const void *sbuf, int scount, struct ompi_ int rcount, struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_cart_2_2_0_t *cart = comm->c_topo->mtc.cart; const int rank = ompi_comm_rank (comm); - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; ptrdiff_t lb, rdextent, sdextent; int rc = MPI_SUCCESS, dim, nreqs; ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); + reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 4 * cart->ndims); /* post receives first */ - for (dim = 0, nreqs = 0, reqs = basic_module->mccb_reqs ; dim < cart->ndims ; ++dim) { + for (dim = 0, nreqs = 0; dim < cart->ndims ; ++dim) { int srank = MPI_PROC_NULL, drank = MPI_PROC_NULL; if (cart->dims[dim] > 1) { @@ -61,28 +61,28 @@ mca_coll_basic_neighbor_alltoall_cart(const void *sbuf, int scount, struct ompi_ } if (MPI_PROC_NULL != srank) { + nreqs++; rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, srank, MCA_COLL_BASE_TAG_ALLTOALL, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; - nreqs++; } rbuf = (char *) rbuf + rdextent * rcount; if (MPI_PROC_NULL != drank) { + nreqs++; rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, drank, MCA_COLL_BASE_TAG_ALLTOALL, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; - nreqs++; } rbuf = (char *) rbuf + rdextent * rcount; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, nreqs); return rc; } @@ -98,34 +98,38 @@ mca_coll_basic_neighbor_alltoall_cart(const void *sbuf, int scount, struct ompi_ if (MPI_PROC_NULL != srank) { /* remove cast from const when the pml layer is updated to take * a const for the send buffer. */ + nreqs++; rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, srank, MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; - nreqs++; } sbuf = (const char *) sbuf + sdextent * scount; if (MPI_PROC_NULL != drank) { + nreqs++; rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, drank, MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; - nreqs++; } sbuf = (const char *) sbuf + sdextent * scount; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, nreqs); return rc; } - return ompi_request_wait_all (nreqs, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (nreqs, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs( reqs, nreqs); + } + return rc; } static int @@ -133,12 +137,11 @@ mca_coll_basic_neighbor_alltoall_graph(const void *sbuf, int scount, struct ompi int rcount, struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_graph_2_2_0_t *graph = comm->c_topo->mtc.graph; const int rank = ompi_comm_rank (comm); int rc = MPI_SUCCESS, neighbor, degree; ptrdiff_t lb, rdextent, sdextent; - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; const int *edges; mca_topo_base_graph_neighbors_count (comm, rank, °ree); @@ -150,31 +153,40 @@ mca_coll_basic_neighbor_alltoall_graph(const void *sbuf, int scount, struct ompi ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); + reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 2 * degree); /* post receives first */ - for (neighbor = 0, reqs = basic_module->mccb_reqs ; neighbor < degree ; ++neighbor) { + for (neighbor = 0; neighbor < degree ; ++neighbor) { rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, edges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; rbuf = (char *) rbuf + rdextent * rcount; } + if( MPI_SUCCESS != rc ) { + mca_coll_basic_free_reqs( reqs, neighbor ); + return rc; + } for (neighbor = 0 ; neighbor < degree ; ++neighbor) { /* remove cast from const when the pml layer is updated to take * a const for the send buffer. */ rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, edges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; sbuf = (const char *) sbuf + sdextent * scount; } - if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + if( MPI_SUCCESS != rc ) { + mca_coll_basic_free_reqs( reqs, degree + neighbor ); return rc; } - return ompi_request_wait_all (degree * 2, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (degree * 2, reqs, MPI_STATUSES_IGNORE); + if( MPI_SUCCESS != rc ) { + mca_coll_basic_free_reqs( reqs, 2 * degree ); + } + return rc; } static int @@ -182,13 +194,12 @@ mca_coll_basic_neighbor_alltoall_dist_graph(const void *sbuf, int scount,struct int rcount, struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_dist_graph_2_2_0_t *dist_graph = comm->c_topo->mtc.dist_graph; ptrdiff_t lb, rdextent, sdextent; int rc = MPI_SUCCESS, neighbor; const int *inedges, *outedges; int indegree, outdegree; - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; indegree = dist_graph->indegree; outdegree = dist_graph->outdegree; @@ -198,36 +209,41 @@ mca_coll_basic_neighbor_alltoall_dist_graph(const void *sbuf, int scount,struct ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); + reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, indegree + outdegree); /* post receives first */ - for (neighbor = 0, reqs = basic_module->mccb_reqs ; neighbor < indegree ; ++neighbor, ++reqs) { + for (neighbor = 0; neighbor < indegree ; ++neighbor) { rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, inedges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, - comm, reqs)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; rbuf = (char *) rbuf + rdextent * rcount; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs(reqs, neighbor); return rc; } - for (neighbor = 0 ; neighbor < outdegree ; ++neighbor, ++reqs) { + for (neighbor = 0 ; neighbor < outdegree ; ++neighbor) { /* remove cast from const when the pml layer is updated to take a const for the send buffer */ rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, outedges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, - comm, reqs)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; sbuf = (char *) sbuf + sdextent * scount; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs(reqs, indegree + neighbor); return rc; } - return ompi_request_wait_all (indegree + outdegree, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (indegree + outdegree, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs(reqs, indegree + outdegree); + } + return rc; } int mca_coll_basic_neighbor_alltoall(const void *sbuf, int scount, struct ompi_datatype_t *sdtype, void *rbuf, diff --git a/ompi/mca/coll/basic/coll_basic_neighbor_alltoallv.c b/ompi/mca/coll/basic/coll_basic_neighbor_alltoallv.c index 814aa1ee76..af3a11172b 100644 --- a/ompi/mca/coll/basic/coll_basic_neighbor_alltoallv.c +++ b/ompi/mca/coll/basic/coll_basic_neighbor_alltoallv.c @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2006 The University of Tennessee and The University + * Copyright (c) 2004-2015 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -41,18 +41,18 @@ mca_coll_basic_neighbor_alltoallv_cart(const void *sbuf, const int scounts[], co const int rdisps[], struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_cart_2_2_0_t *cart = comm->c_topo->mtc.cart; const int rank = ompi_comm_rank (comm); int rc = MPI_SUCCESS, dim, i, nreqs; ptrdiff_t lb, rdextent, sdextent; - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); + reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 4 * cart->ndims ); /* post receives first */ - for (dim = 0, nreqs = 0, i = 0, reqs = basic_module->mccb_reqs ; dim < cart->ndims ; ++dim, i += 2) { + for (dim = 0, nreqs = 0, i = 0; dim < cart->ndims ; ++dim, i += 2) { int srank = MPI_PROC_NULL, drank = MPI_PROC_NULL; if (cart->dims[dim] > 1) { @@ -62,22 +62,22 @@ mca_coll_basic_neighbor_alltoallv_cart(const void *sbuf, const int scounts[], co } if (MPI_PROC_NULL != srank) { - rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[i] * rdextent, rcounts[i], rdtype, srank, - MCA_COLL_BASE_TAG_ALLTOALL, comm, reqs++)); - if (OMPI_SUCCESS != rc) break; nreqs++; + rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[i] * rdextent, rcounts[i], rdtype, srank, + MCA_COLL_BASE_TAG_ALLTOALL, comm, preqs++)); + if (OMPI_SUCCESS != rc) break; } if (MPI_PROC_NULL != drank) { - rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[i+1] * rdextent, rcounts[i+1], rdtype, drank, - MCA_COLL_BASE_TAG_ALLTOALL, comm, reqs++)); - if (OMPI_SUCCESS != rc) break; nreqs++; + rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[i+1] * rdextent, rcounts[i+1], rdtype, drank, + MCA_COLL_BASE_TAG_ALLTOALL, comm, preqs++)); + if (OMPI_SUCCESS != rc) break; } } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, nreqs ); return rc; } @@ -91,27 +91,31 @@ mca_coll_basic_neighbor_alltoallv_cart(const void *sbuf, const int scounts[], co } if (MPI_PROC_NULL != srank) { + nreqs++; /* remove cast from const when the pml layer is updated to take a const for the send buffer */ rc = MCA_PML_CALL(isend((char *) sbuf + sdisps[i] * sdextent, scounts[i], sdtype, srank, - MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, reqs++)); + MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, preqs++)); if (OMPI_SUCCESS != rc) break; - nreqs++; } if (MPI_PROC_NULL != drank) { - rc = MCA_PML_CALL(isend((char *) sbuf + sdisps[i+1] * sdextent, scounts[i+1], sdtype, drank, - MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, reqs++)); - if (OMPI_SUCCESS != rc) break; nreqs++; + rc = MCA_PML_CALL(isend((char *) sbuf + sdisps[i+1] * sdextent, scounts[i+1], sdtype, drank, + MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, preqs++)); + if (OMPI_SUCCESS != rc) break; } } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, nreqs ); return rc; } - return ompi_request_wait_all (nreqs, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (nreqs, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs( reqs, nreqs ); + } + return rc; } static int @@ -120,12 +124,11 @@ mca_coll_basic_neighbor_alltoallv_graph(const void *sbuf, const int scounts[], c const int rdisps[], struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_graph_2_2_0_t *graph = comm->c_topo->mtc.graph; int rc = MPI_SUCCESS, neighbor, degree; const int rank = ompi_comm_rank (comm); ptrdiff_t lb, rdextent, sdextent; - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; const int *edges; mca_topo_base_graph_neighbors_count (comm, rank, °ree); @@ -137,16 +140,17 @@ mca_coll_basic_neighbor_alltoallv_graph(const void *sbuf, const int scounts[], c ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); + reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 2 * degree ); /* post all receives first */ - for (neighbor = 0, reqs = basic_module->mccb_reqs ; neighbor < degree ; ++neighbor) { + for (neighbor = 0; neighbor < degree ; ++neighbor) { rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[neighbor] * rdextent, rcounts[neighbor], rdtype, - edges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, comm, reqs++)); + edges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, neighbor ); return rc; } @@ -154,16 +158,20 @@ mca_coll_basic_neighbor_alltoallv_graph(const void *sbuf, const int scounts[], c /* remove cast from const when the pml layer is updated to take a const for the send buffer */ rc = MCA_PML_CALL(isend((char *) sbuf + sdisps[neighbor] * sdextent, scounts[neighbor], sdtype, edges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, degree + neighbor ); return rc; } - return ompi_request_wait_all (degree * 2, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (degree * 2, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs( reqs, degree * 2); + } + return rc; } static int @@ -172,13 +180,12 @@ mca_coll_basic_neighbor_alltoallv_dist_graph(const void *sbuf, const int scounts const int rdisps[], struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_dist_graph_2_2_0_t *dist_graph = comm->c_topo->mtc.dist_graph; ptrdiff_t lb, rdextent, sdextent; int rc = MPI_SUCCESS, neighbor; const int *inedges, *outedges; int indegree, outdegree; - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; indegree = dist_graph->indegree; outdegree = dist_graph->outdegree; @@ -188,16 +195,17 @@ mca_coll_basic_neighbor_alltoallv_dist_graph(const void *sbuf, const int scounts ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); + reqs = preqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t *) module, indegree + outdegree); /* post all receives first */ - for (neighbor = 0, reqs = basic_module->mccb_reqs ; neighbor < indegree ; ++neighbor) { + for (neighbor = 0; neighbor < indegree ; ++neighbor) { rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[neighbor] * rdextent, rcounts[neighbor], rdtype, - inedges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, comm, reqs++)); + inedges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, neighbor ); return rc; } @@ -205,16 +213,20 @@ mca_coll_basic_neighbor_alltoallv_dist_graph(const void *sbuf, const int scounts /* remove cast from const when the pml layer is updated to take a const for the send buffer */ rc = MCA_PML_CALL(isend((char *) sbuf + sdisps[neighbor] * sdextent, scounts[neighbor], sdtype, outedges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, indegree + neighbor ); return rc; } - return ompi_request_wait_all (indegree + outdegree, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (indegree + outdegree, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs( reqs, indegree + outdegree ); + } + return rc; } int mca_coll_basic_neighbor_alltoallv(const void *sbuf, const int scounts[], const int sdisps[], diff --git a/ompi/mca/coll/basic/coll_basic_neighbor_alltoallw.c b/ompi/mca/coll/basic/coll_basic_neighbor_alltoallw.c index eb1f581ae6..20693f9763 100644 --- a/ompi/mca/coll/basic/coll_basic_neighbor_alltoallw.c +++ b/ompi/mca/coll/basic/coll_basic_neighbor_alltoallw.c @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2006 The University of Tennessee and The University + * Copyright (c) 2004-2015 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -41,15 +41,15 @@ mca_coll_basic_neighbor_alltoallw_cart(const void *sbuf, const int scounts[], co const MPI_Aint rdisps[], struct ompi_datatype_t * const *rdtypes, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_cart_2_2_0_t *cart = comm->c_topo->mtc.cart; const int rank = ompi_comm_rank (comm); int rc = MPI_SUCCESS, dim, i, nreqs; - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; + reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 4 * cart->ndims ); /* post receives first */ - for (dim = 0, i = 0, nreqs = 0, reqs = basic_module->mccb_reqs ; dim < cart->ndims ; ++dim, i += 2) { + for (dim = 0, i = 0, nreqs = 0; dim < cart->ndims ; ++dim, i += 2) { int srank = MPI_PROC_NULL, drank = MPI_PROC_NULL; if (cart->dims[dim] > 1) { @@ -59,22 +59,22 @@ mca_coll_basic_neighbor_alltoallw_cart(const void *sbuf, const int scounts[], co } if (MPI_PROC_NULL != srank) { - rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[i], rcounts[i], rdtypes[i], srank, - MCA_COLL_BASE_TAG_ALLTOALL, comm, reqs++)); - if (OMPI_SUCCESS != rc) break; nreqs++; + rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[i], rcounts[i], rdtypes[i], srank, + MCA_COLL_BASE_TAG_ALLTOALL, comm, preqs++)); + if (OMPI_SUCCESS != rc) break; } if (MPI_PROC_NULL != drank) { - rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[i+1], rcounts[i+1], rdtypes[i+1], drank, - MCA_COLL_BASE_TAG_ALLTOALL, comm, reqs++)); - if (OMPI_SUCCESS != rc) break; nreqs++; + rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[i+1], rcounts[i+1], rdtypes[i+1], drank, + MCA_COLL_BASE_TAG_ALLTOALL, comm, preqs++)); + if (OMPI_SUCCESS != rc) break; } } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, nreqs ); return rc; } @@ -88,27 +88,31 @@ mca_coll_basic_neighbor_alltoallw_cart(const void *sbuf, const int scounts[], co } if (MPI_PROC_NULL != srank) { + nreqs++; /* remove cast from const when the pml layer is updated to take a const for the send buffer */ rc = MCA_PML_CALL(isend((char *) sbuf + sdisps[i], scounts[i], sdtypes[i], srank, - MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, reqs++)); + MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, preqs++)); if (OMPI_SUCCESS != rc) break; - nreqs++; } if (MPI_PROC_NULL != drank) { - rc = MCA_PML_CALL(isend((char *) sbuf + sdisps[i+1], scounts[i+1], sdtypes[i+1], drank, - MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, reqs++)); - if (OMPI_SUCCESS != rc) break; nreqs++; + rc = MCA_PML_CALL(isend((char *) sbuf + sdisps[i+1], scounts[i+1], sdtypes[i+1], drank, + MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, preqs++)); + if (OMPI_SUCCESS != rc) break; } } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, nreqs ); return rc; } - return ompi_request_wait_all (nreqs, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (nreqs, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs( reqs, nreqs ); + } + return rc; } static int @@ -117,14 +121,14 @@ mca_coll_basic_neighbor_alltoallw_graph(const void *sbuf, const int scounts[], c const MPI_Aint rdisps[], struct ompi_datatype_t * const rdtypes[], struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_graph_2_2_0_t *graph = comm->c_topo->mtc.graph; int rc = MPI_SUCCESS, neighbor, degree; const int rank = ompi_comm_rank (comm); - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; const int *edges; mca_topo_base_graph_neighbors_count (comm, rank, °ree); + reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 2 * degree ); edges = graph->edges; if (rank > 0) { @@ -132,14 +136,14 @@ mca_coll_basic_neighbor_alltoallw_graph(const void *sbuf, const int scounts[], c } /* post all receives first */ - for (neighbor = 0, reqs = basic_module->mccb_reqs ; neighbor < degree ; ++neighbor) { + for (neighbor = 0; neighbor < degree ; ++neighbor) { rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[neighbor], rcounts[neighbor], rdtypes[neighbor], - edges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, comm, reqs++)); + edges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, neighbor ); return rc; } @@ -147,16 +151,20 @@ mca_coll_basic_neighbor_alltoallw_graph(const void *sbuf, const int scounts[], c /* remove cast from const when the pml layer is updated to take a const for the send buffer */ rc = MCA_PML_CALL(isend((char *) sbuf + sdisps[neighbor], scounts[neighbor], sdtypes[neighbor], edges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, neighbor + degree ); return rc; } - return ompi_request_wait_all (degree * 2, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (degree * 2, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs( reqs, degree * 2 ); + } + return rc; } static int @@ -165,12 +173,11 @@ mca_coll_basic_neighbor_alltoallw_dist_graph(const void *sbuf, const int scounts const MPI_Aint rdisps[], struct ompi_datatype_t * const *rdtypes, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t *) module; const mca_topo_base_comm_dist_graph_2_2_0_t *dist_graph = comm->c_topo->mtc.dist_graph; int rc = MPI_SUCCESS, neighbor; const int *inedges, *outedges; int indegree, outdegree; - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; indegree = dist_graph->indegree; outdegree = dist_graph->outdegree; @@ -178,15 +185,16 @@ mca_coll_basic_neighbor_alltoallw_dist_graph(const void *sbuf, const int scounts inedges = dist_graph->in; outedges = dist_graph->out; + reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, indegree + outdegree ); /* post all receives first */ - for (neighbor = 0, reqs = basic_module->mccb_reqs ; neighbor < indegree ; ++neighbor) { + for (neighbor = 0; neighbor < indegree ; ++neighbor) { rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[neighbor], rcounts[neighbor], rdtypes[neighbor], - inedges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, comm, reqs++)); + inedges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, neighbor ); return rc; } @@ -194,16 +202,20 @@ mca_coll_basic_neighbor_alltoallw_dist_graph(const void *sbuf, const int scounts /* remove cast from const when the pml layer is updated to take a const for the send buffer */ rc = MCA_PML_CALL(isend((char *) sbuf + sdisps[neighbor], scounts[neighbor], sdtypes[neighbor], outedges[neighbor], MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; } if (OMPI_SUCCESS != rc) { - /* should probably try to clean up here */ + mca_coll_basic_free_reqs( reqs, indegree + neighbor ); return rc; } - return ompi_request_wait_all (indegree + outdegree, basic_module->mccb_reqs, MPI_STATUSES_IGNORE); + rc = ompi_request_wait_all (indegree + outdegree, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != rc) { + mca_coll_basic_free_reqs( reqs, indegree + outdegree ); + } + return rc; } int mca_coll_basic_neighbor_alltoallw(const void *sbuf, const int scounts[], const MPI_Aint sdisps[], diff --git a/ompi/mca/coll/basic/coll_basic_scatter.c b/ompi/mca/coll/basic/coll_basic_scatter.c index 88ded09ef7..ba02924673 100644 --- a/ompi/mca/coll/basic/coll_basic_scatter.c +++ b/ompi/mca/coll/basic/coll_basic_scatter.c @@ -48,8 +48,7 @@ mca_coll_basic_scatter_inter(const void *sbuf, int scount, int i, size, err; char *ptmp; ptrdiff_t lb, incr; - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; - ompi_request_t **reqs = basic_module->mccb_reqs; + ompi_request_t **reqs; /* Initialize */ size = ompi_comm_remote_size(comm); @@ -69,6 +68,8 @@ mca_coll_basic_scatter_inter(const void *sbuf, int scount, return OMPI_ERROR; } + reqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, size); + incr *= scount; for (i = 0, ptmp = (char *) sbuf; i < size; ++i, ptmp += incr) { err = MCA_PML_CALL(isend(ptmp, scount, sdtype, i, @@ -76,13 +77,15 @@ mca_coll_basic_scatter_inter(const void *sbuf, int scount, MCA_PML_BASE_SEND_STANDARD, comm, reqs++)); if (OMPI_SUCCESS != err) { + mca_coll_basic_free_reqs(reqs, i); return err; } } - err = - ompi_request_wait_all(size, basic_module->mccb_reqs, - MPI_STATUSES_IGNORE); + err = ompi_request_wait_all(size, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != err) { + mca_coll_basic_free_reqs(reqs, size); + } } return err; diff --git a/ompi/mca/coll/basic/coll_basic_scatterv.c b/ompi/mca/coll/basic/coll_basic_scatterv.c index 80cb6b05c9..e06905497c 100644 --- a/ompi/mca/coll/basic/coll_basic_scatterv.c +++ b/ompi/mca/coll/basic/coll_basic_scatterv.c @@ -2,7 +2,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2005 The University of Tennessee and The University + * Copyright (c) 2004-2015 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -121,8 +121,7 @@ mca_coll_basic_scatterv_inter(const void *sbuf, const int *scounts, int i, size, err; char *ptmp; ptrdiff_t lb, extent; - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; - ompi_request_t **reqs = basic_module->mccb_reqs; + ompi_request_t **reqs; /* Initialize */ size = ompi_comm_remote_size(comm); @@ -145,6 +144,7 @@ mca_coll_basic_scatterv_inter(const void *sbuf, const int *scounts, return OMPI_ERROR; } + reqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, size); for (i = 0; i < size; ++i) { ptmp = ((char *) sbuf) + (extent * disps[i]); err = MCA_PML_CALL(isend(ptmp, scounts[i], sdtype, i, @@ -152,11 +152,15 @@ mca_coll_basic_scatterv_inter(const void *sbuf, const int *scounts, MCA_PML_BASE_SEND_STANDARD, comm, &(reqs[i]))); if (OMPI_SUCCESS != err) { + mca_coll_basic_free_reqs(reqs, i); return err; } } err = ompi_request_wait_all(size, reqs, MPI_STATUSES_IGNORE); + if (OMPI_SUCCESS != err) { + mca_coll_basic_free_reqs(reqs, size); + } } /* All done */ diff --git a/ompi/mca/coll/self/coll_self.h b/ompi/mca/coll/self/coll_self.h index d0ec1313ff..3431e7f549 100644 --- a/ompi/mca/coll/self/coll_self.h +++ b/ompi/mca/coll/self/coll_self.h @@ -145,9 +145,6 @@ int mca_coll_self_ft_event(int state); struct mca_coll_self_module_t { mca_coll_base_module_t super; - - ompi_request_t **mccb_reqs; - int mccb_num_reqs; }; typedef struct mca_coll_self_module_t mca_coll_self_module_t; OBJ_CLASS_DECLARATION(mca_coll_self_module_t); From 88492a1e1227f1021dbc8f151d742eb897ee8ebc Mon Sep 17 00:00:00 2001 From: George Bosilca Date: Wed, 23 Sep 2015 10:59:45 +0200 Subject: [PATCH 3/6] Consistently use the request array for all modules (single array stored in the base). Correctly deal with persistent requests (they must be always freed when they are stored in the request array associated with the communicator). Always use MPI_STATUS_IGNORE for single request waiting functions. --- ompi/mca/coll/base/base.h | 2 +- ompi/mca/coll/base/coll_base_alltoall.c | 4 +-- ompi/mca/coll/base/coll_base_alltoallv.c | 5 ++- ompi/mca/coll/base/coll_base_bcast.c | 36 +++++++++---------- ompi/mca/coll/base/coll_base_frame.c | 10 +----- ompi/mca/coll/basic/coll_basic.h | 23 ++---------- ompi/mca/coll/basic/coll_basic_allgather.c | 5 ++- ompi/mca/coll/basic/coll_basic_allreduce.c | 5 ++- ompi/mca/coll/basic/coll_basic_alltoall.c | 8 ++--- ompi/mca/coll/basic/coll_basic_alltoallv.c | 8 ++--- ompi/mca/coll/basic/coll_basic_alltoallw.c | 29 +++++++-------- ompi/mca/coll/basic/coll_basic_bcast.c | 28 +++++++-------- ompi/mca/coll/basic/coll_basic_component.c | 22 +++--------- ompi/mca/coll/basic/coll_basic_gatherv.c | 6 ++-- ompi/mca/coll/basic/coll_basic_module.c | 7 +++- .../basic/coll_basic_neighbor_allgather.c | 20 +++++------ .../basic/coll_basic_neighbor_allgatherv.c | 20 +++++------ .../coll/basic/coll_basic_neighbor_alltoall.c | 24 ++++++------- .../basic/coll_basic_neighbor_alltoallv.c | 24 ++++++------- .../basic/coll_basic_neighbor_alltoallw.c | 24 ++++++------- ompi/mca/coll/basic/coll_basic_scatter.c | 6 ++-- ompi/mca/coll/basic/coll_basic_scatterv.c | 6 ++-- ompi/mca/coll/tuned/coll_tuned_module.c | 2 +- 23 files changed, 139 insertions(+), 185 deletions(-) diff --git a/ompi/mca/coll/base/base.h b/ompi/mca/coll/base/base.h index 391a364263..9fc431f1ff 100644 --- a/ompi/mca/coll/base/base.h +++ b/ompi/mca/coll/base/base.h @@ -23,7 +23,7 @@ * These functions are normally invoked by the back-ends of: * * - The back-ends of MPI_Init() and MPI_Finalize() - * - Communuicactor constructors (e.g., MPI_Comm_split()) and + * - Communicator constructors (e.g., MPI_Comm_split()) and * destructors (e.g., MPI_Comm_free()) * - The laminfo command */ diff --git a/ompi/mca/coll/base/coll_base_alltoall.c b/ompi/mca/coll/base/coll_base_alltoall.c index 90a35c52ba..273e836caa 100644 --- a/ompi/mca/coll/base/coll_base_alltoall.c +++ b/ompi/mca/coll/base/coll_base_alltoall.c @@ -650,9 +650,9 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount, if( MPI_SUCCESS != err ) { OPAL_OUTPUT( (ompi_coll_base_framework.framework_output,"%s:%4d\tError occurred %d, rank %2d", __FILE__, line, err, rank) ); - /* Free the reqs */ - ompi_coll_base_free_reqs(req, nreqs); } + /* Free the reqs in all cases as they are persistent requests */ + ompi_coll_base_free_reqs(req, nreqs); /* All done */ return err; diff --git a/ompi/mca/coll/base/coll_base_alltoallv.c b/ompi/mca/coll/base/coll_base_alltoallv.c index 6d69c9eccc..7b395a551d 100644 --- a/ompi/mca/coll/base/coll_base_alltoallv.c +++ b/ompi/mca/coll/base/coll_base_alltoallv.c @@ -288,9 +288,8 @@ ompi_coll_base_alltoallv_intra_basic_linear(const void *sbuf, const int *scounts err = ompi_request_wait_all(nreqs, data->mcct_reqs, MPI_STATUSES_IGNORE); err_hndl: - if( MPI_SUCCESS != err ) { /* Free the requests. */ - ompi_coll_base_free_reqs(data->mcct_reqs, nreqs); - } + /* Free the requests in all cases as they are persistent */ + ompi_coll_base_free_reqs(data->mcct_reqs, nreqs); return err; } diff --git a/ompi/mca/coll/base/coll_base_bcast.c b/ompi/mca/coll/base/coll_base_bcast.c index ffb151e179..258832d128 100644 --- a/ompi/mca/coll/base/coll_base_bcast.c +++ b/ompi/mca/coll/base/coll_base_bcast.c @@ -143,7 +143,7 @@ ompi_coll_base_bcast_intra_generic( void* buffer, /* wait for and forward the previous segment to children */ err = ompi_request_wait( &recv_reqs[req_index ^ 0x1], - MPI_STATUSES_IGNORE ); + MPI_STATUS_IGNORE ); if (err != MPI_SUCCESS) { line = __LINE__; goto error_hndl; } for( i = 0; i < tree->tree_nextsize; i++ ) { @@ -175,7 +175,7 @@ ompi_coll_base_bcast_intra_generic( void* buffer, } /* Process the last segment */ - err = ompi_request_wait( &recv_reqs[req_index], MPI_STATUSES_IGNORE ); + err = ompi_request_wait( &recv_reqs[req_index], MPI_STATUS_IGNORE ); if (err != MPI_SUCCESS) { line = __LINE__; goto error_hndl; } sendcount = original_count - (ptrdiff_t)(num_segments - 1) * count_by_segment; for( i = 0; i < tree->tree_nextsize; i++ ) { @@ -240,8 +240,11 @@ ompi_coll_base_bcast_intra_generic( void* buffer, error_hndl: OPAL_OUTPUT( (ompi_coll_base_framework.framework_output,"%s:%4d\tError occurred %d, rank %2d", __FILE__, line, err, rank) ); - if( (MPI_SUCCESS != err) && (NULL != send_reqs) ) { - ompi_coll_base_free_reqs( send_reqs, tree->tree_nextsize); + if( MPI_SUCCESS != err ) { + ompi_coll_base_free_reqs( recv_reqs, 2); + if( NULL != send_reqs ) { + ompi_coll_base_free_reqs( send_reqs, tree->tree_nextsize); + } } return err; @@ -378,7 +381,6 @@ ompi_coll_base_bcast_intra_split_bintree ( void* buffer, ptrdiff_t type_extent, lb; ompi_request_t *base_req, *new_req; ompi_coll_tree_t *tree; - mca_coll_base_comm_t *data = module->base_data; size = ompi_comm_size(comm); rank = ompi_comm_rank(comm); @@ -391,7 +393,7 @@ ompi_coll_base_bcast_intra_split_bintree ( void* buffer, /* setup the binary tree topology. */ COLL_BASE_UPDATE_BINTREE( comm, module, root ); - tree = data->cached_bintree; + tree = module->base_data->cached_bintree; err = ompi_datatype_type_size( datatype, &type_size ); @@ -501,8 +503,8 @@ ompi_coll_base_bcast_intra_split_bintree ( void* buffer, comm, &new_req)); if (err != MPI_SUCCESS) { line = __LINE__; goto error_hndl; } - /* wait for and forward current segment */ - err = ompi_request_wait_all( 1, &base_req, MPI_STATUSES_IGNORE ); + /* wait for and forward the previous segment */ + err = ompi_request_wait( &base_req, MPI_STATUS_IGNORE ); for( i = 0; i < tree->tree_nextsize; i++ ) { /* send data to children (segcount[lr]) */ err = MCA_PML_CALL(send( tmpbuf[lr], segcount[lr], datatype, tree->tree_next[i], MCA_COLL_BASE_TAG_BCAST, @@ -517,7 +519,7 @@ ompi_coll_base_bcast_intra_split_bintree ( void* buffer, } /* end of for segindex */ /* wait for the last segment and forward current segment */ - err = ompi_request_wait_all( 1, &base_req, MPI_STATUSES_IGNORE ); + err = ompi_request_wait( &base_req, MPI_STATUS_IGNORE ); for( i = 0; i < tree->tree_nextsize; i++ ) { /* send data to children */ err = MCA_PML_CALL(send(tmpbuf[lr], sendcount[lr], datatype, tree->tree_next[i], MCA_COLL_BASE_TAG_BCAST, @@ -633,10 +635,8 @@ ompi_coll_base_bcast_intra_basic_linear(void *buff, int count, mca_coll_base_module_t *module) { int i, size, rank, err; - mca_coll_base_comm_t *data = module->base_data; ompi_request_t **preq, **reqs; - size = ompi_comm_size(comm); rank = ompi_comm_rank(comm); @@ -651,24 +651,20 @@ ompi_coll_base_bcast_intra_basic_linear(void *buff, int count, } /* Root sends data to all others. */ - preq = reqs = coll_base_comm_get_reqs(data, size-1); + preq = reqs = coll_base_comm_get_reqs(module->base_data, size-1); for (i = 0; i < size; ++i) { if (i == rank) { continue; } - err = MCA_PML_CALL(isend_init(buff, count, datatype, i, - MCA_COLL_BASE_TAG_BCAST, - MCA_PML_BASE_SEND_STANDARD, - comm, preq++)); + err = MCA_PML_CALL(isend(buff, count, datatype, i, + MCA_COLL_BASE_TAG_BCAST, + MCA_PML_BASE_SEND_STANDARD, + comm, preq++)); if (MPI_SUCCESS != err) { goto err_hndl; } } --i; - /* Start your engines. This will never return an error. */ - - MCA_PML_CALL(start(i, reqs)); - /* Wait for them all. If there's an error, note that we don't * care what the error was -- just that there *was* an error. The * PML will finish all requests, even if one or more of them fail. diff --git a/ompi/mca/coll/base/coll_base_frame.c b/ompi/mca/coll/base/coll_base_frame.c index b293780df2..3a714c0439 100644 --- a/ompi/mca/coll/base/coll_base_frame.c +++ b/ompi/mca/coll/base/coll_base_frame.c @@ -68,15 +68,7 @@ OBJ_CLASS_INSTANCE(mca_coll_base_module_t, opal_object_t, static void coll_base_comm_construct(mca_coll_base_comm_t *data) { - data->mcct_reqs = NULL; - data->mcct_num_reqs = 0; - data->cached_ntree = NULL; - data->cached_bintree = NULL; - data->cached_bmtree = NULL; - data->cached_in_order_bmtree = NULL; - data->cached_chain = NULL; - data->cached_pipeline = NULL; - data->cached_in_order_bintree = NULL; + memset ((char *) data + sizeof (data->super), 0, sizeof (*data) - sizeof (data->super)); } static void diff --git a/ompi/mca/coll/basic/coll_basic.h b/ompi/mca/coll/basic/coll_basic.h index 78b9c231b3..2490a241da 100644 --- a/ompi/mca/coll/basic/coll_basic.h +++ b/ompi/mca/coll/basic/coll_basic.h @@ -285,29 +285,12 @@ BEGIN_C_DECLS struct mca_coll_basic_module_t { mca_coll_base_module_t super; - - ompi_request_t **mccb_reqs; - int mccb_num_reqs; }; typedef struct mca_coll_basic_module_t mca_coll_basic_module_t; -OBJ_CLASS_DECLARATION(mca_coll_basic_module_t); +OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_coll_basic_module_t); -/* Utility functions */ - -static inline void mca_coll_basic_free_reqs(ompi_request_t ** reqs, int count) -{ - int i; - for (i = 0; i < count; ++i) - if( MPI_REQUEST_NULL != reqs[i] ) { - ompi_request_free(&reqs[i]); - } -} - -/** - * Return the array of requests on the data. If the array was not initialized - * or if it's size was too small, allocate it to fit the requested size. - */ -ompi_request_t** mca_coll_basic_get_reqs(mca_coll_basic_module_t* data, int nreqs); +typedef mca_coll_base_comm_t mca_coll_basic_comm_t; +OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_coll_basic_comm_t); END_C_DECLS diff --git a/ompi/mca/coll/basic/coll_basic_allgather.c b/ompi/mca/coll/basic/coll_basic_allgather.c index 5d393c1626..7117735570 100644 --- a/ompi/mca/coll/basic/coll_basic_allgather.c +++ b/ompi/mca/coll/basic/coll_basic_allgather.c @@ -51,7 +51,6 @@ mca_coll_basic_allgather_inter(const void *sbuf, int scount, char *tmpbuf = NULL, *ptmp; ptrdiff_t rlb, slb, rextent, sextent, incr; ompi_request_t *req; - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; ompi_request_t **reqs = NULL; rank = ompi_comm_rank(comm); @@ -80,7 +79,7 @@ mca_coll_basic_allgather_inter(const void *sbuf, int scount, if (OMPI_SUCCESS != err) { line = __LINE__; goto exit; } /* Get a requests arrays of the right size */ - reqs = mca_coll_basic_get_reqs(basic_module, rsize + 1); + reqs = coll_base_comm_get_reqs(module->base_data, rsize + 1); if( NULL == reqs ) { line = __LINE__; goto exit; } /* Do a send-recv between the two root procs. to avoid deadlock */ @@ -156,7 +155,7 @@ mca_coll_basic_allgather_inter(const void *sbuf, int scount, if( MPI_SUCCESS != err ) { OPAL_OUTPUT( (ompi_coll_base_framework.framework_output,"%s:%4d\tError occurred %d, rank %2d", __FILE__, line, err, rank) ); - if( NULL != reqs ) mca_coll_basic_free_reqs(reqs, rsize+1); + if( NULL != reqs ) ompi_coll_base_free_reqs(reqs, rsize+1); } if (NULL != tmpbuf) { free(tmpbuf); diff --git a/ompi/mca/coll/basic/coll_basic_allreduce.c b/ompi/mca/coll/basic/coll_basic_allreduce.c index ab5f9820b8..68fe0ec4b9 100644 --- a/ompi/mca/coll/basic/coll_basic_allreduce.c +++ b/ompi/mca/coll/basic/coll_basic_allreduce.c @@ -85,7 +85,6 @@ mca_coll_basic_allreduce_inter(const void *sbuf, void *rbuf, int count, ptrdiff_t true_lb, true_extent; char *tmpbuf = NULL, *pml_buffer = NULL; ompi_request_t *req[2]; - mca_coll_basic_module_t *basic_module = (mca_coll_basic_module_t*) module; ompi_request_t **reqs = NULL; rank = ompi_comm_rank(comm); @@ -114,7 +113,7 @@ mca_coll_basic_allreduce_inter(const void *sbuf, void *rbuf, int count, if (NULL == tmpbuf) { err = OMPI_ERR_OUT_OF_RESOURCE; line = __LINE__; goto exit; } pml_buffer = tmpbuf - true_lb; - reqs = mca_coll_basic_get_reqs(basic_module, rsize - 1); + reqs = coll_base_comm_get_reqs(module->base_data, rsize - 1); if( NULL == reqs ) { err = OMPI_ERR_OUT_OF_RESOURCE; line = __LINE__; goto exit; } /* Do a send-recv between the two root procs. to avoid deadlock */ @@ -201,7 +200,7 @@ mca_coll_basic_allreduce_inter(const void *sbuf, void *rbuf, int count, if( MPI_SUCCESS != err ) { OPAL_OUTPUT((ompi_coll_base_framework.framework_output,"%s:%4d\tError occurred %d, rank %2d", __FILE__, line, err, rank)); - mca_coll_basic_free_reqs(reqs, rsize - 1); + ompi_coll_base_free_reqs(reqs, rsize - 1); } if (NULL != tmpbuf) { free(tmpbuf); diff --git a/ompi/mca/coll/basic/coll_basic_alltoall.c b/ompi/mca/coll/basic/coll_basic_alltoall.c index 80907cd39b..65c415ca13 100644 --- a/ompi/mca/coll/basic/coll_basic_alltoall.c +++ b/ompi/mca/coll/basic/coll_basic_alltoall.c @@ -77,7 +77,7 @@ mca_coll_basic_alltoall_inter(const void *sbuf, int scount, /* Initiate all send/recv to/from others. */ nreqs = size * 2; - req = rreq = mca_coll_basic_get_reqs( (mca_coll_basic_module_t*) module, nreqs); + req = rreq = coll_base_comm_get_reqs( module->base_data, nreqs); sreq = rreq + size; prcv = (char *) rbuf; @@ -88,7 +88,7 @@ mca_coll_basic_alltoall_inter(const void *sbuf, int scount, err = MCA_PML_CALL(irecv(prcv + (i * rcvinc), rcount, rdtype, i, MCA_COLL_BASE_TAG_ALLTOALL, comm, rreq)); if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(req, nreqs); + ompi_coll_base_free_reqs(req, nreqs); return err; } } @@ -99,7 +99,7 @@ mca_coll_basic_alltoall_inter(const void *sbuf, int scount, MCA_COLL_BASE_TAG_ALLTOALL, MCA_PML_BASE_SEND_STANDARD, comm, sreq)); if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(req, nreqs); + ompi_coll_base_free_reqs(req, nreqs); return err; } } @@ -112,7 +112,7 @@ mca_coll_basic_alltoall_inter(const void *sbuf, int scount, * the error after we free everything. */ err = ompi_request_wait_all(nreqs, req, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(req, nreqs); + ompi_coll_base_free_reqs(req, nreqs); } /* All done */ diff --git a/ompi/mca/coll/basic/coll_basic_alltoallv.c b/ompi/mca/coll/basic/coll_basic_alltoallv.c index b2deef8cfe..378825e91c 100644 --- a/ompi/mca/coll/basic/coll_basic_alltoallv.c +++ b/ompi/mca/coll/basic/coll_basic_alltoallv.c @@ -68,7 +68,7 @@ mca_coll_basic_alltoallv_inter(const void *sbuf, const int *scounts, const int * /* Initiate all send/recv to/from others. */ nreqs = rsize * 2; - preq = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, nreqs); + preq = coll_base_comm_get_reqs(module->base_data, nreqs); /* Post all receives first */ /* A simple optimization: do not send and recv msgs of length zero */ @@ -79,7 +79,7 @@ mca_coll_basic_alltoallv_inter(const void *sbuf, const int *scounts, const int * i, MCA_COLL_BASE_TAG_ALLTOALLV, comm, &preq[i])); if (MPI_SUCCESS != err) { - mca_coll_basic_free_reqs(preq, i); + ompi_coll_base_free_reqs(preq, i); return err; } } @@ -94,7 +94,7 @@ mca_coll_basic_alltoallv_inter(const void *sbuf, const int *scounts, const int * MCA_PML_BASE_SEND_STANDARD, comm, &preq[rsize + i])); if (MPI_SUCCESS != err) { - mca_coll_basic_free_reqs(preq, rsize + i); + ompi_coll_base_free_reqs(preq, rsize + i); return err; } } @@ -102,7 +102,7 @@ mca_coll_basic_alltoallv_inter(const void *sbuf, const int *scounts, const int * err = ompi_request_wait_all(nreqs, preq, MPI_STATUSES_IGNORE); if (MPI_SUCCESS != err) { - mca_coll_basic_free_reqs(preq, nreqs); + ompi_coll_base_free_reqs(preq, nreqs); } /* All done */ diff --git a/ompi/mca/coll/basic/coll_basic_alltoallw.c b/ompi/mca/coll/basic/coll_basic_alltoallw.c index 15dd4ed0ba..4b123151e3 100644 --- a/ompi/mca/coll/basic/coll_basic_alltoallw.c +++ b/ompi/mca/coll/basic/coll_basic_alltoallw.c @@ -70,7 +70,7 @@ mca_coll_basic_alltoallw_intra_inplace(const void *rbuf, const int *rcounts, con return OMPI_ERR_OUT_OF_RESOURCE; } - reqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t*) module, 2); + reqs = coll_base_comm_get_reqs( module->base_data, 2); /* in-place alltoallw slow algorithm (but works) */ for (i = 0 ; i < size ; ++i) { size_t msg_size_i; @@ -129,7 +129,7 @@ mca_coll_basic_alltoallw_intra_inplace(const void *rbuf, const int *rcounts, con free (tmp_buffer); if( MPI_SUCCESS != err ) { /* Free the requests. */ if( NULL != reqs ) { - mca_coll_basic_free_reqs(reqs, 2); + ompi_coll_base_free_reqs(reqs, 2); } } @@ -192,7 +192,7 @@ mca_coll_basic_alltoallw_intra(const void *sbuf, const int *scounts, const int * /* Initiate all send/recv to/from others. */ nreqs = 0; - reqs = preq = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, 2 * size); + reqs = preq = coll_base_comm_get_reqs(module->base_data, 2 * size); /* Post all receives first -- a simple optimization */ @@ -210,7 +210,7 @@ mca_coll_basic_alltoallw_intra(const void *sbuf, const int *scounts, const int * preq++)); ++nreqs; if (MPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, nreqs); + ompi_coll_base_free_reqs(reqs, nreqs); return err; } } @@ -232,7 +232,7 @@ mca_coll_basic_alltoallw_intra(const void *sbuf, const int *scounts, const int * preq++)); ++nreqs; if (MPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, nreqs); + ompi_coll_base_free_reqs(reqs, nreqs); return err; } } @@ -249,12 +249,10 @@ mca_coll_basic_alltoallw_intra(const void *sbuf, const int *scounts, const int * * error after we free everything. */ err = ompi_request_wait_all(nreqs, reqs, MPI_STATUSES_IGNORE); - /* Free the requests. */ - if( MPI_SUCCESS != err ) { - mca_coll_basic_free_reqs(reqs, nreqs); - } - /* All done */ + /* Free the requests in all cases as they are persistent */ + ompi_coll_base_free_reqs(reqs, nreqs); + /* All done */ return err; } @@ -287,7 +285,7 @@ mca_coll_basic_alltoallw_inter(const void *sbuf, const int *scounts, const int * /* Initiate all send/recv to/from others. */ nreqs = 0; - reqs = preq = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, 2 * size); + reqs = preq = coll_base_comm_get_reqs(module->base_data, 2 * size); /* Post all receives first -- a simple optimization */ for (i = 0; i < size; ++i) { @@ -304,7 +302,7 @@ mca_coll_basic_alltoallw_inter(const void *sbuf, const int *scounts, const int * comm, preq++)); ++nreqs; if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, nreqs); + ompi_coll_base_free_reqs(reqs, nreqs); return err; } } @@ -325,7 +323,7 @@ mca_coll_basic_alltoallw_inter(const void *sbuf, const int *scounts, const int * preq++)); ++nreqs; if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, nreqs); + ompi_coll_base_free_reqs(reqs, nreqs); return err; } } @@ -341,9 +339,8 @@ mca_coll_basic_alltoallw_inter(const void *sbuf, const int *scounts, const int * * error after we free everything. */ err = ompi_request_wait_all(nreqs, reqs, MPI_STATUSES_IGNORE); - if (OMPI_SUCCESS != err) { /* Free the requests. */ - mca_coll_basic_free_reqs(reqs, nreqs); - } + /* Free the requests in all cases as they are persistent */ + ompi_coll_base_free_reqs(reqs, nreqs); /* All done */ return err; diff --git a/ompi/mca/coll/basic/coll_basic_bcast.c b/ompi/mca/coll/basic/coll_basic_bcast.c index bf0757f1fa..1ded711acd 100644 --- a/ompi/mca/coll/basic/coll_basic_bcast.c +++ b/ompi/mca/coll/basic/coll_basic_bcast.c @@ -81,7 +81,7 @@ mca_coll_basic_bcast_log_intra(void *buff, int count, /* Send data to the children. */ - reqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, size); + reqs = coll_base_comm_get_reqs(module->base_data, size); err = MPI_SUCCESS; preq = reqs; @@ -92,12 +92,12 @@ mca_coll_basic_bcast_log_intra(void *buff, int count, peer = (peer + root) % size; ++nreqs; - err = MCA_PML_CALL(isend_init(buff, count, datatype, peer, - MCA_COLL_BASE_TAG_BCAST, - MCA_PML_BASE_SEND_STANDARD, - comm, preq++)); + err = MCA_PML_CALL(isend(buff, count, datatype, peer, + MCA_COLL_BASE_TAG_BCAST, + MCA_PML_BASE_SEND_STANDARD, + comm, preq++)); if (MPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, nreqs); + ompi_coll_base_free_reqs(reqs, nreqs); return err; } } @@ -107,10 +107,6 @@ mca_coll_basic_bcast_log_intra(void *buff, int count, if (nreqs > 0) { - /* Start your engines. This will never return an error. */ - - MCA_PML_CALL(start(nreqs, reqs)); - /* Wait for them all. If there's an error, note that we don't * care what the error was -- just that there *was* an error. * The PML will finish all requests, even if one or more of them @@ -119,11 +115,11 @@ mca_coll_basic_bcast_log_intra(void *buff, int count, * error, and return the error after we free everything. */ err = ompi_request_wait_all(nreqs, reqs, MPI_STATUSES_IGNORE); + if( MPI_SUCCESS != err ) { + ompi_coll_base_free_reqs(reqs, nreqs); + } } - if( MPI_SUCCESS != err ) { - mca_coll_basic_free_reqs(reqs, nreqs); - } /* All done */ return err; @@ -159,7 +155,7 @@ mca_coll_basic_bcast_lin_inter(void *buff, int count, MCA_COLL_BASE_TAG_BCAST, comm, MPI_STATUS_IGNORE)); } else { - reqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, rsize); + reqs = coll_base_comm_get_reqs(module->base_data, rsize); /* root section */ for (i = 0; i < rsize; i++) { err = MCA_PML_CALL(isend(buff, count, datatype, i, @@ -167,13 +163,13 @@ mca_coll_basic_bcast_lin_inter(void *buff, int count, MCA_PML_BASE_SEND_STANDARD, comm, &(reqs[i]))); if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, rsize); + ompi_coll_base_free_reqs(reqs, rsize); return err; } } err = ompi_request_wait_all(rsize, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, rsize); + ompi_coll_base_free_reqs(reqs, rsize); } } diff --git a/ompi/mca/coll/basic/coll_basic_component.c b/ompi/mca/coll/basic/coll_basic_component.c index b74cfdaf02..b413a63f68 100644 --- a/ompi/mca/coll/basic/coll_basic_component.c +++ b/ompi/mca/coll/basic/coll_basic_component.c @@ -106,22 +106,10 @@ basic_register(void) return OMPI_SUCCESS; } - -static void -mca_coll_basic_module_construct(mca_coll_basic_module_t *module) -{ - module->mccb_reqs = NULL; - module->mccb_num_reqs = 0; -} - -static void -mca_coll_basic_module_destruct(mca_coll_basic_module_t *module) -{ - if (NULL != module->mccb_reqs) free(module->mccb_reqs); -} - - OBJ_CLASS_INSTANCE(mca_coll_basic_module_t, mca_coll_base_module_t, - mca_coll_basic_module_construct, - mca_coll_basic_module_destruct); + NULL, + NULL); + +OBJ_CLASS_INSTANCE(mca_coll_basic_comm_t, mca_coll_base_comm_t, + NULL, NULL); diff --git a/ompi/mca/coll/basic/coll_basic_gatherv.c b/ompi/mca/coll/basic/coll_basic_gatherv.c index 9c9f748b40..0d42d5ee1f 100644 --- a/ompi/mca/coll/basic/coll_basic_gatherv.c +++ b/ompi/mca/coll/basic/coll_basic_gatherv.c @@ -142,21 +142,21 @@ mca_coll_basic_gatherv_inter(const void *sbuf, int scount, return OMPI_ERROR; } - reqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, size); + reqs = coll_base_comm_get_reqs(module->base_data, size); for (i = 0; i < size; ++i) { ptmp = ((char *) rbuf) + (extent * disps[i]); err = MCA_PML_CALL(irecv(ptmp, rcounts[i], rdtype, i, MCA_COLL_BASE_TAG_GATHERV, comm, &reqs[i])); if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, size); + ompi_coll_base_free_reqs(reqs, size); return err; } } err = ompi_request_wait_all(size, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, size); + ompi_coll_base_free_reqs(reqs, size); } } diff --git a/ompi/mca/coll/basic/coll_basic_module.c b/ompi/mca/coll/basic/coll_basic_module.c index 08e15cebe0..4e2f7769c3 100644 --- a/ompi/mca/coll/basic/coll_basic_module.c +++ b/ompi/mca/coll/basic/coll_basic_module.c @@ -181,11 +181,16 @@ int mca_coll_basic_module_enable(mca_coll_base_module_t *module, struct ompi_communicator_t *comm) { + /* prepare the placeholder for the array of request* */ + module->base_data = OBJ_NEW(mca_coll_basic_comm_t); + if (NULL == module->base_data) { + return OMPI_ERROR; + } + /* All done */ return OMPI_SUCCESS; } - int mca_coll_basic_ft_event(int state) { if(OPAL_CRS_CHECKPOINT == state) { diff --git a/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c b/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c index 1b323d644b..2aa7d8a878 100644 --- a/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c +++ b/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c @@ -50,7 +50,7 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount, ompi_datatype_get_extent(rdtype, &lb, &extent); - reqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 4 * cart->ndims ); + reqs = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims ); /* The ordering is defined as -1 then +1 in each dimension in * order of dimension. */ for (dim = 0, nreqs = 0 ; dim < cart->ndims ; ++dim) { @@ -99,13 +99,13 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount, } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs(reqs, nreqs); + ompi_coll_base_free_reqs(reqs, nreqs); return rc; } rc = ompi_request_wait_all (nreqs, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs(reqs, nreqs); + ompi_coll_base_free_reqs(reqs, nreqs); } return rc; } @@ -133,7 +133,7 @@ mca_coll_basic_neighbor_allgather_graph(const void *sbuf, int scount, } ompi_datatype_get_extent(rdtype, &lb, &extent); - reqs = preqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t *) module, 2 * degree); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, 2 * degree); for (neighbor = 0; neighbor < degree ; ++neighbor) { rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, edges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER, @@ -150,13 +150,13 @@ mca_coll_basic_neighbor_allgather_graph(const void *sbuf, int scount, } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, (2 * neighbor + 1)); + ompi_coll_base_free_reqs( reqs, (2 * neighbor + 1)); return rc; } rc = ompi_request_wait_all (degree * 2, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, degree * 2); + ompi_coll_base_free_reqs( reqs, degree * 2); } return rc; } @@ -182,7 +182,7 @@ mca_coll_basic_neighbor_allgather_dist_graph(const void *sbuf, int scount, outedges = dist_graph->out; ompi_datatype_get_extent(rdtype, &lb, &extent); - reqs = preqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t *) module, indegree + outdegree); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, indegree + outdegree); for (neighbor = 0; neighbor < indegree ; ++neighbor) { rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, inedges[neighbor], @@ -193,7 +193,7 @@ mca_coll_basic_neighbor_allgather_dist_graph(const void *sbuf, int scount, } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs(reqs, neighbor); + ompi_coll_base_free_reqs(reqs, neighbor); return rc; } @@ -208,13 +208,13 @@ mca_coll_basic_neighbor_allgather_dist_graph(const void *sbuf, int scount, } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs(reqs, indegree + neighbor); + ompi_coll_base_free_reqs(reqs, indegree + neighbor); return rc; } rc = ompi_request_wait_all (indegree + outdegree, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs(reqs, indegree + outdegree); + ompi_coll_base_free_reqs(reqs, indegree + outdegree); } return rc; } diff --git a/ompi/mca/coll/basic/coll_basic_neighbor_allgatherv.c b/ompi/mca/coll/basic/coll_basic_neighbor_allgatherv.c index 7e401f73e7..10a660e9c7 100644 --- a/ompi/mca/coll/basic/coll_basic_neighbor_allgatherv.c +++ b/ompi/mca/coll/basic/coll_basic_neighbor_allgatherv.c @@ -49,7 +49,7 @@ mca_coll_basic_neighbor_allgatherv_cart(const void *sbuf, int scount, struct omp ompi_datatype_get_extent(rdtype, &lb, &extent); - reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 4 * cart->ndims); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims); /* The ordering is defined as -1 then +1 in each dimension in * order of dimension. */ @@ -88,13 +88,13 @@ mca_coll_basic_neighbor_allgatherv_cart(const void *sbuf, int scount, struct omp } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, nreqs ); + ompi_coll_base_free_reqs( reqs, nreqs ); return rc; } rc = ompi_request_wait_all (nreqs, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, nreqs ); + ompi_coll_base_free_reqs( reqs, nreqs ); } return rc; } @@ -120,7 +120,7 @@ mca_coll_basic_neighbor_allgatherv_graph(const void *sbuf, int scount, struct om } ompi_datatype_get_extent(rdtype, &lb, &extent); - reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 2 * degree); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, 2 * degree); for (neighbor = 0; neighbor < degree ; ++neighbor) { rc = MCA_PML_CALL(irecv((char *) rbuf + disps[neighbor] * extent, rcounts[neighbor], @@ -136,13 +136,13 @@ mca_coll_basic_neighbor_allgatherv_graph(const void *sbuf, int scount, struct om } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, 2 * (neighbor + 1) ); + ompi_coll_base_free_reqs( reqs, 2 * (neighbor + 1) ); return rc; } rc = ompi_request_wait_all (degree * 2, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, 2 * degree ); + ompi_coll_base_free_reqs( reqs, 2 * degree ); } return rc; } @@ -167,7 +167,7 @@ mca_coll_basic_neighbor_allgatherv_dist_graph(const void *sbuf, int scount, stru outedges = dist_graph->out; ompi_datatype_get_extent(rdtype, &lb, &extent); - reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, indegree + outdegree); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, indegree + outdegree); for (neighbor = 0; neighbor < indegree ; ++neighbor) { rc = MCA_PML_CALL(irecv((char *) rbuf + disps[neighbor] * extent, rcounts[neighbor], rdtype, @@ -176,7 +176,7 @@ mca_coll_basic_neighbor_allgatherv_dist_graph(const void *sbuf, int scount, stru } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs(reqs, neighbor); + ompi_coll_base_free_reqs(reqs, neighbor); return rc; } @@ -190,13 +190,13 @@ mca_coll_basic_neighbor_allgatherv_dist_graph(const void *sbuf, int scount, stru } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs(reqs, indegree + neighbor); + ompi_coll_base_free_reqs(reqs, indegree + neighbor); return rc; } rc = ompi_request_wait_all (indegree + outdegree, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs(reqs, indegree + outdegree); + ompi_coll_base_free_reqs(reqs, indegree + outdegree); } return rc; } diff --git a/ompi/mca/coll/basic/coll_basic_neighbor_alltoall.c b/ompi/mca/coll/basic/coll_basic_neighbor_alltoall.c index 9382138b7f..96a734e38e 100644 --- a/ompi/mca/coll/basic/coll_basic_neighbor_alltoall.c +++ b/ompi/mca/coll/basic/coll_basic_neighbor_alltoall.c @@ -48,7 +48,7 @@ mca_coll_basic_neighbor_alltoall_cart(const void *sbuf, int scount, struct ompi_ ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); - reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 4 * cart->ndims); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims); /* post receives first */ for (dim = 0, nreqs = 0; dim < cart->ndims ; ++dim) { @@ -82,7 +82,7 @@ mca_coll_basic_neighbor_alltoall_cart(const void *sbuf, int scount, struct ompi_ } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, nreqs); + ompi_coll_base_free_reqs( reqs, nreqs); return rc; } @@ -121,13 +121,13 @@ mca_coll_basic_neighbor_alltoall_cart(const void *sbuf, int scount, struct ompi_ } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, nreqs); + ompi_coll_base_free_reqs( reqs, nreqs); return rc; } rc = ompi_request_wait_all (nreqs, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, nreqs); + ompi_coll_base_free_reqs( reqs, nreqs); } return rc; } @@ -153,7 +153,7 @@ mca_coll_basic_neighbor_alltoall_graph(const void *sbuf, int scount, struct ompi ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); - reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 2 * degree); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, 2 * degree); /* post receives first */ for (neighbor = 0; neighbor < degree ; ++neighbor) { @@ -163,7 +163,7 @@ mca_coll_basic_neighbor_alltoall_graph(const void *sbuf, int scount, struct ompi rbuf = (char *) rbuf + rdextent * rcount; } if( MPI_SUCCESS != rc ) { - mca_coll_basic_free_reqs( reqs, neighbor ); + ompi_coll_base_free_reqs( reqs, neighbor ); return rc; } @@ -178,13 +178,13 @@ mca_coll_basic_neighbor_alltoall_graph(const void *sbuf, int scount, struct ompi } if( MPI_SUCCESS != rc ) { - mca_coll_basic_free_reqs( reqs, degree + neighbor ); + ompi_coll_base_free_reqs( reqs, degree + neighbor ); return rc; } rc = ompi_request_wait_all (degree * 2, reqs, MPI_STATUSES_IGNORE); if( MPI_SUCCESS != rc ) { - mca_coll_basic_free_reqs( reqs, 2 * degree ); + ompi_coll_base_free_reqs( reqs, 2 * degree ); } return rc; } @@ -209,7 +209,7 @@ mca_coll_basic_neighbor_alltoall_dist_graph(const void *sbuf, int scount,struct ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); - reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, indegree + outdegree); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, indegree + outdegree); /* post receives first */ for (neighbor = 0; neighbor < indegree ; ++neighbor) { @@ -221,7 +221,7 @@ mca_coll_basic_neighbor_alltoall_dist_graph(const void *sbuf, int scount,struct } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs(reqs, neighbor); + ompi_coll_base_free_reqs(reqs, neighbor); return rc; } @@ -235,13 +235,13 @@ mca_coll_basic_neighbor_alltoall_dist_graph(const void *sbuf, int scount,struct } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs(reqs, indegree + neighbor); + ompi_coll_base_free_reqs(reqs, indegree + neighbor); return rc; } rc = ompi_request_wait_all (indegree + outdegree, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs(reqs, indegree + outdegree); + ompi_coll_base_free_reqs(reqs, indegree + outdegree); } return rc; } diff --git a/ompi/mca/coll/basic/coll_basic_neighbor_alltoallv.c b/ompi/mca/coll/basic/coll_basic_neighbor_alltoallv.c index af3a11172b..132e9c16ea 100644 --- a/ompi/mca/coll/basic/coll_basic_neighbor_alltoallv.c +++ b/ompi/mca/coll/basic/coll_basic_neighbor_alltoallv.c @@ -49,7 +49,7 @@ mca_coll_basic_neighbor_alltoallv_cart(const void *sbuf, const int scounts[], co ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); - reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 4 * cart->ndims ); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims ); /* post receives first */ for (dim = 0, nreqs = 0, i = 0; dim < cart->ndims ; ++dim, i += 2) { @@ -77,7 +77,7 @@ mca_coll_basic_neighbor_alltoallv_cart(const void *sbuf, const int scounts[], co } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, nreqs ); + ompi_coll_base_free_reqs( reqs, nreqs ); return rc; } @@ -107,13 +107,13 @@ mca_coll_basic_neighbor_alltoallv_cart(const void *sbuf, const int scounts[], co } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, nreqs ); + ompi_coll_base_free_reqs( reqs, nreqs ); return rc; } rc = ompi_request_wait_all (nreqs, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, nreqs ); + ompi_coll_base_free_reqs( reqs, nreqs ); } return rc; } @@ -140,7 +140,7 @@ mca_coll_basic_neighbor_alltoallv_graph(const void *sbuf, const int scounts[], c ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); - reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 2 * degree ); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, 2 * degree ); /* post all receives first */ for (neighbor = 0; neighbor < degree ; ++neighbor) { @@ -150,7 +150,7 @@ mca_coll_basic_neighbor_alltoallv_graph(const void *sbuf, const int scounts[], c } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, neighbor ); + ompi_coll_base_free_reqs( reqs, neighbor ); return rc; } @@ -163,13 +163,13 @@ mca_coll_basic_neighbor_alltoallv_graph(const void *sbuf, const int scounts[], c } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, degree + neighbor ); + ompi_coll_base_free_reqs( reqs, degree + neighbor ); return rc; } rc = ompi_request_wait_all (degree * 2, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, degree * 2); + ompi_coll_base_free_reqs( reqs, degree * 2); } return rc; } @@ -195,7 +195,7 @@ mca_coll_basic_neighbor_alltoallv_dist_graph(const void *sbuf, const int scounts ompi_datatype_get_extent(rdtype, &lb, &rdextent); ompi_datatype_get_extent(sdtype, &lb, &sdextent); - reqs = preqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t *) module, indegree + outdegree); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, indegree + outdegree); /* post all receives first */ for (neighbor = 0; neighbor < indegree ; ++neighbor) { @@ -205,7 +205,7 @@ mca_coll_basic_neighbor_alltoallv_dist_graph(const void *sbuf, const int scounts } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, neighbor ); + ompi_coll_base_free_reqs( reqs, neighbor ); return rc; } @@ -218,13 +218,13 @@ mca_coll_basic_neighbor_alltoallv_dist_graph(const void *sbuf, const int scounts } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, indegree + neighbor ); + ompi_coll_base_free_reqs( reqs, indegree + neighbor ); return rc; } rc = ompi_request_wait_all (indegree + outdegree, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, indegree + outdegree ); + ompi_coll_base_free_reqs( reqs, indegree + outdegree ); } return rc; } diff --git a/ompi/mca/coll/basic/coll_basic_neighbor_alltoallw.c b/ompi/mca/coll/basic/coll_basic_neighbor_alltoallw.c index 20693f9763..9fbbd500ca 100644 --- a/ompi/mca/coll/basic/coll_basic_neighbor_alltoallw.c +++ b/ompi/mca/coll/basic/coll_basic_neighbor_alltoallw.c @@ -46,7 +46,7 @@ mca_coll_basic_neighbor_alltoallw_cart(const void *sbuf, const int scounts[], co int rc = MPI_SUCCESS, dim, i, nreqs; ompi_request_t **reqs, **preqs; - reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 4 * cart->ndims ); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims ); /* post receives first */ for (dim = 0, i = 0, nreqs = 0; dim < cart->ndims ; ++dim, i += 2) { @@ -74,7 +74,7 @@ mca_coll_basic_neighbor_alltoallw_cart(const void *sbuf, const int scounts[], co } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, nreqs ); + ompi_coll_base_free_reqs( reqs, nreqs ); return rc; } @@ -104,13 +104,13 @@ mca_coll_basic_neighbor_alltoallw_cart(const void *sbuf, const int scounts[], co } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, nreqs ); + ompi_coll_base_free_reqs( reqs, nreqs ); return rc; } rc = ompi_request_wait_all (nreqs, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, nreqs ); + ompi_coll_base_free_reqs( reqs, nreqs ); } return rc; } @@ -128,7 +128,7 @@ mca_coll_basic_neighbor_alltoallw_graph(const void *sbuf, const int scounts[], c const int *edges; mca_topo_base_graph_neighbors_count (comm, rank, °ree); - reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, 2 * degree ); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, 2 * degree ); edges = graph->edges; if (rank > 0) { @@ -143,7 +143,7 @@ mca_coll_basic_neighbor_alltoallw_graph(const void *sbuf, const int scounts[], c } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, neighbor ); + ompi_coll_base_free_reqs( reqs, neighbor ); return rc; } @@ -156,13 +156,13 @@ mca_coll_basic_neighbor_alltoallw_graph(const void *sbuf, const int scounts[], c } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, neighbor + degree ); + ompi_coll_base_free_reqs( reqs, neighbor + degree ); return rc; } rc = ompi_request_wait_all (degree * 2, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, degree * 2 ); + ompi_coll_base_free_reqs( reqs, degree * 2 ); } return rc; } @@ -185,7 +185,7 @@ mca_coll_basic_neighbor_alltoallw_dist_graph(const void *sbuf, const int scounts inedges = dist_graph->in; outedges = dist_graph->out; - reqs = preqs = mca_coll_basic_get_reqs( (mca_coll_basic_module_t *) module, indegree + outdegree ); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, indegree + outdegree ); /* post all receives first */ for (neighbor = 0; neighbor < indegree ; ++neighbor) { rc = MCA_PML_CALL(irecv((char *) rbuf + rdisps[neighbor], rcounts[neighbor], rdtypes[neighbor], @@ -194,7 +194,7 @@ mca_coll_basic_neighbor_alltoallw_dist_graph(const void *sbuf, const int scounts } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, neighbor ); + ompi_coll_base_free_reqs( reqs, neighbor ); return rc; } @@ -207,13 +207,13 @@ mca_coll_basic_neighbor_alltoallw_dist_graph(const void *sbuf, const int scounts } if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, indegree + neighbor ); + ompi_coll_base_free_reqs( reqs, indegree + neighbor ); return rc; } rc = ompi_request_wait_all (indegree + outdegree, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != rc) { - mca_coll_basic_free_reqs( reqs, indegree + outdegree ); + ompi_coll_base_free_reqs( reqs, indegree + outdegree ); } return rc; } diff --git a/ompi/mca/coll/basic/coll_basic_scatter.c b/ompi/mca/coll/basic/coll_basic_scatter.c index ba02924673..09f3aba447 100644 --- a/ompi/mca/coll/basic/coll_basic_scatter.c +++ b/ompi/mca/coll/basic/coll_basic_scatter.c @@ -68,7 +68,7 @@ mca_coll_basic_scatter_inter(const void *sbuf, int scount, return OMPI_ERROR; } - reqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, size); + reqs = coll_base_comm_get_reqs(module->base_data, size); incr *= scount; for (i = 0, ptmp = (char *) sbuf; i < size; ++i, ptmp += incr) { @@ -77,14 +77,14 @@ mca_coll_basic_scatter_inter(const void *sbuf, int scount, MCA_PML_BASE_SEND_STANDARD, comm, reqs++)); if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, i); + ompi_coll_base_free_reqs(reqs, i); return err; } } err = ompi_request_wait_all(size, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, size); + ompi_coll_base_free_reqs(reqs, size); } } diff --git a/ompi/mca/coll/basic/coll_basic_scatterv.c b/ompi/mca/coll/basic/coll_basic_scatterv.c index e06905497c..e7d5947cae 100644 --- a/ompi/mca/coll/basic/coll_basic_scatterv.c +++ b/ompi/mca/coll/basic/coll_basic_scatterv.c @@ -144,7 +144,7 @@ mca_coll_basic_scatterv_inter(const void *sbuf, const int *scounts, return OMPI_ERROR; } - reqs = mca_coll_basic_get_reqs((mca_coll_basic_module_t*) module, size); + reqs = coll_base_comm_get_reqs(module->base_data, size); for (i = 0; i < size; ++i) { ptmp = ((char *) sbuf) + (extent * disps[i]); err = MCA_PML_CALL(isend(ptmp, scounts[i], sdtype, i, @@ -152,14 +152,14 @@ mca_coll_basic_scatterv_inter(const void *sbuf, const int *scounts, MCA_PML_BASE_SEND_STANDARD, comm, &(reqs[i]))); if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, i); + ompi_coll_base_free_reqs(reqs, i); return err; } } err = ompi_request_wait_all(size, reqs, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != err) { - mca_coll_basic_free_reqs(reqs, size); + ompi_coll_base_free_reqs(reqs, size); } } diff --git a/ompi/mca/coll/tuned/coll_tuned_module.c b/ompi/mca/coll/tuned/coll_tuned_module.c index 0469a62b7d..dda17a4ef2 100644 --- a/ompi/mca/coll/tuned/coll_tuned_module.c +++ b/ompi/mca/coll/tuned/coll_tuned_module.c @@ -200,7 +200,7 @@ tuned_module_enable( mca_coll_base_module_t *module, * The default is set very high */ - /* if we within the memory/size limit, allow preallocated data */ + /* prepare the placeholder for the array of request* */ data = OBJ_NEW(mca_coll_base_comm_t); if (NULL == data) { return OMPI_ERROR; From a8bdd8f668a9383624c7fb5a0b34959f006e98a2 Mon Sep 17 00:00:00 2001 From: George Bosilca Date: Fri, 25 Sep 2015 03:17:23 +0200 Subject: [PATCH 4/6] Don't lose the pointer to the request array. Patch provided by @ggouaillardet. --- ompi/mca/coll/basic/coll_basic_neighbor_allgather.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c b/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c index 2aa7d8a878..c59ae863a0 100644 --- a/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c +++ b/ompi/mca/coll/basic/coll_basic_neighbor_allgather.c @@ -44,13 +44,13 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount, { const mca_topo_base_comm_cart_2_2_0_t *cart = comm->c_topo->mtc.cart; const int rank = ompi_comm_rank (comm); - ompi_request_t **reqs; + ompi_request_t **reqs, **preqs; ptrdiff_t lb, extent; int rc = MPI_SUCCESS, dim, nreqs; ompi_datatype_get_extent(rdtype, &lb, &extent); - reqs = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims ); + reqs = preqs = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims ); /* The ordering is defined as -1 then +1 in each dimension in * order of dimension. */ for (dim = 0, nreqs = 0 ; dim < cart->ndims ; ++dim) { @@ -66,7 +66,7 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount, nreqs += 2; rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, srank, MCA_COLL_BASE_TAG_ALLGATHER, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; /* remove cast from const when the pml layer is updated to take @@ -74,7 +74,7 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount, rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, srank, MCA_COLL_BASE_TAG_ALLGATHER, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; } @@ -84,14 +84,14 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount, nreqs += 2; rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, drank, MCA_COLL_BASE_TAG_ALLGATHER, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, drank, MCA_COLL_BASE_TAG_ALLGATHER, MCA_PML_BASE_SEND_STANDARD, - comm, reqs++)); + comm, preqs++)); if (OMPI_SUCCESS != rc) break; } From 99cca2cfd34d921510221cbebfc06314cb521798 Mon Sep 17 00:00:00 2001 From: Gilles Gouaillardet Date: Tue, 22 Sep 2015 00:31:44 +0900 Subject: [PATCH 5/6] Revert "* comment on communicator creation in mca_topo_base_dist_graph_create(...)" This partially reverts commit open-mpi/ompi@27e4389259ff3117f6143ca4512bf0685a7a1abd. --- ompi/mca/coll/basic/coll_basic_module.c | 16 +++++++++------- .../topo/base/topo_base_dist_graph_create.c | 18 ++++++++++++------ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/ompi/mca/coll/basic/coll_basic_module.c b/ompi/mca/coll/basic/coll_basic_module.c index 4e2f7769c3..7c069476a9 100644 --- a/ompi/mca/coll/basic/coll_basic_module.c +++ b/ompi/mca/coll/basic/coll_basic_module.c @@ -76,10 +76,11 @@ mca_coll_basic_comm_query(struct ompi_communicator_t *comm, } size *= 2; if (OMPI_COMM_IS_CART(comm)) { - int cart_size, ndims; + int cart_size; + mca_topo_base_comm_cart_2_2_0_t *cart; assert (NULL != comm->c_topo); - comm->c_topo->topo.cart.cartdim_get(comm, &ndims); - cart_size = ndims * 4; + cart = comm->c_topo->mtc.cart; + cart_size = cart->ndims * 4; if (cart_size > size) { size = cart_size; } @@ -87,16 +88,17 @@ mca_coll_basic_comm_query(struct ompi_communicator_t *comm, int rank, degree; assert (NULL != comm->c_topo); rank = ompi_comm_rank (comm); - comm->c_topo->topo.graph.graph_neighbors_count (comm, rank, °ree); + mca_topo_base_graph_neighbors_count (comm, rank, °ree); degree *= 2; if (degree > size) { size = degree; } } else if (OMPI_COMM_IS_DIST_GRAPH(comm)) { - int dist_graph_size, inneighbors, outneighbors, weighted; + int dist_graph_size; + mca_topo_base_comm_dist_graph_2_2_0_t *dist_graph; assert (NULL != comm->c_topo); - comm->c_topo->topo.dist_graph.dist_graph_neighbors_count(comm, &inneighbors, &outneighbors, &weighted); - dist_graph_size = inneighbors + outneighbors; + dist_graph = comm->c_topo->mtc.dist_graph; + dist_graph_size = dist_graph->indegree + dist_graph->outdegree; if (dist_graph_size > size) { size = dist_graph_size; } diff --git a/ompi/mca/topo/base/topo_base_dist_graph_create.c b/ompi/mca/topo/base/topo_base_dist_graph_create.c index 30b04c1708..2dcd8a994e 100644 --- a/ompi/mca/topo/base/topo_base_dist_graph_create.c +++ b/ompi/mca/topo/base/topo_base_dist_graph_create.c @@ -287,15 +287,23 @@ int mca_topo_base_dist_graph_create(mca_topo_base_module_t* module, ompi_communicator_t **newcomm) { int err; + ompi_proc_t **topo_procs = NULL; int num_procs, ret, rank, i; ompi_communicator_t *new_comm; mca_topo_base_comm_dist_graph_2_2_0_t* topo; - num_procs = ompi_comm_size(comm_old); + num_procs = ompi_comm_size(comm_old); + rank = ompi_comm_rank(comm_old); topo_procs = (ompi_proc_t**)malloc(num_procs * sizeof(ompi_proc_t *)); - if (NULL == topo_procs) { - return OMPI_ERR_OUT_OF_RESOURCE; + if(OMPI_GROUP_IS_DENSE(comm_old->c_local_group)) { + memcpy(topo_procs, + comm_old->c_local_group->grp_proc_pointers, + num_procs * sizeof(ompi_proc_t *)); + } else { + for(i = 0 ; i < num_procs; i++) { + topo_procs[i] = ompi_group_peer_lookup(comm_old->c_local_group,i); + } } new_comm = ompi_comm_allocate(num_procs, 0); if (NULL == new_comm) { @@ -310,12 +318,10 @@ int mca_topo_base_dist_graph_create(mca_topo_base_module_t* module, &topo); if( OMPI_SUCCESS != err ) { free(topo_procs); - ompi_comm_free(&new_comm); + ompi_comm_free(newcomm); return err; } - /* we cannot simply call ompi_comm_create because c_topo - must be set before invoking ompi_comm_enable */ rank = ompi_comm_rank(comm_old); if(OMPI_GROUP_IS_DENSE(comm_old->c_local_group)) { memcpy(topo_procs, From e946c82847ee01f5e619225ec30a770e1755002e Mon Sep 17 00:00:00 2001 From: Gilles Gouaillardet Date: Tue, 22 Sep 2015 00:37:02 +0900 Subject: [PATCH 6/6] Revert "coll/basic: fix segmentation fault in neighborhood collectives if the degree" This partially reverts commit open-mpi/ompi@76204dfafe48c2859fe3c8250e2d9f3c23799a76. --- ompi/mca/coll/basic/coll_basic_module.c | 42 +-------- ompi/mca/topo/base/topo_base_cart_create.c | 10 +-- .../topo/base/topo_base_dist_graph_create.c | 90 ++++--------------- ompi/mca/topo/base/topo_base_graph_create.c | 11 ++- 4 files changed, 27 insertions(+), 126 deletions(-) diff --git a/ompi/mca/coll/basic/coll_basic_module.c b/ompi/mca/coll/basic/coll_basic_module.c index 7c069476a9..458464e442 100644 --- a/ompi/mca/coll/basic/coll_basic_module.c +++ b/ompi/mca/coll/basic/coll_basic_module.c @@ -13,7 +13,7 @@ * Copyright (c) 2012 Sandia National Laboratories. All rights reserved. * Copyright (c) 2013 Los Alamos National Security, LLC. All rights * reserved. - * Copyright (c) 2014 Research Organization for Information Science + * Copyright (c) 2015 Research Organization for Information Science * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * @@ -30,8 +30,6 @@ #include "mpi.h" #include "ompi/mca/coll/coll.h" #include "ompi/mca/coll/base/base.h" -#include "ompi/mca/topo/topo.h" -#include "ompi/mca/topo/base/base.h" #include "coll_basic.h" @@ -59,7 +57,6 @@ mca_coll_base_module_t * mca_coll_basic_comm_query(struct ompi_communicator_t *comm, int *priority) { - int size; mca_coll_basic_module_t *basic_module; basic_module = OBJ_NEW(mca_coll_basic_module_t); @@ -67,43 +64,6 @@ mca_coll_basic_comm_query(struct ompi_communicator_t *comm, *priority = mca_coll_basic_priority; - /* Allocate the data that hangs off the communicator */ - - if (OMPI_COMM_IS_INTER(comm)) { - size = ompi_comm_remote_size(comm); - } else { - size = ompi_comm_size(comm); - } - size *= 2; - if (OMPI_COMM_IS_CART(comm)) { - int cart_size; - mca_topo_base_comm_cart_2_2_0_t *cart; - assert (NULL != comm->c_topo); - cart = comm->c_topo->mtc.cart; - cart_size = cart->ndims * 4; - if (cart_size > size) { - size = cart_size; - } - } else if (OMPI_COMM_IS_GRAPH(comm)) { - int rank, degree; - assert (NULL != comm->c_topo); - rank = ompi_comm_rank (comm); - mca_topo_base_graph_neighbors_count (comm, rank, °ree); - degree *= 2; - if (degree > size) { - size = degree; - } - } else if (OMPI_COMM_IS_DIST_GRAPH(comm)) { - int dist_graph_size; - mca_topo_base_comm_dist_graph_2_2_0_t *dist_graph; - assert (NULL != comm->c_topo); - dist_graph = comm->c_topo->mtc.dist_graph; - dist_graph_size = dist_graph->indegree + dist_graph->outdegree; - if (dist_graph_size > size) { - size = dist_graph_size; - } - } - /* Choose whether to use [intra|inter], and [linear|log]-based * algorithms. */ basic_module->super.coll_module_enable = mca_coll_basic_module_enable; diff --git a/ompi/mca/topo/base/topo_base_cart_create.c b/ompi/mca/topo/base/topo_base_cart_create.c index c4737096d5..2e7257d544 100644 --- a/ompi/mca/topo/base/topo_base_cart_create.c +++ b/ompi/mca/topo/base/topo_base_cart_create.c @@ -160,12 +160,6 @@ int mca_topo_base_cart_create(mca_topo_base_module_t *topo, return MPI_ERR_INTERN; } - assert(NULL == new_comm->c_topo); - assert(!(new_comm->c_flags & OMPI_COMM_CART)); - new_comm->c_topo = topo; - new_comm->c_topo->mtc.cart = cart; - new_comm->c_topo->reorder = reorder; - new_comm->c_flags |= OMPI_COMM_CART; ret = ompi_comm_enable(old_comm, new_comm, new_rank, num_procs, topo_procs); if (OMPI_SUCCESS != ret) { @@ -180,6 +174,10 @@ int mca_topo_base_cart_create(mca_topo_base_module_t *topo, return ret; } + new_comm->c_topo = topo; + new_comm->c_topo->mtc.cart = cart; + new_comm->c_topo->reorder = reorder; + new_comm->c_flags |= OMPI_COMM_CART; *comm_topo = new_comm; if( MPI_UNDEFINED == new_rank ) { diff --git a/ompi/mca/topo/base/topo_base_dist_graph_create.c b/ompi/mca/topo/base/topo_base_dist_graph_create.c index 2dcd8a994e..ce5d58b284 100644 --- a/ompi/mca/topo/base/topo_base_dist_graph_create.c +++ b/ompi/mca/topo/base/topo_base_dist_graph_create.c @@ -288,84 +288,28 @@ int mca_topo_base_dist_graph_create(mca_topo_base_module_t* module, { int err; - ompi_proc_t **topo_procs = NULL; - int num_procs, ret, rank, i; - ompi_communicator_t *new_comm; - mca_topo_base_comm_dist_graph_2_2_0_t* topo; - num_procs = ompi_comm_size(comm_old); - num_procs = ompi_comm_size(comm_old); - rank = ompi_comm_rank(comm_old); - topo_procs = (ompi_proc_t**)malloc(num_procs * sizeof(ompi_proc_t *)); - if(OMPI_GROUP_IS_DENSE(comm_old->c_local_group)) { - memcpy(topo_procs, - comm_old->c_local_group->grp_proc_pointers, - num_procs * sizeof(ompi_proc_t *)); - } else { - for(i = 0 ; i < num_procs; i++) { - topo_procs[i] = ompi_group_peer_lookup(comm_old->c_local_group,i); - } - } - new_comm = ompi_comm_allocate(num_procs, 0); - if (NULL == new_comm) { - free(topo_procs); - return OMPI_ERR_OUT_OF_RESOURCE; - } - err = mca_topo_base_dist_graph_distribute(module, - comm_old, - n, nodes, - degrees, targets, - weights, - &topo); - if( OMPI_SUCCESS != err ) { - free(topo_procs); - ompi_comm_free(newcomm); + if( OMPI_SUCCESS != (err = ompi_comm_create(comm_old, + comm_old->c_local_group, + newcomm)) ) { + OBJ_RELEASE(module); return err; } - rank = ompi_comm_rank(comm_old); - if(OMPI_GROUP_IS_DENSE(comm_old->c_local_group)) { - memcpy(topo_procs, - comm_old->c_local_group->grp_proc_pointers, - num_procs * sizeof(ompi_proc_t *)); - } else { - for(i = 0 ; i < num_procs; i++) { - topo_procs[i] = ompi_group_peer_lookup(comm_old->c_local_group,i); - } - } - assert(NULL == new_comm->c_topo); - new_comm->c_topo = module; - new_comm->c_topo->reorder = reorder; - new_comm->c_flags |= OMPI_COMM_DIST_GRAPH; - new_comm->c_topo->mtc.dist_graph = topo; + assert(NULL == (*newcomm)->c_topo); + (*newcomm)->c_topo = module; + (*newcomm)->c_topo->reorder = reorder; + (*newcomm)->c_flags |= OMPI_COMM_DIST_GRAPH; - ret = ompi_comm_enable(comm_old, new_comm, - rank, num_procs, topo_procs); - if (OMPI_SUCCESS != ret) { - if ( NULL != topo->in ) { - free(topo->in); - } - if ( NULL != topo->out ) { - free(topo->out); - } - if ( NULL != topo->inw ) { - free(topo->inw); - } - if ( NULL != topo->outw ) { - free(topo->outw); - } - if (MPI_COMM_NULL != new_comm) { - new_comm->c_topo->mtc.dist_graph = NULL; - new_comm->c_topo = NULL; - new_comm->c_flags &= ~OMPI_COMM_DIST_GRAPH; - ompi_comm_free (&new_comm); - } - free(topo); - free(topo_procs); - return ret; + err = mca_topo_base_dist_graph_distribute(module, + *newcomm, + n, nodes, + degrees, targets, + weights, + &((*newcomm)->c_topo->mtc.dist_graph)); + if( OMPI_SUCCESS != err ) { + ompi_comm_free(newcomm); } - *newcomm = new_comm; - - return OMPI_SUCCESS; + return err; } static void mca_topo_base_comm_dist_graph_2_2_0_construct(mca_topo_base_comm_dist_graph_2_2_0_t * dist_graph) { diff --git a/ompi/mca/topo/base/topo_base_graph_create.c b/ompi/mca/topo/base/topo_base_graph_create.c index e2998bd185..f41cd033d9 100644 --- a/ompi/mca/topo/base/topo_base_graph_create.c +++ b/ompi/mca/topo/base/topo_base_graph_create.c @@ -123,11 +123,6 @@ int mca_topo_base_graph_create(mca_topo_base_module_t *topo, return OMPI_ERR_OUT_OF_RESOURCE; } - new_comm->c_topo = topo; - new_comm->c_topo->mtc.graph = graph; - new_comm->c_flags |= OMPI_COMM_GRAPH; - new_comm->c_topo->reorder = reorder; - ret = ompi_comm_enable(old_comm, new_comm, new_rank, num_procs, topo_procs); if (OMPI_SUCCESS != ret) { @@ -140,7 +135,11 @@ int mca_topo_base_graph_create(mca_topo_base_module_t *topo, } return ret; } - + + new_comm->c_topo = topo; + new_comm->c_topo->mtc.graph = graph; + new_comm->c_flags |= OMPI_COMM_GRAPH; + new_comm->c_topo->reorder = reorder; *comm_topo = new_comm; if( MPI_UNDEFINED == new_rank ) {