-/* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2007-2020. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "smpi_op.hpp"
#include "src/smpi/include/smpi_actor.hpp"
+#include <vector>
+
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi);
-#define CHECK_ARGS(test, errcode, ...) \
- if (test) { \
- XBT_WARN(__VA_ARGS__); \
- return (errcode); \
- }
-
-#define CHECK_COMM(num)\
- CHECK_ARGS(comm == MPI_COMM_NULL, MPI_ERR_COMM,\
- "%s: param %d communicator cannot be MPI_COMM_NULL", __func__, num);
-#define CHECK_REQUEST(num)\
- CHECK_ARGS(request == nullptr, MPI_ERR_ARG,\
- "%s: param %d request cannot be NULL",__func__, num);
-#define CHECK_BUFFER(num,buf,count)\
- CHECK_ARGS(buf == nullptr && count > 0, MPI_ERR_BUFFER,\
- "%s: param %d %s cannot be NULL if %s > 0",__func__, num, #buf, #count);
-#define CHECK_COUNT(num,count)\
- CHECK_ARGS(count < 0, MPI_ERR_COUNT,\
- "%s: param %d %s cannot be negative", __func__, num, #count);
-#define CHECK_TYPE(num, datatype)\
- CHECK_ARGS((datatype == MPI_DATATYPE_NULL|| not datatype->is_valid()), MPI_ERR_TYPE,\
- "%s: param %d %s cannot be MPI_DATATYPE_NULL or invalid", __func__, num, #datatype);
-#define CHECK_OP(num)\
- CHECK_ARGS(op == MPI_OP_NULL, MPI_ERR_OP,\
- "%s: param %d op cannot be MPI_OP_NULL or invalid", __func__, num);
-#define CHECK_ROOT(num)\
- CHECK_ARGS((root < 0 || root >= comm->size()), MPI_ERR_ROOT,\
- "%s: param %d root (=%d) cannot be negative or larger than communicator size (=%d)", __func__, num, root,\
- comm->size());
-#define CHECK_NULL(num,err,buf)\
- CHECK_ARGS(buf == nullptr, err,\
- "%s: param %d %s cannot be NULL", __func__, num, #buf);
-
- 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.reset(new 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;
}
int rank = simgrid::s4u::this_actor::get_pid();
int dt_size_recv = recvtype->is_replayable() ? 1 : recvtype->size();
- std::vector<int>* trace_recvcounts = new std::vector<int>;
+ auto* trace_recvcounts = new std::vector<int>();
if (comm->rank() == root) {
for (int i = 0; i < comm->size(); i++) // copy data to avoid bad free
trace_recvcounts->push_back(recvcounts[i] * dt_size_recv);
int rank = simgrid::s4u::this_actor::get_pid();
int dt_size_recv = recvtype->is_replayable() ? 1 : recvtype->size();
- std::vector<int>* trace_recvcounts = new std::vector<int>;
+ auto* trace_recvcounts = new std::vector<int>();
for (int i = 0; i < comm->size(); i++) { // copy data to avoid bad free
trace_recvcounts->push_back(recvcounts[i] * dt_size_recv);
}
int rank = simgrid::s4u::this_actor::get_pid();
int dt_size_send = sendtype->is_replayable() ? 1 : sendtype->size();
- std::vector<int>* trace_sendcounts = new std::vector<int>;
+ auto* trace_sendcounts = new std::vector<int>();
if (comm->rank() == root) {
for (int i = 0; i < comm->size(); i++) { // copy data to avoid bad free
trace_sendcounts->push_back(sendcounts[i] * dt_size_send);
int PMPI_Iallreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Request *request)
{
-
CHECK_COMM(6)
CHECK_BUFFER(1, sendbuf, count)
CHECK_BUFFER(2, recvbuf, count)
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",
smpi_bench_end();
int rank = simgrid::s4u::this_actor::get_pid();
- std::vector<int>* trace_recvcounts = new std::vector<int>;
+ auto* trace_recvcounts = new std::vector<int>();
int dt_send_size = datatype->is_replayable() ? 1 : datatype->size();
int totalcount = 0;
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();
- std::vector<int>* trace_recvcounts = new std::vector<int>(recvcount * dt_send_size); // copy data to avoid bad free
- std::unique_ptr<unsigned char[]> tmp_sendbuf;
+ auto* trace_recvcounts = new std::vector<int>(recvcount * dt_send_size); // copy data to avoid bad free
+ 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(
new simgrid::instr::VarCollTIData(request == MPI_REQUEST_IGNORED ? "reducescatter" : "ireducescatter", -1, 0,
nullptr, -1, trace_recvcounts, simgrid::smpi::Datatype::encode(datatype), ""));
- int* recvcounts = new int[count];
+ auto* recvcounts = new int[count];
for (int i = 0; i < count; i++)
recvcounts[i] = recvcount;
if (request == MPI_REQUEST_IGNORED)
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) {
smpi_bench_end();
int send_size = 0;
int recv_size = 0;
- std::vector<int>* trace_sendcounts = new std::vector<int>;
- std::vector<int>* trace_recvcounts = new std::vector<int>;
+ auto* trace_sendcounts = new std::vector<int>();
+ auto* trace_recvcounts = new std::vector<int>();
int dt_size_recv = recvtype->size();
const int* real_sendcounts = sendcounts;
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.reset(new int[size]);
- std::copy(recvcounts, recvcounts + size, tmp_sendcounts.get());
- real_sendcounts = tmp_sendcounts.get();
- tmp_senddispls.reset(new 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;
}
int send_size = 0;
int recv_size = 0;
- std::vector<int>* trace_sendcounts = new std::vector<int>;
- std::vector<int>* trace_recvcounts = new std::vector<int>;
+ auto* trace_sendcounts = new std::vector<int>();
+ auto* trace_recvcounts = new std::vector<int>();
const int* real_sendcounts = sendcounts;
const int* real_senddispls = senddispls;
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.reset(new int[size]);
- std::copy(recvcounts, recvcounts + size, tmp_sendcounts.get());
- real_sendcounts = tmp_sendcounts.get();
- tmp_senddispls.reset(new int[size]);
- std::copy(recvdispls, recvdispls + size, tmp_senddispls.get());
- real_senddispls = tmp_senddispls.get();
- tmp_sendtypes.reset(new 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