/* 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 "private.hpp"
#include "smpi_coll.hpp"
#include "smpi_comm.hpp"
#include "smpi_datatype.hpp"
return MPI_CURRENT_TYPE;
}
-const char* encode_datatype(MPI_Datatype datatype, int* known)
+const char* encode_datatype(MPI_Datatype datatype)
{
- //default type for output is set to MPI_BYTE
- // MPI_DEFAULT_TYPE is not set for output, use directly MPI_BYTE
- if(known!=nullptr)
- *known=1;
if (datatype==MPI_BYTE)
return "";
if(datatype==MPI_DOUBLE)
return "4";
if(datatype==MPI_FLOAT)
return "5";
- //tell that the datatype is not handled by replay, and that its size should be measured and replayed as size*MPI_BYTE
- if(known!=nullptr)
- *known=0;
// default - not implemented.
// do not warn here as we pass in this function even for other trace formats
return "-1";
XBT_DEBUG("Initialize the counters");
CHECK_ACTION_PARAMS(action, 0, 1)
if(action[2])
- MPI_DEFAULT_TYPE=MPI_DOUBLE; // default MPE dataype
- else MPI_DEFAULT_TYPE= MPI_BYTE; // default TAU datatype
+ MPI_DEFAULT_TYPE = MPI_DOUBLE; // default MPE datatype
+ else
+ MPI_DEFAULT_TYPE = MPI_BYTE; // default TAU datatype
/* start a simulated timer */
smpi_process()->simulated_start();
extra->send_size = size;
extra->src = rank;
extra->dst = dst_traced;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- TRACE_smpi_ptp_in(rank, __FUNCTION__, extra);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
if (not TRACE_smpi_view_internals())
TRACE_smpi_send(rank, rank, dst_traced, 0, size*MPI_CURRENT_TYPE->size());
log_timed_action (action, clock);
- TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
}
static void action_Isend(const char *const *action)
extra->send_size = size;
extra->src = rank;
extra->dst = dst_traced;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- TRACE_smpi_ptp_in(rank, __FUNCTION__, extra);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
if (not TRACE_smpi_view_internals())
TRACE_smpi_send(rank, rank, dst_traced, 0, size*MPI_CURRENT_TYPE->size());
- MPI_Request request = Request::isend(nullptr, size, MPI_CURRENT_TYPE, to, 0,MPI_COMM_WORLD);
+ MPI_Request request = Request::isend(nullptr, size, MPI_CURRENT_TYPE, to, 0, MPI_COMM_WORLD);
- TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
get_reqq_self()->push_back(request);
extra->send_size = size;
extra->src = src_traced;
extra->dst = rank;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- TRACE_smpi_ptp_in(rank, __FUNCTION__, extra);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
//unknown size from the receiver point of view
if(size<=0.0){
Request::recv(nullptr, size, MPI_CURRENT_TYPE, from, 0, MPI_COMM_WORLD, &status);
- TRACE_smpi_ptp_out(rank, rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
if (not TRACE_smpi_view_internals()) {
TRACE_smpi_recv(src_traced, rank, 0);
}
extra->send_size = size;
extra->src = src_traced;
extra->dst = rank;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- TRACE_smpi_ptp_in(rank, __FUNCTION__, extra);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
MPI_Status status;
//unknow size from the receiver pov
if(size<=0.0){
MPI_Request request = Request::irecv(nullptr, size, MPI_CURRENT_TYPE, from, 0, MPI_COMM_WORLD);
- TRACE_smpi_ptp_out(rank, rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
get_reqq_self()->push_back(request);
log_timed_action (action, clock);
int is_wait_for_receive = (request->flags() & RECV);
instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
extra->type = TRACING_WAIT;
- TRACE_smpi_ptp_in(rank, __FUNCTION__, extra);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
Request::wait(&request, &status);
- TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
if (is_wait_for_receive)
TRACE_smpi_recv(src_traced, dst_traced, 0);
log_timed_action (action, clock);
static void action_waitall(const char *const *action){
CHECK_ACTION_PARAMS(action, 0, 0)
double clock = smpi_process()->simulated_elapsed();
- unsigned int count_requests=get_reqq_self()->size();
+ const unsigned int count_requests = get_reqq_self()->size();
if (count_requests>0) {
MPI_Status status[count_requests];
instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
extra->type = TRACING_WAITALL;
extra->send_size=count_requests;
- TRACE_smpi_ptp_in(rank_traced, __FUNCTION__,extra);
+ TRACE_smpi_comm_in(rank_traced, __FUNCTION__, extra);
int recvs_snd[count_requests];
int recvs_rcv[count_requests];
- unsigned int i=0;
- for (auto const& req : *(get_reqq_self())) {
+ for (unsigned int i = 0; i < count_requests; i++) {
+ const auto& req = (*get_reqq_self())[i];
if (req && (req->flags () & RECV)){
recvs_snd[i]=req->src();
recvs_rcv[i]=req->dst();
}else
recvs_snd[i]=-100;
- i++;
}
Request::waitall(count_requests, &(*get_reqq_self())[0], status);
- for (i=0; i<count_requests;i++){
+ for (unsigned i = 0; i < count_requests; i++) {
if (recvs_snd[i]!=-100)
TRACE_smpi_recv(recvs_snd[i], recvs_rcv[i],0);
}
- TRACE_smpi_ptp_out(rank_traced, -1, __FUNCTION__);
+ TRACE_smpi_comm_out(rank_traced);
}
log_timed_action (action, clock);
}
int rank = smpi_process()->index();
instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
extra->type = TRACING_BARRIER;
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
Colls::barrier(MPI_COMM_WORLD);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
log_timed_action (action, clock);
}
extra->type = TRACING_BCAST;
extra->send_size = size;
extra->root = root_traced;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
void *sendbuf = smpi_get_tmp_sendbuffer(size* MPI_CURRENT_TYPE->size());
Colls::bcast(sendbuf, size, MPI_CURRENT_TYPE, root, MPI_COMM_WORLD);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
log_timed_action (action, clock);
}
extra->type = TRACING_REDUCE;
extra->send_size = comm_size;
extra->comp_size = comp_size;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
extra->root = root_traced;
- TRACE_smpi_collective_in(rank, __FUNCTION__,extra);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
void *recvbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size());
void *sendbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size());
Colls::reduce(sendbuf, recvbuf, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, root, MPI_COMM_WORLD);
smpi_execute_flops(comp_size);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
log_timed_action (action, clock);
}
extra->type = TRACING_ALLREDUCE;
extra->send_size = comm_size;
extra->comp_size = comp_size;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- TRACE_smpi_collective_in(rank, __FUNCTION__,extra);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
void *recvbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size());
void *sendbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size());
Colls::allreduce(sendbuf, recvbuf, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, MPI_COMM_WORLD);
smpi_execute_flops(comp_size);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
log_timed_action (action, clock);
}
extra->type = TRACING_ALLTOALL;
extra->send_size = send_size;
extra->recv_size = recv_size;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2);
- TRACE_smpi_collective_in(rank, __FUNCTION__,extra);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
Colls::alltoall(send, send_size, MPI_CURRENT_TYPE, recv, recv_size, MPI_CURRENT_TYPE2, MPI_COMM_WORLD);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
log_timed_action (action, clock);
}
extra->send_size = send_size;
extra->recv_size = recv_size;
extra->root = root;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2);
- TRACE_smpi_collective_in(smpi_process()->index(), __FUNCTION__, extra);
+ TRACE_smpi_comm_in(smpi_process()->index(), __FUNCTION__, extra);
Colls::gather(send, send_size, MPI_CURRENT_TYPE, recv, recv_size, MPI_CURRENT_TYPE2, root, MPI_COMM_WORLD);
- TRACE_smpi_collective_out(smpi_process()->index(), __FUNCTION__);
+ TRACE_smpi_comm_out(smpi_process()->index());
log_timed_action (action, clock);
}
recv = smpi_get_tmp_recvbuffer(recv_sum* MPI_CURRENT_TYPE2->size());
instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
- extra->type = TRACING_GATHERV;
- extra->send_size = send_size;
- extra->recvcounts= xbt_new(int,comm_size);
+ extra->type = TRACING_GATHERV;
+ extra->send_size = send_size;
+ extra->recvcounts = new int[comm_size];
for(int i=0; i< comm_size; i++)//copy data to avoid bad free
extra->recvcounts[i] = recvcounts[i];
extra->root = root;
extra->num_processes = comm_size;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2);
- TRACE_smpi_collective_in(smpi_process()->index(), __FUNCTION__, extra);
+ TRACE_smpi_comm_in(smpi_process()->index(), __FUNCTION__, extra);
Colls::gatherv(send, send_size, MPI_CURRENT_TYPE, recv, recvcounts, disps, MPI_CURRENT_TYPE2, root, MPI_COMM_WORLD);
- TRACE_smpi_collective_out(smpi_process()->index(), __FUNCTION__);
+ TRACE_smpi_comm_out(smpi_process()->index());
log_timed_action (action, clock);
}
instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
extra->type = TRACING_REDUCE_SCATTER;
extra->send_size = 0;
- extra->recvcounts= xbt_new(int, comm_size);
+ extra->recvcounts = new int[comm_size];
for(int i=0; i< comm_size; i++)//copy data to avoid bad free
extra->recvcounts[i] = recvcounts[i];
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
extra->comp_size = comp_size;
extra->num_processes = comm_size;
- TRACE_smpi_collective_in(rank, __FUNCTION__,extra);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
void *sendbuf = smpi_get_tmp_sendbuffer(size* MPI_CURRENT_TYPE->size());
void *recvbuf = smpi_get_tmp_recvbuffer(size* MPI_CURRENT_TYPE->size());
Colls::reduce_scatter(sendbuf, recvbuf, recvcounts, MPI_CURRENT_TYPE, MPI_OP_NULL, MPI_COMM_WORLD);
smpi_execute_flops(comp_size);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
log_timed_action (action, clock);
}
extra->type = TRACING_ALLGATHER;
extra->send_size = sendcount;
extra->recv_size= recvcount;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2);
extra->num_processes = MPI_COMM_WORLD->size();
- TRACE_smpi_collective_in(rank, __FUNCTION__,extra);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
Colls::allgather(sendbuf, sendcount, MPI_CURRENT_TYPE, recvbuf, recvcount, MPI_CURRENT_TYPE2, MPI_COMM_WORLD);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
log_timed_action (action, clock);
}
instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
extra->type = TRACING_ALLGATHERV;
extra->send_size = sendcount;
- extra->recvcounts= xbt_new(int, comm_size);
+ extra->recvcounts = new int[comm_size];
for(int i=0; i< comm_size; i++)//copy data to avoid bad free
extra->recvcounts[i] = recvcounts[i];
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2);
extra->num_processes = comm_size;
- TRACE_smpi_collective_in(rank, __FUNCTION__,extra);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
Colls::allgatherv(sendbuf, sendcount, MPI_CURRENT_TYPE, recvbuf, recvcounts, disps, MPI_CURRENT_TYPE2,
MPI_COMM_WORLD);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
log_timed_action (action, clock);
}
int rank = smpi_process()->index();
instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
extra->type = TRACING_ALLTOALLV;
- extra->recvcounts= xbt_new(int, comm_size);
- extra->sendcounts= xbt_new(int, comm_size);
+ extra->recvcounts = new int[comm_size];
+ extra->sendcounts = new int[comm_size];
extra->num_processes = comm_size;
for(int i=0; i< comm_size; i++){//copy data to avoid bad free
extra->recv_size += recvcounts[i];
extra->recvcounts[i] = recvcounts[i];
}
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, nullptr);
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
+ extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2);
- TRACE_smpi_collective_in(rank, __FUNCTION__,extra);
+ TRACE_smpi_comm_in(rank, __FUNCTION__, extra);
Colls::alltoallv(sendbuf, sendcounts, senddisps, MPI_CURRENT_TYPE,recvbuf, recvcounts, recvdisps,
MPI_CURRENT_TYPE, MPI_COMM_WORLD);
- TRACE_smpi_collective_out(rank, __FUNCTION__);
+ TRACE_smpi_comm_out(rank);
log_timed_action (action, clock);
}
TRACE_smpi_computing_init(rank);
instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
extra->type = TRACING_INIT;
- TRACE_smpi_collective_in(rank, "smpi_replay_run_init", extra);
- TRACE_smpi_collective_out(rank, "smpi_replay_run_init");
+ TRACE_smpi_comm_in(rank, "smpi_replay_run_init", extra);
+ TRACE_smpi_comm_out(rank);
xbt_replay_action_register("init", simgrid::smpi::action_init);
xbt_replay_action_register("finalize", simgrid::smpi::action_finalize);
xbt_replay_action_register("comm_size", simgrid::smpi::action_comm_size);
instr_extra_data extra_fin = xbt_new0(s_instr_extra_data_t,1);
extra_fin->type = TRACING_FINALIZE;
- TRACE_smpi_collective_in(smpi_process()->index(), "smpi_replay_run_finalize", extra_fin);
+ TRACE_smpi_comm_in(smpi_process()->index(), "smpi_replay_run_finalize", extra_fin);
smpi_process()->finalize();
- TRACE_smpi_collective_out(smpi_process()->index(), "smpi_replay_run_finalize");
+ TRACE_smpi_comm_out(smpi_process()->index());
TRACE_smpi_finalize(smpi_process()->index());
}