From 53347e54c57078b4f4b00864b9c84e531e8adc39 Mon Sep 17 00:00:00 2001 From: Augustin Degomme Date: Sat, 7 Aug 2021 14:00:31 +0200 Subject: [PATCH] ensure alltoallv tracing/replay/tracing again is coherent. --- src/smpi/bindings/smpi_pmpi_coll.cpp | 17 ++++++++--------- src/smpi/internals/smpi_replay.cpp | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/smpi/bindings/smpi_pmpi_coll.cpp b/src/smpi/bindings/smpi_pmpi_coll.cpp index f72959b1a8..2ae8177fc2 100644 --- a/src/smpi/bindings/smpi_pmpi_coll.cpp +++ b/src/smpi/bindings/smpi_pmpi_coll.cpp @@ -798,16 +798,11 @@ int PMPI_Ialltoallv(const void* sendbuf, const int* sendcounts, const int* sendd const int* real_senddispls = senddispls; MPI_Datatype real_sendtype = sendtype; int maxsize = 0; - for (int i = 0; i < size; i++) { // copy data to avoid bad free - recv_size += recvcounts[i] * dt_size_recv; - if (((recvdispls[i] + recvcounts[i]) * dt_size_recv) > maxsize) - maxsize = (recvdispls[i] + recvcounts[i]) * dt_size_recv; - } - std::vector tmp_sendbuf; std::vector tmp_sendcounts; std::vector tmp_senddispls; const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, maxsize, MPI_CHAR); + if (sendbuf == MPI_IN_PLACE) { tmp_sendcounts.assign(recvcounts, recvcounts + size); real_sendcounts = tmp_sendcounts.data(); @@ -816,15 +811,19 @@ int PMPI_Ialltoallv(const void* sendbuf, const int* sendcounts, const int* sendd real_sendtype = recvtype; } + for (int i = 0; i < size; i++) { // copy data to avoid bad free + send_size += real_sendcounts[i] ; + recv_size += recvcounts[i]; + if (((recvdispls[i] + recvcounts[i]) * dt_size_recv) > maxsize) + maxsize = (recvdispls[i] + recvcounts[i]) * dt_size_recv; + } + if(recvtype->size() * recvcounts[comm->rank()] != real_sendtype->size() * real_sendcounts[comm->rank()]){ XBT_WARN("MPI_(I)Alltoallv : receive size from me differs from sent size to me : %zu vs %zu", recvtype->size() * recvcounts[comm->rank()], real_sendtype->size() * real_sendcounts[comm->rank()]); return MPI_ERR_TRUNCATE; } trace_sendcounts->insert(trace_sendcounts->end(), &real_sendcounts[0], &real_sendcounts[size]); - for (int i = 0; i < size; i++) { - send_size += real_sendcounts[i] * real_sendtype->size(); - } TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Alltoallv" : "PMPI_Ialltoallv", new simgrid::instr::VarCollTIData(request == MPI_REQUEST_IGNORED ? "alltoallv" : "ialltoallv", -1, diff --git a/src/smpi/internals/smpi_replay.cpp b/src/smpi/internals/smpi_replay.cpp index 346fab76db..4b8b3b1353 100644 --- a/src/smpi/internals/smpi_replay.cpp +++ b/src/smpi/internals/smpi_replay.cpp @@ -742,7 +742,7 @@ void AllToAllVAction::kernel(simgrid::xbt::ReplayAction&) const AllToAllVArgParser& args = get_args(); TRACE_smpi_comm_in(get_pid(), __func__, new simgrid::instr::VarCollTIData( - "alltoallv", 0, args.send_size_sum, args.sendcounts, args.recv_size_sum, args.recvcounts, + "alltoallv", -1, args.send_size_sum, args.sendcounts, args.recv_size_sum, args.recvcounts, Datatype::encode(args.datatype1), Datatype::encode(args.datatype2))); colls::alltoallv(send_buffer(args.send_buf_size * args.datatype1->size()), args.sendcounts->data(), -- 2.20.1