#include "smpi_op.hpp"
#include "src/smpi/include/smpi_actor.hpp"
-#include <memory>
+#include <vector>
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi);
- static const void* smpi_get_in_place_buf(const void* inplacebuf, const void* otherbuf,std::unique_ptr<unsigned char[]>& tmp_sendbuf, int count, MPI_Datatype datatype){
+static const void* smpi_get_in_place_buf(const void* inplacebuf, const void* otherbuf,
+ std::vector<unsigned char>& tmp_sendbuf, int count, MPI_Datatype datatype)
+{
if (inplacebuf == MPI_IN_PLACE) {
- tmp_sendbuf = std::make_unique<unsigned char[]>(count * datatype->get_extent());
- simgrid::smpi::Datatype::copy(otherbuf, count, datatype, tmp_sendbuf.get(), count, datatype);
- return tmp_sendbuf.get();
+ tmp_sendbuf.resize(count * datatype->get_extent());
+ simgrid::smpi::Datatype::copy(otherbuf, count, datatype, tmp_sendbuf.data(), count, datatype);
+ return tmp_sendbuf.data();
}else{
return inplacebuf;
}
CHECK_OP(5)
smpi_bench_end();
- std::unique_ptr<unsigned char[]> tmp_sendbuf;
+ std::vector<unsigned char> tmp_sendbuf;
const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, count, datatype);
int rank = simgrid::s4u::this_actor::get_pid();
smpi_bench_end();
int rank = simgrid::s4u::this_actor::get_pid();
- std::unique_ptr<unsigned char[]> tmp_sendbuf;
+ std::vector<unsigned char> tmp_sendbuf;
const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, count, datatype);
TRACE_smpi_comm_in(rank, request == MPI_REQUEST_IGNORED ? "PMPI_Scan" : "PMPI_Iscan",
smpi_bench_end();
int rank = simgrid::s4u::this_actor::get_pid();
- std::unique_ptr<unsigned char[]> tmp_sendbuf;
+ std::vector<unsigned char> tmp_sendbuf;
const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, count, datatype);
TRACE_smpi_comm_in(rank, request == MPI_REQUEST_IGNORED ? "PMPI_Exscan" : "PMPI_Iexscan",
trace_recvcounts->push_back(recvcounts[i] * dt_send_size);
totalcount += recvcounts[i];
}
- std::unique_ptr<unsigned char[]> tmp_sendbuf;
+ std::vector<unsigned char> tmp_sendbuf;
const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, totalcount, datatype);
TRACE_smpi_comm_in(rank, request == MPI_REQUEST_IGNORED ? "PMPI_Reduce_scatter" : "PMPI_Ireduce_scatter",
int rank = simgrid::s4u::this_actor::get_pid();
int dt_send_size = datatype->is_replayable() ? 1 : datatype->size();
auto* trace_recvcounts = new std::vector<int>(recvcount * dt_send_size); // copy data to avoid bad free
- std::unique_ptr<unsigned char[]> tmp_sendbuf;
+ std::vector<unsigned char> tmp_sendbuf;
const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, recvcount * count, datatype);
TRACE_smpi_comm_in(
int rank = simgrid::s4u::this_actor::get_pid();
int real_sendcount = sendcount;
MPI_Datatype real_sendtype = sendtype;
-
- std::unique_ptr<unsigned char[]> tmp_sendbuf;
+
+ std::vector<unsigned char> tmp_sendbuf;
const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, recvcount * comm->size(), recvtype);
if (sendbuf == MPI_IN_PLACE) {
maxsize = (recvdispls[i] + recvcounts[i]) * dt_size_recv;
}
- std::unique_ptr<unsigned char[]> tmp_sendbuf;
- std::unique_ptr<int[]> tmp_sendcounts;
- std::unique_ptr<int[]> tmp_senddispls;
+ std::vector<unsigned char> tmp_sendbuf;
+ std::vector<int> tmp_sendcounts;
+ std::vector<int> 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 = std::make_unique<int[]>(size);
- std::copy(recvcounts, recvcounts + size, tmp_sendcounts.get());
- real_sendcounts = tmp_sendcounts.get();
- tmp_senddispls = std::make_unique<int[]>(size);
- std::copy(recvdispls, recvdispls + size, tmp_senddispls.get());
- real_senddispls = tmp_senddispls.get();
+ tmp_sendcounts.assign(recvcounts, recvcounts + size);
+ real_sendcounts = tmp_sendcounts.data();
+ tmp_senddispls.assign(recvdispls, recvdispls + size);
+ real_senddispls = tmp_senddispls.data();
real_sendtype = recvtype;
}
maxsize = recvdispls[i] + (recvcounts[i] * recvtypes[i]->size());
}
- std::unique_ptr<unsigned char[]> tmp_sendbuf;
- std::unique_ptr<int[]> tmp_sendcounts;
- std::unique_ptr<int[]> tmp_senddispls;
- std::unique_ptr<MPI_Datatype[]> tmp_sendtypes;
+ std::vector<unsigned char> tmp_sendbuf;
+ std::vector<int> tmp_sendcounts;
+ std::vector<int> tmp_senddispls;
+ std::vector<MPI_Datatype> tmp_sendtypes;
const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, maxsize, MPI_CHAR);
if (sendbuf == MPI_IN_PLACE) {
- tmp_sendcounts = std::make_unique<int[]>(size);
- std::copy(recvcounts, recvcounts + size, tmp_sendcounts.get());
- real_sendcounts = tmp_sendcounts.get();
- tmp_senddispls = std::make_unique<int[]>(size);
- std::copy(recvdispls, recvdispls + size, tmp_senddispls.get());
- real_senddispls = tmp_senddispls.get();
- tmp_sendtypes = std::make_unique<MPI_Datatype[]>(size);
- std::copy(recvtypes, recvtypes + size, tmp_sendtypes.get());
- real_sendtypes = tmp_sendtypes.get();
+ tmp_sendcounts.assign(recvcounts, recvcounts + size);
+ real_sendcounts = tmp_sendcounts.data();
+ tmp_senddispls.assign(recvdispls, recvdispls + size);
+ real_senddispls = tmp_senddispls.data();
+ tmp_sendtypes.assign(recvtypes, recvtypes + size);
+ real_sendtypes = tmp_sendtypes.data();
}
for (int i = 0; i < size; i++) { // copy data to avoid bad free