-/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2007-2019. 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 "private.h"
-#include "smpi_comm.hpp"
+#include "private.hpp"
#include "smpi_coll.hpp"
+#include "smpi_comm.hpp"
+#include "smpi_request.hpp"
#include "smpi_datatype_derived.hpp"
#include "smpi_op.hpp"
-#include "smpi_process.hpp"
+#include "src/smpi/include/smpi_actor.hpp"
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi);
-
/* PMPI User level calls */
-extern "C" { // Obviously, the C MPI interface should use the C linkage
int PMPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
{
- int retval = 0;
+ return PMPI_Ibcast(buf, count, datatype, root, comm, MPI_REQUEST_IGNORED);
+}
- smpi_bench_end();
+int PMPI_Barrier(MPI_Comm comm)
+{
+ return PMPI_Ibarrier(comm, MPI_REQUEST_IGNORED);
+}
+int PMPI_Ibarrier(MPI_Comm comm, MPI_Request *request)
+{
+ int retval = 0;
+ smpi_bench_end();
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
- } else if (not datatype->is_valid()) {
+ } else if(request == nullptr){
retval = MPI_ERR_ARG;
- } else {
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- int root_traced = comm->group()->index(root);
-
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_BCAST;
- extra->root = root_traced;
- int known = 0;
- extra->datatype1 = encode_datatype(datatype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = datatype->size();
- extra->send_size = count * dt_size_send;
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
- if (comm->size() > 1)
- simgrid::smpi::Colls::bcast(buf, count, datatype, root, comm);
- retval = MPI_SUCCESS;
-
- TRACE_smpi_collective_out(rank, __FUNCTION__);
- }
+ }else{
+ int rank = simgrid::s4u::this_actor::get_pid();
+ TRACE_smpi_comm_in(rank, request==MPI_REQUEST_IGNORED? "PMPI_Barrier" : "PMPI_Ibarrier", new simgrid::instr::NoOpTIData(request==MPI_REQUEST_IGNORED? "barrier" : "ibarrier"));
+ if(request==MPI_REQUEST_IGNORED){
+ simgrid::smpi::Colls::barrier(comm);
+ //Barrier can be used to synchronize RMA calls. Finish all requests from comm before.
+ comm->finish_rma_calls();
+ } else
+ simgrid::smpi::Colls::ibarrier(comm, request);
+ TRACE_smpi_comm_out(rank);
+ }
smpi_bench_begin();
return retval;
}
-int PMPI_Barrier(MPI_Comm comm)
+int PMPI_Ibcast(void *buf, int count, MPI_Datatype datatype,
+ int root, MPI_Comm comm, MPI_Request* request)
{
int retval = 0;
-
smpi_bench_end();
-
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
+ } else if (not datatype->is_valid()) {
+ retval = MPI_ERR_ARG;
+ } else if(request == nullptr){
+ retval = MPI_ERR_ARG;
} else {
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_BARRIER;
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
-
- simgrid::smpi::Colls::barrier(comm);
-
- //Barrier can be used to synchronize RMA calls. Finish all requests from comm before.
- comm->finish_rma_calls();
-
+ int rank = simgrid::s4u::this_actor::get_pid();
+ TRACE_smpi_comm_in(rank, request==MPI_REQUEST_IGNORED?"PMPI_Bcast":"PMPI_Ibcast",
+ new simgrid::instr::CollTIData(request==MPI_REQUEST_IGNORED?"bcast":"ibcast", root, -1.0,
+ datatype->is_replayable() ? count : count * datatype->size(), -1,
+ simgrid::smpi::Datatype::encode(datatype), ""));
+ if (comm->size() > 1){
+ if(request==MPI_REQUEST_IGNORED)
+ simgrid::smpi::Colls::bcast(buf, count, datatype, root, comm);
+ else
+ simgrid::smpi::Colls::ibcast(buf, count, datatype, root, comm, request);
+ } else {
+ if(request!=MPI_REQUEST_IGNORED)
+ *request = MPI_REQUEST_NULL;
+ }
retval = MPI_SUCCESS;
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
}
-
smpi_bench_begin();
return retval;
}
int PMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,void *recvbuf, int recvcount, MPI_Datatype recvtype,
- int root, MPI_Comm comm)
+ int root, MPI_Comm comm){
+ return PMPI_Igather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, MPI_REQUEST_IGNORED);
+}
+
+int PMPI_Igather(void *sendbuf, int sendcount, MPI_Datatype sendtype,void *recvbuf, int recvcount, MPI_Datatype recvtype,
+ int root, MPI_Comm comm, MPI_Request *request)
{
int retval = 0;
retval = MPI_ERR_TYPE;
} else if ((( sendbuf != MPI_IN_PLACE) && (sendcount <0)) || ((comm->rank() == root) && (recvcount <0))){
retval = MPI_ERR_COUNT;
- } else {
+ } else if (request == nullptr){
+ retval = MPI_ERR_ARG;
+ } else {
char* sendtmpbuf = static_cast<char*>(sendbuf);
int sendtmpcount = sendcount;
sendtmpcount=0;
sendtmptype=recvtype;
}
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- int root_traced = comm->group()->index(root);
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_GATHER;
- extra->root = root_traced;
- int known = 0;
- extra->datatype1 = encode_datatype(sendtmptype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = sendtmptype->size();
- extra->send_size = sendtmpcount * dt_size_send;
- extra->datatype2 = encode_datatype(recvtype, &known);
- int dt_size_recv = 1;
- if ((comm->rank() == root) && known == 0)
- dt_size_recv = recvtype->size();
- extra->recv_size = recvcount * dt_size_recv;
-
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
-
- simgrid::smpi::Colls::gather(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, root, comm);
+ int rank = simgrid::s4u::this_actor::get_pid();
+
+ TRACE_smpi_comm_in(
+ rank, request==MPI_REQUEST_IGNORED?"PMPI_Gather":"PMPI_Igather",
+ new simgrid::instr::CollTIData(
+ request==MPI_REQUEST_IGNORED ? "gather":"igather", root, -1.0, sendtmptype->is_replayable() ? sendtmpcount : sendtmpcount * sendtmptype->size(),
+ (comm->rank() != root || recvtype->is_replayable()) ? recvcount : recvcount * recvtype->size(),
+ simgrid::smpi::Datatype::encode(sendtmptype), simgrid::smpi::Datatype::encode(recvtype)));
+ if(request == MPI_REQUEST_IGNORED)
+ simgrid::smpi::Colls::gather(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, root, comm);
+ else
+ simgrid::smpi::Colls::igather(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, root, comm, request);
retval = MPI_SUCCESS;
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
}
smpi_bench_begin();
}
int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs,
- MPI_Datatype recvtype, int root, MPI_Comm comm)
+ MPI_Datatype recvtype, int root, MPI_Comm comm){
+ return PMPI_Igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, root, comm, MPI_REQUEST_IGNORED);
+}
+
+int PMPI_Igatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs,
+ MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Request *request)
{
int retval = 0;
retval = MPI_ERR_TYPE;
} else if (( sendbuf != MPI_IN_PLACE) && (sendcount <0)){
retval = MPI_ERR_COUNT;
- } else if (recvcounts == nullptr || displs == nullptr) {
+ } else if ((comm->rank() == root) && (recvcounts == nullptr || displs == nullptr)) {
retval = MPI_ERR_ARG;
- } else {
+ } else if (request == nullptr){
+ retval = MPI_ERR_ARG;
+ } else {
char* sendtmpbuf = static_cast<char*>(sendbuf);
int sendtmpcount = sendcount;
MPI_Datatype sendtmptype = sendtype;
sendtmptype=recvtype;
}
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- int root_traced = comm->group()->index(root);
- int size = comm->size();
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_GATHERV;
- extra->num_processes = size;
- extra->root = root_traced;
- int known = 0;
- extra->datatype1 = encode_datatype(sendtmptype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = sendtype->size();
- extra->send_size = sendtmpcount * dt_size_send;
- extra->datatype2 = encode_datatype(recvtype, &known);
- int dt_size_recv = 1;
- if (known == 0)
- dt_size_recv = recvtype->size();
+ 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>;
if (comm->rank() == root) {
- extra->recvcounts = xbt_new(int, size);
- for (int i = 0; i < size; i++) // copy data to avoid bad free
- extra->recvcounts[i] = recvcounts[i] * dt_size_recv;
+ for (int i = 0; i < comm->size(); i++) // copy data to avoid bad free
+ trace_recvcounts->push_back(recvcounts[i] * dt_size_recv);
}
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
- retval = simgrid::smpi::Colls::gatherv(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcounts, displs, recvtype, root, comm);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_in(rank, request==MPI_REQUEST_IGNORED?"PMPI_Gatherv":"PMPI_Igatherv",
+ new simgrid::instr::VarCollTIData(
+ request==MPI_REQUEST_IGNORED ? "gatherv":"igatherv", root,
+ sendtmptype->is_replayable() ? sendtmpcount : sendtmpcount * sendtmptype->size(), nullptr,
+ dt_size_recv, trace_recvcounts, simgrid::smpi::Datatype::encode(sendtmptype),
+ simgrid::smpi::Datatype::encode(recvtype)));
+ if(request == MPI_REQUEST_IGNORED)
+ retval = simgrid::smpi::Colls::gatherv(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcounts, displs, recvtype, root, comm);
+ else
+ retval = simgrid::smpi::Colls::igatherv(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcounts, displs, recvtype, root, comm, request);
+ TRACE_smpi_comm_out(rank);
}
smpi_bench_begin();
}
int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
- void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
+ void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm){
+ return PMPI_Iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, MPI_REQUEST_IGNORED);
+}
+
+int PMPI_Iallgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
+ void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Request* request)
{
- int retval = 0;
+ int retval = MPI_SUCCESS;
smpi_bench_end();
} else if ((( sendbuf != MPI_IN_PLACE) && (sendcount <0)) ||
(recvcount <0)){
retval = MPI_ERR_COUNT;
- } else {
+ } else if (request == nullptr){
+ retval = MPI_ERR_ARG;
+ } else {
if(sendbuf == MPI_IN_PLACE) {
sendbuf=static_cast<char*>(recvbuf)+recvtype->get_extent()*recvcount*comm->rank();
sendcount=recvcount;
sendtype=recvtype;
}
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_ALLGATHER;
- int known = 0;
- extra->datatype1 = encode_datatype(sendtype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = sendtype->size();
- extra->send_size = sendcount * dt_size_send;
- extra->datatype2 = encode_datatype(recvtype, &known);
- int dt_size_recv = 1;
- if (known == 0)
- dt_size_recv = recvtype->size();
- extra->recv_size = recvcount * dt_size_recv;
-
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
-
- simgrid::smpi::Colls::allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm);
- retval = MPI_SUCCESS;
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ int rank = simgrid::s4u::this_actor::get_pid();
+
+ TRACE_smpi_comm_in(rank, request==MPI_REQUEST_IGNORED?"PMPI_Allgather":"PMPI_Iallggather",
+ new simgrid::instr::CollTIData(
+ request==MPI_REQUEST_IGNORED ? "allgather" : "iallgather", -1, -1.0, sendtype->is_replayable() ? sendcount : sendcount * sendtype->size(),
+ recvtype->is_replayable() ? recvcount : recvcount * recvtype->size(),
+ simgrid::smpi::Datatype::encode(sendtype), simgrid::smpi::Datatype::encode(recvtype)));
+ if(request == MPI_REQUEST_IGNORED)
+ simgrid::smpi::Colls::allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm);
+ else
+ simgrid::smpi::Colls::iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request);
+ TRACE_smpi_comm_out(rank);
}
smpi_bench_begin();
return retval;
}
int PMPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
- void *recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, MPI_Comm comm)
+ void *recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, MPI_Comm comm){
+ return PMPI_Iallgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm, MPI_REQUEST_IGNORED);
+}
+
+int PMPI_Iallgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
+ void *recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, MPI_Comm comm, MPI_Request* request)
{
int retval = 0;
retval = MPI_ERR_COUNT;
} else if (recvcounts == nullptr || displs == nullptr) {
retval = MPI_ERR_ARG;
- } else {
+ } else if (request == nullptr){
+ retval = MPI_ERR_ARG;
+ } else {
if(sendbuf == MPI_IN_PLACE) {
sendbuf=static_cast<char*>(recvbuf)+recvtype->get_extent()*displs[comm->rank()];
sendcount=recvcounts[comm->rank()];
sendtype=recvtype;
}
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- int i = 0;
- int size = comm->size();
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_ALLGATHERV;
- extra->num_processes = size;
- int known = 0;
- extra->datatype1 = encode_datatype(sendtype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = sendtype->size();
- extra->send_size = sendcount * dt_size_send;
- extra->datatype2 = encode_datatype(recvtype, &known);
- int dt_size_recv = 1;
- if (known == 0)
- dt_size_recv = recvtype->size();
- extra->recvcounts = xbt_new(int, size);
- for (i = 0; i < size; i++) // copy data to avoid bad free
- extra->recvcounts[i] = recvcounts[i] * dt_size_recv;
-
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
-
- simgrid::smpi::Colls::allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm);
+ 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>;
+ for (int i = 0; i < comm->size(); i++) // copy data to avoid bad free
+ trace_recvcounts->push_back(recvcounts[i] * dt_size_recv);
+
+ TRACE_smpi_comm_in(rank, request==MPI_REQUEST_IGNORED?"PMPI_Allgatherv":"PMPI_Iallgatherv",
+ new simgrid::instr::VarCollTIData(
+ request==MPI_REQUEST_IGNORED ? "allgatherv" : "iallgatherv", -1, sendtype->is_replayable() ? sendcount : sendcount * sendtype->size(),
+ nullptr, dt_size_recv, trace_recvcounts, simgrid::smpi::Datatype::encode(sendtype),
+ simgrid::smpi::Datatype::encode(recvtype)));
+ if(request == MPI_REQUEST_IGNORED)
+ simgrid::smpi::Colls::allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm);
+ else
+ simgrid::smpi::Colls::iallgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm, request);
retval = MPI_SUCCESS;
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
}
smpi_bench_begin();
}
int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
- void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
+ void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm){
+ return PMPI_Iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, MPI_REQUEST_IGNORED);
+}
+
+int PMPI_Iscatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
+ void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Request* request)
{
int retval = 0;
recvtype = sendtype;
recvcount = sendcount;
}
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- int root_traced = comm->group()->index(root);
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_SCATTER;
- extra->root = root_traced;
- int known = 0;
- extra->datatype1 = encode_datatype(sendtype, &known);
- int dt_size_send = 1;
- if ((comm->rank() == root) && known == 0)
- dt_size_send = sendtype->size();
- extra->send_size = sendcount * dt_size_send;
- extra->datatype2 = encode_datatype(recvtype, &known);
- int dt_size_recv = 1;
- if (known == 0)
- dt_size_recv = recvtype->size();
- extra->recv_size = recvcount * dt_size_recv;
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
-
- simgrid::smpi::Colls::scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm);
+ int rank = simgrid::s4u::this_actor::get_pid();
+
+ TRACE_smpi_comm_in(
+ rank, request==MPI_REQUEST_IGNORED?"PMPI_Scatter":"PMPI_Iscatter",
+ new simgrid::instr::CollTIData(
+ request==MPI_REQUEST_IGNORED ? "scatter" : "iscatter", root, -1.0,
+ (comm->rank() != root || sendtype->is_replayable()) ? sendcount : sendcount * sendtype->size(),
+ recvtype->is_replayable() ? recvcount : recvcount * recvtype->size(),
+ simgrid::smpi::Datatype::encode(sendtype), simgrid::smpi::Datatype::encode(recvtype)));
+ if(request == MPI_REQUEST_IGNORED)
+ simgrid::smpi::Colls::scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm);
+ else
+ simgrid::smpi::Colls::iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request);
retval = MPI_SUCCESS;
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
}
smpi_bench_begin();
}
int PMPI_Scatterv(void *sendbuf, int *sendcounts, int *displs,
- MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
+ MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm){
+ return PMPI_Iscatterv(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, MPI_REQUEST_IGNORED);
+}
+
+int PMPI_Iscatterv(void *sendbuf, int *sendcounts, int *displs,
+ MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Request *request)
{
int retval = 0;
} else if (((comm->rank() == root) && (sendtype == MPI_DATATYPE_NULL)) ||
((recvbuf != MPI_IN_PLACE) && (recvtype == MPI_DATATYPE_NULL))) {
retval = MPI_ERR_TYPE;
+ } else if (request == nullptr){
+ retval = MPI_ERR_ARG;
} else {
if (recvbuf == MPI_IN_PLACE) {
recvtype = sendtype;
recvcount = sendcounts[comm->rank()];
}
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- int root_traced = comm->group()->index(root);
- int size = comm->size();
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_SCATTERV;
- extra->num_processes = size;
- extra->root = root_traced;
- int known = 0;
- extra->datatype1 = encode_datatype(sendtype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = sendtype->size();
+ 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>;
if (comm->rank() == root) {
- extra->sendcounts = xbt_new(int, size);
- for (int i = 0; i < size; i++) // copy data to avoid bad free
- extra->sendcounts[i] = sendcounts[i] * dt_size_send;
+ for (int i = 0; i < comm->size(); i++) // copy data to avoid bad free
+ trace_sendcounts->push_back(sendcounts[i] * dt_size_send);
}
- extra->datatype2 = encode_datatype(recvtype, &known);
- int dt_size_recv = 1;
- if (known == 0)
- dt_size_recv = recvtype->size();
- extra->recv_size = recvcount * dt_size_recv;
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
- retval = simgrid::smpi::Colls::scatterv(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm);
+ TRACE_smpi_comm_in(rank, request==MPI_REQUEST_IGNORED?"PMPI_Scatterv":"PMPI_Iscatterv",
+ new simgrid::instr::VarCollTIData(
+ request==MPI_REQUEST_IGNORED ? "scatterv":"iscatterv", root, dt_size_send, trace_sendcounts,
+ recvtype->is_replayable() ? recvcount : recvcount * recvtype->size(), nullptr,
+ simgrid::smpi::Datatype::encode(sendtype), simgrid::smpi::Datatype::encode(recvtype)));
+ if(request == MPI_REQUEST_IGNORED)
+ retval = simgrid::smpi::Colls::scatterv(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm);
+ else
+ retval = simgrid::smpi::Colls::iscatterv(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, request);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
}
smpi_bench_begin();
} else if (not datatype->is_valid() || op == MPI_OP_NULL) {
retval = MPI_ERR_ARG;
} else {
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- int root_traced = comm->group()->index(root);
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_REDUCE;
- int known = 0;
- extra->datatype1 = encode_datatype(datatype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = datatype->size();
- extra->send_size = count * dt_size_send;
- extra->root = root_traced;
-
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
+ int rank = simgrid::s4u::this_actor::get_pid();
+
+ TRACE_smpi_comm_in(rank, __func__,
+ new simgrid::instr::CollTIData("reduce", root, 0,
+ datatype->is_replayable() ? count : count * datatype->size(), -1,
+ simgrid::smpi::Datatype::encode(datatype), ""));
simgrid::smpi::Colls::reduce(sendbuf, recvbuf, count, datatype, op, root, comm);
retval = MPI_SUCCESS;
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
}
smpi_bench_begin();
}
int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
+{
+ return PMPI_Iallreduce(sendbuf, recvbuf, count, datatype, op, comm, MPI_REQUEST_IGNORED);
+}
+
+int PMPI_Iallreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Request *request)
{
int retval = 0;
retval = MPI_ERR_TYPE;
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
+ } else if (request != MPI_REQUEST_IGNORED) {
+ xbt_die("Iallreduce is not yet implemented. WIP");
+ retval = MPI_ERR_ARG;
} else {
char* sendtmpbuf = static_cast<char*>(sendbuf);
sendtmpbuf = static_cast<char*>(xbt_malloc(count*datatype->get_extent()));
simgrid::smpi::Datatype::copy(recvbuf, count, datatype,sendtmpbuf, count, datatype);
}
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_ALLREDUCE;
- int known = 0;
- extra->datatype1 = encode_datatype(datatype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = datatype->size();
- extra->send_size = count * dt_size_send;
+ int rank = simgrid::s4u::this_actor::get_pid();
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
+ TRACE_smpi_comm_in(rank, __func__,
+ new simgrid::instr::CollTIData(request==MPI_REQUEST_IGNORED ? "allreduce":"iallreduce", -1, 0,
+ datatype->is_replayable() ? count : count * datatype->size(), -1,
+ simgrid::smpi::Datatype::encode(datatype), ""));
- simgrid::smpi::Colls::allreduce(sendtmpbuf, recvbuf, count, datatype, op, comm);
+// if(request == MPI_REQUEST_IGNORED)
+ simgrid::smpi::Colls::allreduce(sendtmpbuf, recvbuf, count, datatype, op, comm);
+// else
+// simgrid::smpi::Colls::iallreduce(sendtmpbuf, recvbuf, count, datatype, op, comm, request);
if( sendbuf == MPI_IN_PLACE )
xbt_free(sendtmpbuf);
retval = MPI_SUCCESS;
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
}
smpi_bench_begin();
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
} else {
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_SCAN;
- int known = 0;
- extra->datatype1 = encode_datatype(datatype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = datatype->size();
- extra->send_size = count * dt_size_send;
-
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
+ int rank = simgrid::s4u::this_actor::get_pid();
+ void* sendtmpbuf = sendbuf;
+ if (sendbuf == MPI_IN_PLACE) {
+ sendtmpbuf = static_cast<void*>(xbt_malloc(count * datatype->size()));
+ memcpy(sendtmpbuf, recvbuf, count * datatype->size());
+ }
+ TRACE_smpi_comm_in(rank, __func__, new simgrid::instr::Pt2PtTIData(
+ "scan", -1, datatype->is_replayable() ? count : count * datatype->size(),
+ simgrid::smpi::Datatype::encode(datatype)));
- retval = simgrid::smpi::Colls::scan(sendbuf, recvbuf, count, datatype, op, comm);
+ retval = simgrid::smpi::Colls::scan(sendtmpbuf, recvbuf, count, datatype, op, comm);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
+ if (sendbuf == MPI_IN_PLACE)
+ xbt_free(sendtmpbuf);
}
smpi_bench_begin();
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
} else {
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_EXSCAN;
- int known = 0;
- extra->datatype1 = encode_datatype(datatype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = datatype->size();
- extra->send_size = count * dt_size_send;
+ int rank = simgrid::s4u::this_actor::get_pid();
void* sendtmpbuf = sendbuf;
if (sendbuf == MPI_IN_PLACE) {
sendtmpbuf = static_cast<void*>(xbt_malloc(count * datatype->size()));
memcpy(sendtmpbuf, recvbuf, count * datatype->size());
}
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
+
+ TRACE_smpi_comm_in(rank, __func__, new simgrid::instr::Pt2PtTIData(
+ "exscan", -1, datatype->is_replayable() ? count : count * datatype->size(),
+ simgrid::smpi::Datatype::encode(datatype)));
retval = simgrid::smpi::Colls::exscan(sendtmpbuf, recvbuf, count, datatype, op, comm);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
if (sendbuf == MPI_IN_PLACE)
xbt_free(sendtmpbuf);
}
} else if (recvcounts == nullptr) {
retval = MPI_ERR_ARG;
} else {
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- int i = 0;
- int size = comm->size();
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_REDUCE_SCATTER;
- extra->num_processes = size;
- int known = 0;
- extra->datatype1 = encode_datatype(datatype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = datatype->size();
- extra->send_size = 0;
- extra->recvcounts = xbt_new(int, size);
+ int rank = simgrid::s4u::this_actor::get_pid();
+ std::vector<int>* trace_recvcounts = new std::vector<int>;
+ int dt_send_size = datatype->is_replayable() ? 1 : datatype->size();
int totalcount = 0;
- for (i = 0; i < size; i++) { // copy data to avoid bad free
- extra->recvcounts[i] = recvcounts[i] * dt_size_send;
+
+ for (int i = 0; i < comm->size(); i++) { // copy data to avoid bad free
+ trace_recvcounts->push_back(recvcounts[i] * dt_send_size);
totalcount += recvcounts[i];
}
+
void* sendtmpbuf = sendbuf;
if (sendbuf == MPI_IN_PLACE) {
sendtmpbuf = static_cast<void*>(xbt_malloc(totalcount * datatype->size()));
memcpy(sendtmpbuf, recvbuf, totalcount * datatype->size());
}
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
+ TRACE_smpi_comm_in(rank, __func__, new simgrid::instr::VarCollTIData(
+ "reducescatter", -1, dt_send_size, nullptr, -1, trace_recvcounts,
+ simgrid::smpi::Datatype::encode(datatype), ""));
simgrid::smpi::Colls::reduce_scatter(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm);
retval = MPI_SUCCESS;
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
if (sendbuf == MPI_IN_PLACE)
xbt_free(sendtmpbuf);
} else {
int count = comm->size();
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_REDUCE_SCATTER;
- extra->num_processes = count;
- int known = 0;
- extra->datatype1 = encode_datatype(datatype, &known);
- int dt_size_send = 1;
- if (known == 0)
- dt_size_send = datatype->size();
- extra->send_size = 0;
- extra->recvcounts = xbt_new(int, count);
- for (int i = 0; i < count; i++) // copy data to avoid bad free
- extra->recvcounts[i] = recvcount * dt_size_send;
+ 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
+
void* sendtmpbuf = sendbuf;
if (sendbuf == MPI_IN_PLACE) {
sendtmpbuf = static_cast<void*>(xbt_malloc(recvcount * count * datatype->size()));
memcpy(sendtmpbuf, recvbuf, recvcount * count * datatype->size());
}
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
+ TRACE_smpi_comm_in(rank, __func__,
+ new simgrid::instr::VarCollTIData("reducescatter", -1, 0, nullptr, -1, trace_recvcounts,
+ simgrid::smpi::Datatype::encode(datatype), ""));
- int* recvcounts = static_cast<int*>(xbt_malloc(count * sizeof(int)));
+ int* recvcounts = new int[count];
for (int i = 0; i < count; i++)
recvcounts[i] = recvcount;
simgrid::smpi::Colls::reduce_scatter(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm);
- xbt_free(recvcounts);
+ delete[] recvcounts;
retval = MPI_SUCCESS;
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
if (sendbuf == MPI_IN_PLACE)
xbt_free(sendtmpbuf);
smpi_bench_begin();
return retval;
}
-
int PMPI_Alltoall(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,
- MPI_Datatype recvtype, MPI_Comm comm)
+ MPI_Datatype recvtype, MPI_Comm comm){
+ return PMPI_Ialltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, MPI_REQUEST_IGNORED);
+}
+
+int PMPI_Ialltoall(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,
+ MPI_Datatype recvtype, MPI_Comm comm, MPI_Request *request)
{
int retval = 0;
smpi_bench_end();
retval = MPI_ERR_COMM;
} else if ((sendbuf != MPI_IN_PLACE && sendtype == MPI_DATATYPE_NULL) || recvtype == MPI_DATATYPE_NULL) {
retval = MPI_ERR_TYPE;
+ } else if (request == nullptr){
+ retval = MPI_ERR_ARG;
} else {
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_ALLTOALL;
-
+ int rank = simgrid::s4u::this_actor::get_pid();
void* sendtmpbuf = static_cast<char*>(sendbuf);
int sendtmpcount = sendcount;
MPI_Datatype sendtmptype = sendtype;
sendtmptype = recvtype;
}
- int known = 0;
- extra->datatype1 = encode_datatype(sendtmptype, &known);
- if (known == 0)
- extra->send_size = sendtmpcount * sendtmptype->size();
- else
- extra->send_size = sendtmpcount;
- extra->datatype2 = encode_datatype(recvtype, &known);
- if (known == 0)
- extra->recv_size = recvcount * recvtype->size();
+ TRACE_smpi_comm_in(rank, request==MPI_REQUEST_IGNORED?"PMPI_Alltoall":"PMPI_Ialltoall",
+ new simgrid::instr::CollTIData(
+ request==MPI_REQUEST_IGNORED ? "alltoall" : "ialltoall", -1, -1.0,
+ sendtmptype->is_replayable() ? sendtmpcount : sendtmpcount * sendtmptype->size(),
+ recvtype->is_replayable() ? recvcount : recvcount * recvtype->size(),
+ simgrid::smpi::Datatype::encode(sendtmptype), simgrid::smpi::Datatype::encode(recvtype)));
+ if(request == MPI_REQUEST_IGNORED)
+ retval = simgrid::smpi::Colls::alltoall(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, comm);
else
- extra->recv_size = recvcount;
+ retval = simgrid::smpi::Colls::ialltoall(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, comm, request);
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
-
- retval = simgrid::smpi::Colls::alltoall(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, comm);
-
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
if (sendbuf == MPI_IN_PLACE)
xbt_free(sendtmpbuf);
int PMPI_Alltoallv(void* sendbuf, int* sendcounts, int* senddisps, MPI_Datatype sendtype, void* recvbuf,
int* recvcounts, int* recvdisps, MPI_Datatype recvtype, MPI_Comm comm)
+{
+ return PMPI_Ialltoallv(sendbuf, sendcounts, senddisps, sendtype, recvbuf, recvcounts, recvdisps, recvtype, comm, MPI_REQUEST_IGNORED);
+}
+
+int PMPI_Ialltoallv(void* sendbuf, int* sendcounts, int* senddisps, MPI_Datatype sendtype, void* recvbuf,
+ int* recvcounts, int* recvdisps, MPI_Datatype recvtype, MPI_Comm comm, MPI_Request *request)
{
int retval = 0;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
- } else if (sendtype == MPI_DATATYPE_NULL || recvtype == MPI_DATATYPE_NULL) {
+ } else if ((sendbuf != MPI_IN_PLACE && sendtype == MPI_DATATYPE_NULL) || recvtype == MPI_DATATYPE_NULL) {
retval = MPI_ERR_TYPE;
} else if ((sendbuf != MPI_IN_PLACE && (sendcounts == nullptr || senddisps == nullptr)) || recvcounts == nullptr ||
recvdisps == nullptr) {
retval = MPI_ERR_ARG;
- } else {
- int rank = comm != MPI_COMM_NULL ? smpi_process()->index() : -1;
- int i = 0;
+ } else if (request == nullptr){
+ retval = MPI_ERR_ARG;
+ } else {
+ int rank = simgrid::s4u::this_actor::get_pid();
int size = comm->size();
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1);
- extra->type = TRACING_ALLTOALLV;
- extra->send_size = 0;
- extra->recv_size = 0;
- extra->recvcounts = xbt_new(int, size);
- extra->sendcounts = xbt_new(int, size);
- int known = 0;
- extra->datatype2 = encode_datatype(recvtype, &known);
+ 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>;
int dt_size_recv = recvtype->size();
void* sendtmpbuf = static_cast<char*>(sendbuf);
int* sendtmpdisps = senddisps;
MPI_Datatype sendtmptype = sendtype;
int maxsize = 0;
- for (i = 0; i < size; i++) { // copy data to avoid bad free
- extra->recv_size += recvcounts[i] * dt_size_recv;
- extra->recvcounts[i] = recvcounts[i] * dt_size_recv;
+ for (int i = 0; i < size; i++) { // copy data to avoid bad free
+ recv_size += recvcounts[i] * dt_size_recv;
+ trace_recvcounts->push_back(recvcounts[i] * dt_size_recv);
if (((recvdisps[i] + recvcounts[i]) * dt_size_recv) > maxsize)
maxsize = (recvdisps[i] + recvcounts[i]) * dt_size_recv;
}
sendtmptype = recvtype;
}
- extra->datatype1 = encode_datatype(sendtmptype, &known);
int dt_size_send = sendtmptype->size();
- for (i = 0; i < size; i++) { // copy data to avoid bad free
- extra->send_size += sendtmpcounts[i] * dt_size_send;
- extra->sendcounts[i] = sendtmpcounts[i] * dt_size_send;
+ for (int i = 0; i < size; i++) { // copy data to avoid bad free
+ send_size += sendtmpcounts[i] * dt_size_send;
+ trace_sendcounts->push_back(sendtmpcounts[i] * dt_size_send);
}
- extra->num_processes = size;
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
- retval = simgrid::smpi::Colls::alltoallv(sendtmpbuf, sendtmpcounts, sendtmpdisps, sendtmptype, recvbuf, recvcounts,
+
+ TRACE_smpi_comm_in(rank, request==MPI_REQUEST_IGNORED?"PMPI_Alltoallv":"PMPI_Ialltoallv",
+ new simgrid::instr::VarCollTIData(request==MPI_REQUEST_IGNORED ? "alltoallv":"ialltoallv", -1, send_size, trace_sendcounts, recv_size,
+ trace_recvcounts, simgrid::smpi::Datatype::encode(sendtype),
+ simgrid::smpi::Datatype::encode(recvtype)));
+
+ if(request == MPI_REQUEST_IGNORED)
+ retval = simgrid::smpi::Colls::alltoallv(sendtmpbuf, sendtmpcounts, sendtmpdisps, sendtmptype, recvbuf, recvcounts,
recvdisps, recvtype, comm);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ else
+ retval = simgrid::smpi::Colls::ialltoallv(sendtmpbuf, sendtmpcounts, sendtmpdisps, sendtmptype, recvbuf, recvcounts,
+ recvdisps, recvtype, comm, request);
+ TRACE_smpi_comm_out(rank);
if (sendbuf == MPI_IN_PLACE) {
xbt_free(sendtmpbuf);
smpi_bench_begin();
return retval;
}
-
-}