Fix multiple issues with the collective requests.
This patch addresses most (if not all) @derbeyn concerns expressed on #1015. I added checks for the requests allocation in all functions, ompi_coll_base_free_reqs is called with the right number of requests, I removed the unnecessary basic_module_comm_t and use the base_module_comm_t instead, I remove all uses of the COLL_BASE_BCAST_USE_BLOCKING define, and other minor fixes.
Этот коммит содержится в:
родитель
dec23f3d39
Коммит
4b38b6bd0c
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -44,7 +44,7 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
|
||||
mca_coll_base_module_t *base_module = (mca_coll_base_module_t*) module;
|
||||
int i, j, size, rank, err = MPI_SUCCESS, line;
|
||||
OPAL_PTRDIFF_TYPE ext, gap;
|
||||
MPI_Request *preq;
|
||||
ompi_request_t **preq, **reqs;
|
||||
char *tmp_buffer;
|
||||
size_t max_size;
|
||||
|
||||
@ -62,19 +62,20 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
|
||||
ompi_datatype_type_extent (rdtype, &ext);
|
||||
max_size = opal_datatype_span(&rdtype->super, rcount, &gap);
|
||||
|
||||
/* Initiate all send/recv to/from others. */
|
||||
reqs = coll_base_comm_get_reqs(base_module->base_data, 2);
|
||||
if( NULL == reqs ) { err = OMPI_ERR_OUT_OF_RESOURCE; line = __LINE__; goto error_hndl; }
|
||||
|
||||
/* Allocate a temporary buffer */
|
||||
tmp_buffer = calloc (max_size, 1);
|
||||
if (NULL == tmp_buffer) {
|
||||
return OMPI_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
if (NULL == tmp_buffer) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
tmp_buffer -= gap;
|
||||
max_size = ext * rcount;
|
||||
|
||||
/* in-place alltoall slow algorithm (but works) */
|
||||
for (i = 0 ; i < size ; ++i) {
|
||||
for (j = i+1 ; j < size ; ++j) {
|
||||
/* Initiate all send/recv to/from others. */
|
||||
preq = coll_base_comm_get_reqs(base_module->base_data, size * 2);
|
||||
preq = reqs;
|
||||
|
||||
if (i == rank) {
|
||||
/* Copy the data into the temporary buffer */
|
||||
@ -111,7 +112,7 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
|
||||
}
|
||||
|
||||
/* Wait for the requests to complete */
|
||||
err = ompi_request_wait_all (2, base_module->base_data->mcct_reqs, MPI_STATUSES_IGNORE);
|
||||
err = ompi_request_wait_all (2, reqs, MPI_STATUSES_IGNORE);
|
||||
if (MPI_SUCCESS != err) { line = __LINE__; goto error_hndl; }
|
||||
}
|
||||
}
|
||||
@ -125,7 +126,7 @@ mca_coll_base_alltoall_intra_basic_inplace(const void *rbuf, int rcount,
|
||||
"%s:%4d\tError occurred %d, rank %2d", __FILE__, line, err,
|
||||
rank));
|
||||
(void)line; // silence compiler warning
|
||||
ompi_coll_base_free_reqs(base_module->base_data->mcct_reqs, 2);
|
||||
ompi_coll_base_free_reqs(reqs, 2);
|
||||
}
|
||||
|
||||
/* All done */
|
||||
@ -400,20 +401,20 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
|
||||
|
||||
/* Post first batch or ireceive and isend requests */
|
||||
for (nreqs = 0, nrreqs = 0, ri = (rank + 1) % size; nreqs < total_reqs;
|
||||
ri = (ri + 1) % size, ++nreqs, ++nrreqs) {
|
||||
error =
|
||||
MCA_PML_CALL(irecv
|
||||
(prcv + (ptrdiff_t)ri * rext, rcount, rdtype, ri,
|
||||
MCA_COLL_BASE_TAG_ALLTOALL, comm, &reqs[nreqs]));
|
||||
ri = (ri + 1) % size, ++nrreqs) {
|
||||
nreqs++;
|
||||
error = MCA_PML_CALL(irecv
|
||||
(prcv + (ptrdiff_t)ri * rext, rcount, rdtype, ri,
|
||||
MCA_COLL_BASE_TAG_ALLTOALL, comm, &reqs[nreqs]));
|
||||
if (MPI_SUCCESS != error) { line = __LINE__; goto error_hndl; }
|
||||
}
|
||||
for ( nsreqs = 0, si = (rank + size - 1) % size; nreqs < 2 * total_reqs;
|
||||
si = (si + size - 1) % size, ++nreqs, ++nsreqs) {
|
||||
error =
|
||||
MCA_PML_CALL(isend
|
||||
(psnd + (ptrdiff_t)si * sext, scount, sdtype, si,
|
||||
MCA_COLL_BASE_TAG_ALLTOALL,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm, &reqs[nreqs]));
|
||||
for (nsreqs = 0, si = (rank + size - 1) % size; nreqs < 2 * total_reqs;
|
||||
si = (si + size - 1) % size, ++nsreqs) {
|
||||
nreqs++;
|
||||
error = MCA_PML_CALL(isend
|
||||
(psnd + (ptrdiff_t)si * sext, scount, sdtype, si,
|
||||
MCA_COLL_BASE_TAG_ALLTOALL,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm, &reqs[nreqs]));
|
||||
if (MPI_SUCCESS != error) { line = __LINE__; goto error_hndl; }
|
||||
}
|
||||
|
||||
@ -441,11 +442,10 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
|
||||
ncreqs++;
|
||||
if (completed < total_reqs) {
|
||||
if (nrreqs < (size - 1)) {
|
||||
error =
|
||||
MCA_PML_CALL(irecv
|
||||
(prcv + (ptrdiff_t)ri * rext, rcount, rdtype, ri,
|
||||
MCA_COLL_BASE_TAG_ALLTOALL, comm,
|
||||
&reqs[completed]));
|
||||
error = MCA_PML_CALL(irecv
|
||||
(prcv + (ptrdiff_t)ri * rext, rcount, rdtype, ri,
|
||||
MCA_COLL_BASE_TAG_ALLTOALL, comm,
|
||||
&reqs[completed]));
|
||||
if (MPI_SUCCESS != error) { line = __LINE__; goto error_hndl; }
|
||||
++nrreqs;
|
||||
ri = (ri + 1) % size;
|
||||
@ -457,6 +457,7 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
|
||||
MCA_COLL_BASE_TAG_ALLTOALL,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm,
|
||||
&reqs[completed]));
|
||||
if (MPI_SUCCESS != error) { line = __LINE__; goto error_hndl; }
|
||||
++nsreqs;
|
||||
si = (si + size - 1) % size;
|
||||
}
|
||||
@ -472,7 +473,7 @@ int ompi_coll_base_alltoall_intra_linear_sync(const void *sbuf, int scount,
|
||||
"%s:%4d\tError occurred %d, rank %2d", __FILE__, line, error,
|
||||
rank));
|
||||
(void)line; // silence compiler warning
|
||||
ompi_coll_base_free_reqs(reqs, 2 * total_reqs);
|
||||
ompi_coll_base_free_reqs(reqs, nreqs);
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -610,6 +611,7 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount,
|
||||
/* Initiate all send/recv to/from others. */
|
||||
|
||||
req = rreq = coll_base_comm_get_reqs(data, (size - 1) * 2);
|
||||
if (NULL == req) { err = OMPI_ERR_OUT_OF_RESOURCE; line = __LINE__; goto err_hndl; }
|
||||
|
||||
prcv = (char *) rbuf;
|
||||
psnd = (char *) sbuf;
|
||||
@ -617,7 +619,8 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount,
|
||||
/* Post all receives first -- a simple optimization */
|
||||
|
||||
for (nreqs = 0, i = (rank + 1) % size; i != rank;
|
||||
i = (i + 1) % size, ++rreq, ++nreqs) {
|
||||
i = (i + 1) % size, ++rreq) {
|
||||
nreqs++;
|
||||
err = MCA_PML_CALL(irecv_init
|
||||
(prcv + (ptrdiff_t)i * rcvinc, rcount, rdtype, i,
|
||||
MCA_COLL_BASE_TAG_ALLTOALL, comm, rreq));
|
||||
@ -630,7 +633,8 @@ int ompi_coll_base_alltoall_intra_basic_linear(const void *sbuf, int scount,
|
||||
*/
|
||||
sreq = rreq;
|
||||
for (i = (rank + size - 1) % size; i != rank;
|
||||
i = (i + size - 1) % size, ++sreq, ++nreqs) {
|
||||
i = (i + size - 1) % size, ++sreq) {
|
||||
nreqs++;
|
||||
err = MCA_PML_CALL(isend_init
|
||||
(psnd + (ptrdiff_t)i * sndinc, scount, sdtype, i,
|
||||
MCA_COLL_BASE_TAG_ALLTOALL,
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -44,7 +44,7 @@ mca_coll_base_alltoallv_intra_basic_inplace(const void *rbuf, const int *rcounts
|
||||
{
|
||||
mca_coll_base_module_t *base_module = (mca_coll_base_module_t*) module;
|
||||
int i, j, size, rank, err=MPI_SUCCESS;
|
||||
MPI_Request *preq;
|
||||
ompi_request_t **preq, **reqs;
|
||||
char *tmp_buffer;
|
||||
size_t max_size, rdtype_size;
|
||||
OPAL_PTRDIFF_TYPE ext, gap = 0;
|
||||
@ -75,11 +75,14 @@ mca_coll_base_alltoallv_intra_basic_inplace(const void *rbuf, const int *rcounts
|
||||
}
|
||||
tmp_buffer += gap;
|
||||
|
||||
/* Initiate all send/recv to/from others. */
|
||||
reqs = preq = coll_base_comm_get_reqs(base_module->base_data, 2);
|
||||
if( NULL == reqs ) { err = OMPI_ERR_OUT_OF_RESOURCE; goto error_hndl; }
|
||||
|
||||
/* in-place alltoallv slow algorithm (but works) */
|
||||
for (i = 0 ; i < size ; ++i) {
|
||||
for (j = i+1 ; j < size ; ++j) {
|
||||
/* Initiate all send/recv to/from others. */
|
||||
preq = coll_base_comm_get_reqs(base_module->base_data, 2);
|
||||
preq = reqs;
|
||||
|
||||
if (i == rank && rcounts[j]) {
|
||||
/* Copy the data into the temporary buffer */
|
||||
@ -116,7 +119,7 @@ mca_coll_base_alltoallv_intra_basic_inplace(const void *rbuf, const int *rcounts
|
||||
}
|
||||
|
||||
/* Wait for the requests to complete */
|
||||
err = ompi_request_wait_all (2, base_module->base_data->mcct_reqs, MPI_STATUSES_IGNORE);
|
||||
err = ompi_request_wait_all (2, reqs, MPI_STATUSES_IGNORE);
|
||||
if (MPI_SUCCESS != err) { goto error_hndl; }
|
||||
}
|
||||
}
|
||||
@ -125,7 +128,7 @@ mca_coll_base_alltoallv_intra_basic_inplace(const void *rbuf, const int *rcounts
|
||||
/* Free the temporary buffer */
|
||||
free (tmp_buffer);
|
||||
if( MPI_SUCCESS != err ) {
|
||||
ompi_coll_base_free_reqs(base_module->base_data->mcct_reqs, 2 );
|
||||
ompi_coll_base_free_reqs(reqs, 2 );
|
||||
}
|
||||
|
||||
/* All done */
|
||||
@ -207,7 +210,7 @@ ompi_coll_base_alltoallv_intra_basic_linear(const void *sbuf, const int *scounts
|
||||
int i, size, rank, err, nreqs;
|
||||
char *psnd, *prcv;
|
||||
ptrdiff_t sext, rext;
|
||||
MPI_Request *preq;
|
||||
ompi_request_t **preq, **reqs;
|
||||
mca_coll_base_module_t *base_module = (mca_coll_base_module_t*) module;
|
||||
mca_coll_base_comm_t *data = base_module->base_data;
|
||||
|
||||
@ -243,7 +246,8 @@ ompi_coll_base_alltoallv_intra_basic_linear(const void *sbuf, const int *scounts
|
||||
|
||||
/* Now, initiate all send/recv to/from others. */
|
||||
nreqs = 0;
|
||||
preq = coll_base_comm_get_reqs(data, 2 * size);
|
||||
reqs = preq = coll_base_comm_get_reqs(data, 2 * size);
|
||||
if( NULL == reqs ) { err = OMPI_ERR_OUT_OF_RESOURCE; goto err_hndl; }
|
||||
|
||||
/* Post all receives first */
|
||||
for (i = 0; i < size; ++i) {
|
||||
@ -251,14 +255,12 @@ ompi_coll_base_alltoallv_intra_basic_linear(const void *sbuf, const int *scounts
|
||||
continue;
|
||||
}
|
||||
|
||||
++nreqs;
|
||||
prcv = ((char *) rbuf) + (ptrdiff_t)rdisps[i] * rext;
|
||||
err = MCA_PML_CALL(irecv_init(prcv, rcounts[i], rdtype,
|
||||
i, MCA_COLL_BASE_TAG_ALLTOALLV, comm,
|
||||
preq++));
|
||||
++nreqs;
|
||||
if (MPI_SUCCESS != err) {
|
||||
goto err_hndl;
|
||||
}
|
||||
if (MPI_SUCCESS != err) { goto err_hndl; }
|
||||
}
|
||||
|
||||
/* Now post all sends */
|
||||
@ -267,19 +269,17 @@ ompi_coll_base_alltoallv_intra_basic_linear(const void *sbuf, const int *scounts
|
||||
continue;
|
||||
}
|
||||
|
||||
++nreqs;
|
||||
psnd = ((char *) sbuf) + (ptrdiff_t)sdisps[i] * sext;
|
||||
err = MCA_PML_CALL(isend_init(psnd, scounts[i], sdtype,
|
||||
i, MCA_COLL_BASE_TAG_ALLTOALLV,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm,
|
||||
preq++));
|
||||
++nreqs;
|
||||
if (MPI_SUCCESS != err) {
|
||||
goto err_hndl;
|
||||
}
|
||||
if (MPI_SUCCESS != err) { goto err_hndl; }
|
||||
}
|
||||
|
||||
/* Start your engines. This will never return an error. */
|
||||
MCA_PML_CALL(start(nreqs, data->mcct_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
|
||||
@ -287,11 +287,12 @@ ompi_coll_base_alltoallv_intra_basic_linear(const void *sbuf, const int *scounts
|
||||
* 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, data->mcct_reqs,
|
||||
MPI_STATUSES_IGNORE);
|
||||
err = ompi_request_wait_all(nreqs, reqs, MPI_STATUSES_IGNORE);
|
||||
if( MPI_SUCCESS == err )
|
||||
return MPI_SUCCESS;
|
||||
err_hndl:
|
||||
/* Free the requests in all cases as they are persistent */
|
||||
ompi_coll_base_free_reqs(data->mcct_reqs, nreqs);
|
||||
ompi_coll_base_free_reqs(reqs, nreqs);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -352,13 +352,16 @@ int ompi_coll_base_barrier_intra_basic_linear(struct ompi_communicator_t *comm,
|
||||
|
||||
else {
|
||||
requests = coll_base_comm_get_reqs(module->base_data, size);
|
||||
if( NULL == requests ) { err = OMPI_ERR_OUT_OF_RESOURCE; line = __LINE__; goto err_hndl; }
|
||||
|
||||
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) { line = __LINE__; goto err_hndl; }
|
||||
}
|
||||
ompi_request_wait_all( size-1, requests+1, MPI_STATUSES_IGNORE );
|
||||
err = ompi_request_wait_all( size-1, requests+1, MPI_STATUSES_IGNORE );
|
||||
if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
|
||||
requests = NULL; /* we're done the requests array is clean */
|
||||
|
||||
for (i = 1; i < size; ++i) {
|
||||
@ -376,7 +379,7 @@ int ompi_coll_base_barrier_intra_basic_linear(struct ompi_communicator_t *comm,
|
||||
__FILE__, line, err, rank) );
|
||||
(void)line; // silence compiler warning
|
||||
if( NULL != requests )
|
||||
ompi_coll_base_free_reqs(requests, size-1);
|
||||
ompi_coll_base_free_reqs(requests, size);
|
||||
return err;
|
||||
}
|
||||
/* copied function (with appropriate renaming) ends here */
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -48,9 +48,7 @@ ompi_coll_base_bcast_intra_generic( void* buffer,
|
||||
char *tmpbuf;
|
||||
ptrdiff_t extent, lb;
|
||||
ompi_request_t *recv_reqs[2] = {MPI_REQUEST_NULL, MPI_REQUEST_NULL};
|
||||
#if !defined(COLL_BASE_BCAST_USE_BLOCKING)
|
||||
ompi_request_t **send_reqs = NULL;
|
||||
#endif
|
||||
|
||||
#if OPAL_ENABLE_DEBUG
|
||||
int size;
|
||||
@ -67,11 +65,10 @@ ompi_coll_base_bcast_intra_generic( void* buffer,
|
||||
/* Set the buffer pointers */
|
||||
tmpbuf = (char *) buffer;
|
||||
|
||||
#if !defined(COLL_BASE_BCAST_USE_BLOCKING)
|
||||
if( tree->tree_nextsize != 0 ) {
|
||||
send_reqs = coll_base_comm_get_reqs(module->base_data, tree->tree_nextsize);
|
||||
if( NULL == send_reqs ) { err = OMPI_ERR_OUT_OF_RESOURCE; line = __LINE__; goto error_hndl; }
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Root code */
|
||||
if( rank == root ) {
|
||||
@ -86,27 +83,18 @@ ompi_coll_base_bcast_intra_generic( void* buffer,
|
||||
sendcount = original_count - segindex * count_by_segment;
|
||||
}
|
||||
for( i = 0; i < tree->tree_nextsize; i++ ) {
|
||||
#if defined(COLL_BASE_BCAST_USE_BLOCKING)
|
||||
err = MCA_PML_CALL(send(tmpbuf, sendcount, datatype,
|
||||
tree->tree_next[i],
|
||||
MCA_COLL_BASE_TAG_BCAST,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm));
|
||||
#else
|
||||
err = MCA_PML_CALL(isend(tmpbuf, sendcount, datatype,
|
||||
tree->tree_next[i],
|
||||
MCA_COLL_BASE_TAG_BCAST,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm,
|
||||
&send_reqs[i]));
|
||||
#endif /* COLL_BASE_BCAST_USE_BLOCKING */
|
||||
if (err != MPI_SUCCESS) { line = __LINE__; goto error_hndl; }
|
||||
}
|
||||
|
||||
#if !defined(COLL_BASE_BCAST_USE_BLOCKING)
|
||||
/* complete the sends before starting the next sends */
|
||||
err = ompi_request_wait_all( tree->tree_nextsize, send_reqs,
|
||||
MPI_STATUSES_IGNORE );
|
||||
if (err != MPI_SUCCESS) { line = __LINE__; goto error_hndl; }
|
||||
#endif /* not COLL_BASE_BCAST_USE_BLOCKING */
|
||||
|
||||
/* update tmp buffer */
|
||||
tmpbuf += realsegsize;
|
||||
@ -150,27 +138,18 @@ ompi_coll_base_bcast_intra_generic( void* buffer,
|
||||
if (err != MPI_SUCCESS) { line = __LINE__; goto error_hndl; }
|
||||
|
||||
for( i = 0; i < tree->tree_nextsize; i++ ) {
|
||||
#if defined(COLL_BASE_BCAST_USE_BLOCKING)
|
||||
err = MCA_PML_CALL(send(tmpbuf, count_by_segment, datatype,
|
||||
tree->tree_next[i],
|
||||
MCA_COLL_BASE_TAG_BCAST,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm));
|
||||
#else
|
||||
err = MCA_PML_CALL(isend(tmpbuf, count_by_segment, datatype,
|
||||
tree->tree_next[i],
|
||||
MCA_COLL_BASE_TAG_BCAST,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm,
|
||||
&send_reqs[i]));
|
||||
#endif /* COLL_BASE_BCAST_USE_BLOCKING */
|
||||
if (err != MPI_SUCCESS) { line = __LINE__; goto error_hndl; }
|
||||
}
|
||||
|
||||
#if !defined(COLL_BASE_BCAST_USE_BLOCKING)
|
||||
/* complete the sends before starting the next iteration */
|
||||
err = ompi_request_wait_all( tree->tree_nextsize, send_reqs,
|
||||
MPI_STATUSES_IGNORE );
|
||||
if (err != MPI_SUCCESS) { line = __LINE__; goto error_hndl; }
|
||||
#endif /* COLL_BASE_BCAST_USE_BLOCKING */
|
||||
|
||||
/* Update the receive buffer */
|
||||
tmpbuf += realsegsize;
|
||||
@ -182,26 +161,17 @@ ompi_coll_base_bcast_intra_generic( void* buffer,
|
||||
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++ ) {
|
||||
#if defined(COLL_BASE_BCAST_USE_BLOCKING)
|
||||
err = MCA_PML_CALL(send(tmpbuf, sendcount, datatype,
|
||||
tree->tree_next[i],
|
||||
MCA_COLL_BASE_TAG_BCAST,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm));
|
||||
#else
|
||||
err = MCA_PML_CALL(isend(tmpbuf, sendcount, datatype,
|
||||
tree->tree_next[i],
|
||||
MCA_COLL_BASE_TAG_BCAST,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm,
|
||||
&send_reqs[i]));
|
||||
#endif /* COLL_BASE_BCAST_USE_BLOCKING */
|
||||
if (err != MPI_SUCCESS) { line = __LINE__; goto error_hndl; }
|
||||
}
|
||||
|
||||
#if !defined(COLL_BASE_BCAST_USE_BLOCKING)
|
||||
err = ompi_request_wait_all( tree->tree_nextsize, send_reqs,
|
||||
MPI_STATUSES_IGNORE );
|
||||
if (err != MPI_SUCCESS) { line = __LINE__; goto error_hndl; }
|
||||
#endif /* COLL_BASE_BCAST_USE_BLOCKING */
|
||||
}
|
||||
|
||||
/* Leaf nodes */
|
||||
@ -244,11 +214,9 @@ ompi_coll_base_bcast_intra_generic( void* buffer,
|
||||
OPAL_OUTPUT( (ompi_coll_base_framework.framework_output,"%s:%4d\tError occurred %d, rank %2d",
|
||||
__FILE__, line, err, rank) );
|
||||
(void)line; // silence compiler warnings
|
||||
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);
|
||||
}
|
||||
ompi_coll_base_free_reqs( recv_reqs, 2);
|
||||
if( NULL != send_reqs ) {
|
||||
ompi_coll_base_free_reqs(send_reqs, tree->tree_nextsize);
|
||||
}
|
||||
|
||||
return err;
|
||||
@ -657,6 +625,8 @@ ompi_coll_base_bcast_intra_basic_linear(void *buff, int count,
|
||||
|
||||
/* Root sends data to all others. */
|
||||
preq = reqs = coll_base_comm_get_reqs(module->base_data, size-1);
|
||||
if( NULL == reqs ) { err = OMPI_ERR_OUT_OF_RESOURCE; goto err_hndl; }
|
||||
|
||||
for (i = 0; i < size; ++i) {
|
||||
if (i == rank) {
|
||||
continue;
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -113,15 +113,16 @@ ompi_request_t** coll_base_comm_get_reqs(mca_coll_base_comm_t* data, int nreqs)
|
||||
{
|
||||
if( 0 == nreqs ) return NULL;
|
||||
|
||||
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 ) {
|
||||
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 */
|
||||
if( NULL != data->mcct_reqs ) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -289,9 +289,6 @@ struct mca_coll_basic_module_t {
|
||||
typedef struct mca_coll_basic_module_t mca_coll_basic_module_t;
|
||||
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_coll_basic_module_t);
|
||||
|
||||
typedef mca_coll_base_comm_t mca_coll_basic_comm_t;
|
||||
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_coll_basic_comm_t);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* MCA_COLL_BASIC_EXPORT_H */
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -80,7 +80,7 @@ mca_coll_basic_allgather_inter(const void *sbuf, int scount,
|
||||
|
||||
/* Get a requests arrays of the right size */
|
||||
reqs = coll_base_comm_get_reqs(module->base_data, rsize + 1);
|
||||
if( NULL == reqs ) { line = __LINE__; goto exit; }
|
||||
if( NULL == reqs ) { line = __LINE__; err = OMPI_ERR_OUT_OF_RESOURCE; goto exit; }
|
||||
|
||||
/* Do a send-recv between the two root procs. to avoid deadlock */
|
||||
err = MCA_PML_CALL(isend(sbuf, scount, sdtype, 0,
|
||||
@ -108,7 +108,7 @@ mca_coll_basic_allgather_inter(const void *sbuf, int scount,
|
||||
|
||||
/* Step 2: exchange the resuts between the root processes */
|
||||
tmpbuf = (char *) malloc(scount * size * sextent);
|
||||
if (NULL == tmpbuf) { line = __LINE__; goto exit; }
|
||||
if (NULL == tmpbuf) { line = __LINE__; err = OMPI_ERR_OUT_OF_RESOURCE; goto exit; }
|
||||
|
||||
err = MCA_PML_CALL(isend(rbuf, rsize * rcount, rdtype, 0,
|
||||
MCA_COLL_BASE_TAG_ALLGATHER,
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -78,6 +78,7 @@ mca_coll_basic_alltoall_inter(const void *sbuf, int scount,
|
||||
/* Initiate all send/recv to/from others. */
|
||||
nreqs = size * 2;
|
||||
req = rreq = coll_base_comm_get_reqs( module->base_data, nreqs);
|
||||
if( NULL == req ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
sreq = rreq + size;
|
||||
|
||||
prcv = (char *) rbuf;
|
||||
@ -88,7 +89,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) {
|
||||
ompi_coll_base_free_reqs(req, nreqs);
|
||||
ompi_coll_base_free_reqs(req, i + 1);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
@ -99,7 +100,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) {
|
||||
ompi_coll_base_free_reqs(req, nreqs);
|
||||
ompi_coll_base_free_reqs(req, i + 1);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -69,6 +69,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 = coll_base_comm_get_reqs(module->base_data, nreqs);
|
||||
if( NULL == preq ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* Post all receives first */
|
||||
/* A simple optimization: do not send and recv msgs of length zero */
|
||||
@ -79,7 +80,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) {
|
||||
ompi_coll_base_free_reqs(preq, i);
|
||||
ompi_coll_base_free_reqs(preq, i + 1);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
@ -94,7 +95,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) {
|
||||
ompi_coll_base_free_reqs(preq, rsize + i);
|
||||
ompi_coll_base_free_reqs(preq, rsize + i + 1);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 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,7 @@ mca_coll_basic_alltoallw_intra_inplace(const void *rbuf, const int *rcounts, con
|
||||
mca_coll_base_module_t *module)
|
||||
{
|
||||
int i, j, size, rank, err = MPI_SUCCESS, max_size;
|
||||
MPI_Request *preq, *reqs = NULL;
|
||||
ompi_request_t **preq, **reqs = NULL;
|
||||
char *tmp_buffer, *save_buffer = NULL;
|
||||
ptrdiff_t ext, gap;
|
||||
|
||||
@ -71,6 +71,8 @@ mca_coll_basic_alltoallw_intra_inplace(const void *rbuf, const int *rcounts, con
|
||||
tmp_buffer -= gap;
|
||||
|
||||
reqs = coll_base_comm_get_reqs( module->base_data, 2);
|
||||
if( NULL == reqs ) { err = OMPI_ERR_OUT_OF_RESOURCE; goto error_hndl; }
|
||||
|
||||
/* in-place alltoallw slow algorithm (but works) */
|
||||
for (i = 0 ; i < size ; ++i) {
|
||||
size_t msg_size_i;
|
||||
@ -154,14 +156,9 @@ mca_coll_basic_alltoallw_intra(const void *sbuf, const int *scounts, const int *
|
||||
struct ompi_communicator_t *comm,
|
||||
mca_coll_base_module_t *module)
|
||||
{
|
||||
int i;
|
||||
int size;
|
||||
int rank;
|
||||
int err;
|
||||
char *psnd;
|
||||
char *prcv;
|
||||
int nreqs;
|
||||
MPI_Request *preq, *reqs;
|
||||
int i, size, rank, err, nreqs;
|
||||
char *psnd, *prcv;
|
||||
ompi_request_t **preq, **reqs;
|
||||
|
||||
/* Initialize. */
|
||||
if (MPI_IN_PLACE == sbuf) {
|
||||
@ -193,6 +190,7 @@ mca_coll_basic_alltoallw_intra(const void *sbuf, const int *scounts, const int *
|
||||
|
||||
nreqs = 0;
|
||||
reqs = preq = coll_base_comm_get_reqs(module->base_data, 2 * size);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* Post all receives first -- a simple optimization */
|
||||
|
||||
@ -272,13 +270,9 @@ mca_coll_basic_alltoallw_inter(const void *sbuf, const int *scounts, const int *
|
||||
struct ompi_communicator_t *comm,
|
||||
mca_coll_base_module_t *module)
|
||||
{
|
||||
int i;
|
||||
int size;
|
||||
int err;
|
||||
char *psnd;
|
||||
char *prcv;
|
||||
int nreqs;
|
||||
MPI_Request *preq, *reqs;
|
||||
int i, size, err, nreqs;
|
||||
char *psnd, *prcv;
|
||||
ompi_request_t **preq, **reqs;
|
||||
|
||||
/* Initialize. */
|
||||
size = ompi_comm_remote_size(comm);
|
||||
@ -286,6 +280,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 = coll_base_comm_get_reqs(module->base_data, 2 * size);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* Post all receives first -- a simple optimization */
|
||||
for (i = 0; i < size; ++i) {
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -82,6 +82,7 @@ mca_coll_basic_bcast_log_intra(void *buff, int count,
|
||||
/* Send data to the children. */
|
||||
|
||||
reqs = coll_base_comm_get_reqs(module->base_data, size);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
err = MPI_SUCCESS;
|
||||
preq = reqs;
|
||||
@ -156,6 +157,8 @@ mca_coll_basic_bcast_lin_inter(void *buff, int count,
|
||||
MPI_STATUS_IGNORE));
|
||||
} else {
|
||||
reqs = coll_base_comm_get_reqs(module->base_data, rsize);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* root section */
|
||||
for (i = 0; i < rsize; i++) {
|
||||
err = MCA_PML_CALL(isend(buff, count, datatype, i,
|
||||
@ -163,7 +166,7 @@ mca_coll_basic_bcast_lin_inter(void *buff, int count,
|
||||
MCA_PML_BASE_SEND_STANDARD,
|
||||
comm, &(reqs[i])));
|
||||
if (OMPI_SUCCESS != err) {
|
||||
ompi_coll_base_free_reqs(reqs, rsize);
|
||||
ompi_coll_base_free_reqs(reqs, i + 1);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
* Copyright (c) 2004-2007 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-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -111,5 +111,3 @@ OBJ_CLASS_INSTANCE(mca_coll_basic_module_t,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
OBJ_CLASS_INSTANCE(mca_coll_basic_comm_t, mca_coll_base_comm_t,
|
||||
NULL, NULL);
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -143,13 +143,15 @@ mca_coll_basic_gatherv_inter(const void *sbuf, int scount,
|
||||
}
|
||||
|
||||
reqs = coll_base_comm_get_reqs(module->base_data, size);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
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) {
|
||||
ompi_coll_base_free_reqs(reqs, size);
|
||||
ompi_coll_base_free_reqs(reqs, i + 1);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -144,7 +144,7 @@ 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);
|
||||
module->base_data = OBJ_NEW(mca_coll_base_comm_t);
|
||||
if (NULL == module->base_data) {
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -51,6 +51,8 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount,
|
||||
ompi_datatype_get_extent(rdtype, &lb, &extent);
|
||||
|
||||
reqs = preqs = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims );
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* The ordering is defined as -1 then +1 in each dimension in
|
||||
* order of dimension. */
|
||||
for (dim = 0, nreqs = 0 ; dim < cart->ndims ; ++dim) {
|
||||
@ -63,12 +65,13 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount,
|
||||
}
|
||||
|
||||
if (MPI_PROC_NULL != srank) {
|
||||
nreqs += 2;
|
||||
nreqs++;
|
||||
rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, srank,
|
||||
MCA_COLL_BASE_TAG_ALLGATHER,
|
||||
comm, preqs++));
|
||||
if (OMPI_SUCCESS != rc) break;
|
||||
|
||||
nreqs++;
|
||||
/* 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,
|
||||
@ -81,13 +84,13 @@ mca_coll_basic_neighbor_allgather_cart(const void *sbuf, int scount,
|
||||
rbuf = (char *) rbuf + extent * rcount;
|
||||
|
||||
if (MPI_PROC_NULL != drank) {
|
||||
nreqs += 2;
|
||||
nreqs++;
|
||||
rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, drank,
|
||||
MCA_COLL_BASE_TAG_ALLGATHER,
|
||||
comm, preqs++));
|
||||
if (OMPI_SUCCESS != rc) break;
|
||||
|
||||
|
||||
nreqs++;
|
||||
rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, drank,
|
||||
MCA_COLL_BASE_TAG_ALLGATHER,
|
||||
MCA_PML_BASE_SEND_STANDARD,
|
||||
@ -134,6 +137,7 @@ mca_coll_basic_neighbor_allgather_graph(const void *sbuf, int scount,
|
||||
|
||||
ompi_datatype_get_extent(rdtype, &lb, &extent);
|
||||
reqs = preqs = coll_base_comm_get_reqs( module->base_data, 2 * degree);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
for (neighbor = 0; neighbor < degree ; ++neighbor) {
|
||||
rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, edges[neighbor], MCA_COLL_BASE_TAG_ALLGATHER,
|
||||
@ -183,6 +187,7 @@ mca_coll_basic_neighbor_allgather_dist_graph(const void *sbuf, int scount,
|
||||
|
||||
ompi_datatype_get_extent(rdtype, &lb, &extent);
|
||||
reqs = preqs = coll_base_comm_get_reqs( module->base_data, indegree + outdegree);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
for (neighbor = 0; neighbor < indegree ; ++neighbor) {
|
||||
rc = MCA_PML_CALL(irecv(rbuf, rcount, rdtype, inedges[neighbor],
|
||||
@ -193,7 +198,7 @@ mca_coll_basic_neighbor_allgather_dist_graph(const void *sbuf, int scount,
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs(reqs, neighbor);
|
||||
ompi_coll_base_free_reqs(reqs, neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -208,13 +213,13 @@ mca_coll_basic_neighbor_allgather_dist_graph(const void *sbuf, int scount,
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs(reqs, indegree + neighbor);
|
||||
ompi_coll_base_free_reqs(reqs, indegree + neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = ompi_request_wait_all (indegree + outdegree, reqs, MPI_STATUSES_IGNORE);
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs(reqs, indegree + outdegree);
|
||||
ompi_coll_base_free_reqs(reqs, indegree + outdegree + 1);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -50,6 +50,7 @@ mca_coll_basic_neighbor_allgatherv_cart(const void *sbuf, int scount, struct omp
|
||||
ompi_datatype_get_extent(rdtype, &lb, &extent);
|
||||
|
||||
reqs = preqs = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* The ordering is defined as -1 then +1 in each dimension in
|
||||
* order of dimension. */
|
||||
@ -63,24 +64,26 @@ mca_coll_basic_neighbor_allgatherv_cart(const void *sbuf, int scount, struct omp
|
||||
}
|
||||
|
||||
if (MPI_PROC_NULL != srank) {
|
||||
nreqs += 2;
|
||||
nreqs++;
|
||||
rc = MCA_PML_CALL(irecv((char *) rbuf + disps[i] * extent, rcounts[i], rdtype, srank,
|
||||
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. */
|
||||
nreqs++;
|
||||
rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, srank, MCA_COLL_BASE_TAG_ALLGATHER,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm, preqs++));
|
||||
if (OMPI_SUCCESS != rc) break;
|
||||
}
|
||||
|
||||
if (MPI_PROC_NULL != drank) {
|
||||
nreqs += 2;
|
||||
nreqs++;
|
||||
rc = MCA_PML_CALL(irecv((char *) rbuf + disps[i+1] * extent, rcounts[i+1], rdtype, drank,
|
||||
MCA_COLL_BASE_TAG_ALLGATHER, comm, preqs++));
|
||||
if (OMPI_SUCCESS != rc) break;
|
||||
|
||||
nreqs++;
|
||||
rc = MCA_PML_CALL(isend((void *) sbuf, scount, sdtype, drank, MCA_COLL_BASE_TAG_ALLGATHER,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm, preqs++));
|
||||
if (OMPI_SUCCESS != rc) break;
|
||||
@ -88,13 +91,13 @@ mca_coll_basic_neighbor_allgatherv_cart(const void *sbuf, int scount, struct omp
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_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) {
|
||||
ompi_coll_base_free_reqs( reqs, nreqs );
|
||||
ompi_coll_base_free_reqs(reqs, nreqs);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
@ -121,6 +124,7 @@ mca_coll_basic_neighbor_allgatherv_graph(const void *sbuf, int scount, struct om
|
||||
|
||||
ompi_datatype_get_extent(rdtype, &lb, &extent);
|
||||
reqs = preqs = coll_base_comm_get_reqs( module->base_data, 2 * degree);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
for (neighbor = 0; neighbor < degree ; ++neighbor) {
|
||||
rc = MCA_PML_CALL(irecv((char *) rbuf + disps[neighbor] * extent, rcounts[neighbor],
|
||||
@ -168,6 +172,7 @@ mca_coll_basic_neighbor_allgatherv_dist_graph(const void *sbuf, int scount, stru
|
||||
|
||||
ompi_datatype_get_extent(rdtype, &lb, &extent);
|
||||
reqs = preqs = coll_base_comm_get_reqs( module->base_data, indegree + outdegree);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
for (neighbor = 0; neighbor < indegree ; ++neighbor) {
|
||||
rc = MCA_PML_CALL(irecv((char *) rbuf + disps[neighbor] * extent, rcounts[neighbor], rdtype,
|
||||
@ -176,7 +181,7 @@ mca_coll_basic_neighbor_allgatherv_dist_graph(const void *sbuf, int scount, stru
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs(reqs, neighbor);
|
||||
ompi_coll_base_free_reqs(reqs, neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -190,7 +195,7 @@ mca_coll_basic_neighbor_allgatherv_dist_graph(const void *sbuf, int scount, stru
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs(reqs, indegree + neighbor);
|
||||
ompi_coll_base_free_reqs(reqs, indegree + neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -49,6 +49,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 = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* post receives first */
|
||||
for (dim = 0, nreqs = 0; dim < cart->ndims ; ++dim) {
|
||||
@ -154,6 +155,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 = coll_base_comm_get_reqs( module->base_data, 2 * degree);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* post receives first */
|
||||
for (neighbor = 0; neighbor < degree ; ++neighbor) {
|
||||
@ -163,7 +165,7 @@ mca_coll_basic_neighbor_alltoall_graph(const void *sbuf, int scount, struct ompi
|
||||
rbuf = (char *) rbuf + rdextent * rcount;
|
||||
}
|
||||
if( MPI_SUCCESS != rc ) {
|
||||
ompi_coll_base_free_reqs( reqs, neighbor );
|
||||
ompi_coll_base_free_reqs( reqs, neighbor + 1 );
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -178,7 +180,7 @@ mca_coll_basic_neighbor_alltoall_graph(const void *sbuf, int scount, struct ompi
|
||||
}
|
||||
|
||||
if( MPI_SUCCESS != rc ) {
|
||||
ompi_coll_base_free_reqs( reqs, degree + neighbor );
|
||||
ompi_coll_base_free_reqs( reqs, degree + neighbor + 1 );
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -210,6 +212,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 = coll_base_comm_get_reqs( module->base_data, indegree + outdegree);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* post receives first */
|
||||
for (neighbor = 0; neighbor < indegree ; ++neighbor) {
|
||||
@ -221,7 +224,7 @@ mca_coll_basic_neighbor_alltoall_dist_graph(const void *sbuf, int scount,struct
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs(reqs, neighbor);
|
||||
ompi_coll_base_free_reqs(reqs, neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -235,7 +238,7 @@ mca_coll_basic_neighbor_alltoall_dist_graph(const void *sbuf, int scount,struct
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs(reqs, indegree + neighbor);
|
||||
ompi_coll_base_free_reqs(reqs, indegree + neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -50,6 +50,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 = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims );
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* post receives first */
|
||||
for (dim = 0, nreqs = 0, i = 0; dim < cart->ndims ; ++dim, i += 2) {
|
||||
@ -141,6 +142,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 = coll_base_comm_get_reqs( module->base_data, 2 * degree );
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* post all receives first */
|
||||
for (neighbor = 0; neighbor < degree ; ++neighbor) {
|
||||
@ -150,7 +152,7 @@ mca_coll_basic_neighbor_alltoallv_graph(const void *sbuf, const int scounts[], c
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs( reqs, neighbor );
|
||||
ompi_coll_base_free_reqs( reqs, neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -163,7 +165,7 @@ mca_coll_basic_neighbor_alltoallv_graph(const void *sbuf, const int scounts[], c
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs( reqs, degree + neighbor );
|
||||
ompi_coll_base_free_reqs( reqs, degree + neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -196,6 +198,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 = coll_base_comm_get_reqs( module->base_data, indegree + outdegree);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* post all receives first */
|
||||
for (neighbor = 0; neighbor < indegree ; ++neighbor) {
|
||||
@ -205,7 +208,7 @@ mca_coll_basic_neighbor_alltoallv_dist_graph(const void *sbuf, const int scounts
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs( reqs, neighbor );
|
||||
ompi_coll_base_free_reqs(reqs, neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -218,7 +221,7 @@ mca_coll_basic_neighbor_alltoallv_dist_graph(const void *sbuf, const int scounts
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs( reqs, indegree + neighbor );
|
||||
ompi_coll_base_free_reqs(reqs, indegree + neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -47,6 +47,7 @@ mca_coll_basic_neighbor_alltoallw_cart(const void *sbuf, const int scounts[], co
|
||||
ompi_request_t **reqs, **preqs;
|
||||
|
||||
reqs = preqs = coll_base_comm_get_reqs( module->base_data, 4 * cart->ndims );
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* post receives first */
|
||||
for (dim = 0, i = 0, nreqs = 0; dim < cart->ndims ; ++dim, i += 2) {
|
||||
@ -129,6 +130,7 @@ mca_coll_basic_neighbor_alltoallw_graph(const void *sbuf, const int scounts[], c
|
||||
|
||||
mca_topo_base_graph_neighbors_count (comm, rank, °ree);
|
||||
reqs = preqs = coll_base_comm_get_reqs( module->base_data, 2 * degree );
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
edges = graph->edges;
|
||||
if (rank > 0) {
|
||||
@ -143,7 +145,7 @@ mca_coll_basic_neighbor_alltoallw_graph(const void *sbuf, const int scounts[], c
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs( reqs, neighbor );
|
||||
ompi_coll_base_free_reqs(reqs, neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -156,13 +158,13 @@ mca_coll_basic_neighbor_alltoallw_graph(const void *sbuf, const int scounts[], c
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs( reqs, neighbor + degree );
|
||||
ompi_coll_base_free_reqs(reqs, neighbor + degree + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = ompi_request_wait_all (degree * 2, reqs, MPI_STATUSES_IGNORE);
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs( reqs, degree * 2 );
|
||||
ompi_coll_base_free_reqs(reqs, degree * 2);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
@ -186,6 +188,8 @@ mca_coll_basic_neighbor_alltoallw_dist_graph(const void *sbuf, const int scounts
|
||||
outedges = dist_graph->out;
|
||||
|
||||
reqs = preqs = coll_base_comm_get_reqs( module->base_data, indegree + outdegree );
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
/* 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 +198,7 @@ mca_coll_basic_neighbor_alltoallw_dist_graph(const void *sbuf, const int scounts
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs( reqs, neighbor );
|
||||
ompi_coll_base_free_reqs(reqs, neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -207,7 +211,7 @@ mca_coll_basic_neighbor_alltoallw_dist_graph(const void *sbuf, const int scounts
|
||||
}
|
||||
|
||||
if (OMPI_SUCCESS != rc) {
|
||||
ompi_coll_base_free_reqs( reqs, indegree + neighbor );
|
||||
ompi_coll_base_free_reqs(reqs, indegree + neighbor + 1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -69,6 +69,7 @@ mca_coll_basic_scatter_inter(const void *sbuf, int scount,
|
||||
}
|
||||
|
||||
reqs = coll_base_comm_get_reqs(module->base_data, size);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
incr *= scount;
|
||||
for (i = 0, ptmp = (char *) sbuf; i < size; ++i, ptmp += incr) {
|
||||
@ -77,7 +78,7 @@ mca_coll_basic_scatter_inter(const void *sbuf, int scount,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm,
|
||||
reqs++));
|
||||
if (OMPI_SUCCESS != err) {
|
||||
ompi_coll_base_free_reqs(reqs, i);
|
||||
ompi_coll_base_free_reqs(reqs, i + 1);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
@ -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-2015 The University of Tennessee and The University
|
||||
* Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
@ -145,6 +145,8 @@ mca_coll_basic_scatterv_inter(const void *sbuf, const int *scounts,
|
||||
}
|
||||
|
||||
reqs = coll_base_comm_get_reqs(module->base_data, size);
|
||||
if( NULL == reqs ) { return OMPI_ERR_OUT_OF_RESOURCE; }
|
||||
|
||||
for (i = 0; i < size; ++i) {
|
||||
ptmp = ((char *) sbuf) + (extent * disps[i]);
|
||||
err = MCA_PML_CALL(isend(ptmp, scounts[i], sdtype, i,
|
||||
@ -152,7 +154,7 @@ mca_coll_basic_scatterv_inter(const void *sbuf, const int *scounts,
|
||||
MCA_PML_BASE_SEND_STANDARD, comm,
|
||||
&(reqs[i])));
|
||||
if (OMPI_SUCCESS != err) {
|
||||
ompi_coll_base_free_reqs(reqs, i);
|
||||
ompi_coll_base_free_reqs(reqs, i + 1);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user