int comm_size, i;
size_t total_message_size;
+ if(sbuf==rbuf)sbuf=MPI_IN_PLACE; //restore MPI_IN_PLACE as these algos handle it
+
XBT_DEBUG("smpi_coll_tuned_reduce_scatter_mpich");
comm_size = smpi_comm_size(comm);
int root, MPI_Comm comm
)
{
+ if(smpi_comm_rank(comm)!=root){
+ sbuf=xbt_malloc(rcount*smpi_datatype_get_extent(rdtype));
+ scount=rcount;
+ sdtype=rdtype;
+ }
return smpi_coll_tuned_scatter_ompi_binomial (sbuf, scount, sdtype,
rbuf, rcount, rdtype,
root, comm);
if ((communicator_size > small_comm_size) &&
(block_size < small_block_size)) {
+ if(rank!=root){
+ sbuf=xbt_malloc(rcount*smpi_datatype_get_extent(rdtype));
+ scount=rcount;
+ sdtype=rdtype;
+ }
return smpi_coll_tuned_scatter_ompi_binomial (sbuf, scount, sdtype,
rbuf, rcount, rdtype,
root, comm);
void smpi_mpi_request_free(MPI_Request * request)
{
-
if((*request) != MPI_REQUEST_NULL){
(*request)->refcount--;
if((*request)->refcount<0) xbt_die("wrong refcount");
// FIXME: check for errors
smpi_datatype_extent(sendtype, &lb, &sendext);
// Local copy from root
- smpi_datatype_copy((char *)sendbuf + root * sendcount * sendext,
- sendcount, sendtype, recvbuf, recvcount, recvtype);
+ if(recvbuf!=MPI_IN_PLACE){
+ smpi_datatype_copy((char *)sendbuf + root * sendcount * sendext,
+ sendcount, sendtype, recvbuf, recvcount, recvtype);
+ }
// Send buffers to receivers
requests = xbt_new(MPI_Request, size - 1);
index = 0;
// FIXME: check for errors
smpi_datatype_extent(sendtype, &lb, &sendext);
// Local copy from root
- smpi_datatype_copy((char *)sendbuf + displs[root] * sendext, sendcounts[root],
+ if(recvbuf!=MPI_IN_PLACE){
+ smpi_datatype_copy((char *)sendbuf + displs[root] * sendext, sendcounts[root],
sendtype, recvbuf, recvcount, recvtype);
+ }
// Send buffers to receivers
requests = xbt_new(MPI_Request, size - 1);
index = 0;
MPI_Request *requests;
void **tmpbufs;
+
char* sendtmpbuf = (char*) sendbuf;
if( sendbuf == MPI_IN_PLACE ) {
- sendtmpbuf = (char *)recvbuf;
+ sendtmpbuf = (char *)xbt_malloc(count*smpi_datatype_get_extent(datatype));
+ smpi_datatype_copy(recvbuf, count, datatype,sendtmpbuf, count, datatype);
}
rank = smpi_comm_rank(comm);
}
xbt_free(tmpbufs);
xbt_free(requests);
+
+ if( sendbuf == MPI_IN_PLACE ) {
+ xbt_free(sendtmpbuf);
+ }
}
}
|| ((recvbuf !=MPI_IN_PLACE) && (recvtype == MPI_DATATYPE_NULL))) {
retval = MPI_ERR_TYPE;
} else {
-
- if(recvbuf==MPI_IN_PLACE){
- recvcount=0;
+ if (recvbuf == MPI_IN_PLACE) {
+ recvtype=sendtype;
+ recvcount=sendcount;
}
mpi_coll_scatter_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount,
recvtype, root, comm);
|| ((recvbuf !=MPI_IN_PLACE) && (recvtype == MPI_DATATYPE_NULL))) {
retval = MPI_ERR_TYPE;
} else {
-
- if(recvbuf==MPI_IN_PLACE){
- recvcount=0;
+ if (recvbuf == MPI_IN_PLACE) {
+ recvtype=sendtype;
+ recvcount=sendcounts[smpi_comm_rank(comm)];
}
-
smpi_mpi_scatterv(sendbuf, sendcounts, displs, sendtype, recvbuf,
recvcount, recvtype, root, comm);
retval = MPI_SUCCESS;
retval = MPI_ERR_ARG;
} else {
- char* sendtmpbuf = (char*) sendbuf;
- if( sendbuf == MPI_IN_PLACE ) {
- sendtmpbuf = (char *)xbt_malloc(count*smpi_datatype_get_extent(datatype));
- smpi_datatype_copy(recvbuf, count, datatype,sendtmpbuf, count, datatype);
- }
-
- mpi_coll_reduce_fun(sendtmpbuf, recvbuf, count, datatype, op, root, comm);
-
- if( sendbuf == MPI_IN_PLACE ) {
- xbt_free(sendtmpbuf);
- }
+ mpi_coll_reduce_fun(sendbuf, recvbuf, count, datatype, op, root, comm);
retval = MPI_SUCCESS;
}