/* Sometimes we need to re-insert MPI_REQUEST_NULL but we still need src,dst and tag */
void addNullRequest(int src, int dst, int tag)
{
- store.insert({req_key_t(src, dst, tag), MPI_REQUEST_NULL});
+ store.insert({req_key_t(
+ MPI_COMM_WORLD->group()->actor(src)->get_pid()-1,
+ MPI_COMM_WORLD->group()->actor(dst)->get_pid()-1,
+ tag), MPI_REQUEST_NULL});
}
};
void RecvAction::kernel(simgrid::xbt::ReplayAction& action)
{
- int src_traced = MPI_COMM_WORLD->group()->actor(args.partner)->get_pid();
-
TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::Pt2PtTIData(name, args.partner, args.size,
args.tag, Datatype::encode(args.datatype1)));
TRACE_smpi_comm_out(my_proc_id);
// TODO: Check why this was only activated in the "recv" case and not in the "irecv" case
if (name == "recv" && not TRACE_smpi_view_internals()) {
+ int src_traced = MPI_COMM_WORLD->group()->actor(status.MPI_SOURCE)->get_pid();
TRACE_smpi_recv(src_traced, my_proc_id, args.tag);
}
}
/** @brief Only initialize the replay, don't do it for real */
void smpi_replay_init(int* argc, char*** argv)
{
- simgrid::smpi::Process::init(argc, argv);
+ if (not smpi_process()->initializing()){
+ simgrid::smpi::ActorExt::init(argc, argv);
+ }
smpi_process()->mark_as_initialized();
smpi_process()->set_replaying(true);
int my_proc_id = simgrid::s4u::this_actor::get_pid();
- for (int i = 0; i < smpi_process_count(); i++) {
- storage[i] = simgrid::smpi::replay::RequestStorage();
- }
TRACE_smpi_init(my_proc_id);
TRACE_smpi_computing_init(my_proc_id);
xbt_replay_action_register("comm_size", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::CommunicatorAction().execute(action); });
xbt_replay_action_register("comm_split",[](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::CommunicatorAction().execute(action); });
xbt_replay_action_register("comm_dup", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::CommunicatorAction().execute(action); });
- xbt_replay_action_register("send", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::SendAction("send", storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); });
- xbt_replay_action_register("isend", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::SendAction("isend", storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); });
- xbt_replay_action_register("recv", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::RecvAction("recv", storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); });
- xbt_replay_action_register("irecv", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::RecvAction("irecv", storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); });
- xbt_replay_action_register("test", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::TestAction(storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); });
- xbt_replay_action_register("wait", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::WaitAction(storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); });
- xbt_replay_action_register("waitall", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::WaitAllAction(storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); });
+ xbt_replay_action_register("send", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::SendAction("send", storage[simgrid::s4u::this_actor::get_pid()]).execute(action); });
+ xbt_replay_action_register("isend", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::SendAction("isend", storage[simgrid::s4u::this_actor::get_pid()]).execute(action); });
+ xbt_replay_action_register("recv", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::RecvAction("recv", storage[simgrid::s4u::this_actor::get_pid()]).execute(action); });
+ xbt_replay_action_register("irecv", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::RecvAction("irecv", storage[simgrid::s4u::this_actor::get_pid()]).execute(action); });
+ xbt_replay_action_register("test", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::TestAction(storage[simgrid::s4u::this_actor::get_pid()]).execute(action); });
+ xbt_replay_action_register("wait", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::WaitAction(storage[simgrid::s4u::this_actor::get_pid()]).execute(action); });
+ xbt_replay_action_register("waitall", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::WaitAllAction(storage[simgrid::s4u::this_actor::get_pid()]).execute(action); });
xbt_replay_action_register("barrier", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::BarrierAction().execute(action); });
xbt_replay_action_register("bcast", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::BcastAction().execute(action); });
xbt_replay_action_register("reduce", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::ReduceAction().execute(action); });
XBT_VERB("Delayed start for instance - Sleeping for %f flops ",value );
smpi_execute_flops(value);
} else {
- //UGLY: force a context switch to be sure that all MSG_processes begin initialization
- XBT_DEBUG("Force context switch by smpi_execute_flops - Sleeping for 0.0 flops ");
- smpi_execute_flops(0.0);
+ // Wait for the other actors to initialize also
+ simgrid::s4u::this_actor::yield();
}
}
{
static int active_processes = 0;
active_processes++;
+ storage[simgrid::s4u::this_actor::get_pid()] = simgrid::smpi::replay::RequestStorage();
simgrid::xbt::replay_runner(*argc, *argv);
/* and now, finalize everything */
/* One active process will stop. Decrease the counter*/
- unsigned int count_requests = storage[simgrid::s4u::this_actor::get_pid() - 1].size();
+ unsigned int count_requests = storage[simgrid::s4u::this_actor::get_pid()].size();
XBT_DEBUG("There are %ud elements in reqq[*]", count_requests);
if (count_requests > 0) {
MPI_Request requests[count_requests];
MPI_Status status[count_requests];
unsigned int i=0;
- for (auto const& pair : storage[simgrid::s4u::this_actor::get_pid() - 1].get_store()) {
+ for (auto const& pair : storage[simgrid::s4u::this_actor::get_pid()].get_store()) {
requests[i] = pair.second;
i++;
}