-/* Copyright (c) 2013-2021. The SimGrid Team.
+/* Copyright (c) 2013-2022. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
if (sendbuf != MPI_IN_PLACE)
Request::sendrecv(((char *)sendbuf+disps[dst]*extent),
recvcounts[dst], datatype, dst,
- COLL_TAG_SCATTER, tmp_recvbuf,
+ COLL_TAG_REDUCE_SCATTER, tmp_recvbuf,
recvcounts[rank], datatype, src,
- COLL_TAG_SCATTER, comm,
+ COLL_TAG_REDUCE_SCATTER, comm,
MPI_STATUS_IGNORE);
else
Request::sendrecv(((char *)recvbuf+disps[dst]*extent),
recvcounts[dst], datatype, dst,
- COLL_TAG_SCATTER, tmp_recvbuf,
+ COLL_TAG_REDUCE_SCATTER, tmp_recvbuf,
recvcounts[rank], datatype, src,
- COLL_TAG_SCATTER, comm,
+ COLL_TAG_REDUCE_SCATTER, comm,
MPI_STATUS_IGNORE);
if (is_commutative || (src < rank)) {
/* copy result back into recvbuf */
mpi_errno =
Datatype::copy(tmp_recvbuf, recvcounts[rank], datatype, recvbuf, recvcounts[rank], datatype);
- if (mpi_errno)
+ if (mpi_errno) {
+ delete[] disps;
+ smpi_free_tmp_buffer(tmp_recvbuf);
return (mpi_errno);
+ }
}
else {
if (op != MPI_OP_NULL)
/* copy result back into recvbuf */
mpi_errno = Datatype::copy(tmp_recvbuf, recvcounts[rank], datatype,
((char*)recvbuf + disps[rank] * extent), recvcounts[rank], datatype);
- if (mpi_errno)
+ if (mpi_errno) {
+ delete[] disps;
+ smpi_free_tmp_buffer(tmp_recvbuf);
return (mpi_errno);
+ }
}
}
}
recvcounts[rank], datatype,
recvbuf,
recvcounts[rank], datatype );
- if (mpi_errno) return(mpi_errno);
+ if (mpi_errno) {
+ delete[] disps;
+ smpi_free_tmp_buffer(tmp_recvbuf);
+ return (mpi_errno);
+ }
}
delete[] disps;
}
Request::sendrecv(outgoing_data + send_offset*true_extent,
- size, datatype, peer, COLL_TAG_SCATTER,
+ size, datatype, peer, COLL_TAG_REDUCE_SCATTER,
incoming_data + recv_offset*true_extent,
- size, datatype, peer, COLL_TAG_SCATTER,
+ size, datatype, peer, COLL_TAG_REDUCE_SCATTER,
comm, MPI_STATUS_IGNORE);
/* always perform the reduction at recv_offset, the data at send_offset
is now our peer's responsibility */
else
mpi_errno = Datatype::copy(recvbuf, total_count, datatype, tmp_results, total_count, datatype);
- if (mpi_errno)
+ if (mpi_errno) {
+ delete[] disps;
return (mpi_errno);
+ }
mask = 0x1;
i = 0;
received in tmp_recvbuf and then accumulated into
tmp_results. accumulation is done later below. */
- Request::sendrecv(tmp_results, 1, sendtype, dst, COLL_TAG_SCATTER, tmp_recvbuf, 1, recvtype, dst,
- COLL_TAG_SCATTER, comm, MPI_STATUS_IGNORE);
+ Request::sendrecv(tmp_results, 1, sendtype, dst, COLL_TAG_REDUCE_SCATTER, tmp_recvbuf, 1, recvtype, dst,
+ COLL_TAG_REDUCE_SCATTER, comm, MPI_STATUS_IGNORE);
received = 1;
}
can send if they have the data */
if ((dst > rank) && (rank < tree_root + nprocs_completed) && (dst >= tree_root + nprocs_completed)) {
/* send the current result */
- Request::send(tmp_recvbuf, 1, recvtype, dst, COLL_TAG_SCATTER, comm);
+ Request::send(tmp_recvbuf, 1, recvtype, dst, COLL_TAG_REDUCE_SCATTER, comm);
}
/* recv only if this proc. doesn't have data and sender
has data */
else if ((dst < rank) && (dst < tree_root + nprocs_completed) && (rank >= tree_root + nprocs_completed)) {
- Request::recv(tmp_recvbuf, 1, recvtype, dst, COLL_TAG_SCATTER, comm, MPI_STATUS_IGNORE);
+ Request::recv(tmp_recvbuf, 1, recvtype, dst, COLL_TAG_REDUCE_SCATTER, comm, MPI_STATUS_IGNORE);
received = 1;
}
tmp_mask >>= 1;