-/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2007-2023. 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.hpp"
+#include "simgrid/host.h"
#include "simgrid/instr.h"
#include "simgrid/s4u/Engine.hpp"
#include "simgrid/s4u/Host.hpp"
#include "simgrid/version.h"
+#include "smpi_coll.hpp"
#include "smpi_comm.hpp"
#include "smpi_datatype_derived.hpp"
#include "smpi_status.hpp"
+#include "src/kernel/EngineImpl.hpp"
#include "src/kernel/actor/ActorImpl.hpp"
#include "src/smpi/include/smpi_actor.hpp"
void TRACE_smpi_set_category(const char *category)
{
//need to end bench otherwise categories for execution tasks are wrong
- smpi_bench_end();
+ const SmpiBenchGuard suspend_bench;
+
if (category != nullptr) {
// declare category
- TRACE_category(category);
+ simgrid::instr::declare_tracing_category(category);
smpi_process()->set_tracing_category(category);
}
- //begin bench after changing process's category
- smpi_bench_begin();
}
/* PMPI User level calls */
}
simgrid::smpi::ActorExt::init();
- int rank_traced = simgrid::s4u::this_actor::get_pid();
- TRACE_smpi_init(rank_traced, __func__);
+ TRACE_smpi_init(simgrid::s4u::this_actor::get_pid(), __func__);
+ smpi_mpi_init();
smpi_bench_begin();
smpi_process()->mark_as_initialized();
- smpi_mpi_init();
+ CHECK_COLLECTIVE(smpi_process()->comm_world(), "MPI_Init")
return MPI_SUCCESS;
}
int PMPI_Finalize()
{
smpi_bench_end();
- int rank_traced = simgrid::s4u::this_actor::get_pid();
+ CHECK_COLLECTIVE(smpi_process()->comm_world(), "MPI_Finalize")
+ aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
+ smpi_process()->mark_as_finalizing();
TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::NoOpTIData("finalize"));
+ if (simgrid::config::get_value<bool>("smpi/barrier-finalization"))
+ simgrid::smpi::colls::barrier(MPI_COMM_WORLD);
+
smpi_process()->finalize();
TRACE_smpi_comm_out(rank_traced);
}
int PMPI_Get_library_version (char *version,int *len){
- snprintf(version, MPI_MAX_LIBRARY_VERSION_STRING, "SMPI Version %d.%d. Copyright The SimGrid Team 2007-2021",
+ snprintf(version, MPI_MAX_LIBRARY_VERSION_STRING, "SMPI Version %d.%d. Copyright The SimGrid Team 2007-2023",
SIMGRID_VERSION_MAJOR, SIMGRID_VERSION_MINOR);
- *len = strlen(version) > MPI_MAX_LIBRARY_VERSION_STRING ? MPI_MAX_LIBRARY_VERSION_STRING : strlen(version);
+ *len = std::min(static_cast<int>(strlen(version)), MPI_MAX_LIBRARY_VERSION_STRING);
return MPI_SUCCESS;
}
smpi_bench_end();
CHECK_COMM(1)
XBT_WARN("MPI_Abort was called, something went probably wrong in this simulation ! Killing all processes sharing the same MPI_COMM_WORLD");
- smx_actor_t myself = SIMIX_process_self();
+ auto myself = simgrid::kernel::actor::ActorImpl::self();
for (int i = 0; i < comm->size(); i++){
- smx_actor_t actor = simgrid::kernel::actor::ActorImpl::by_pid(comm->group()->actor(i));
+ auto actor = simgrid::kernel::EngineImpl::get_instance()->get_actor_by_pid(comm->group()->actor(i));
if (actor != nullptr && actor != myself)
- simgrid::kernel::actor::simcall([actor] { actor->exit(); });
+ simgrid::kernel::actor::simcall_answered([actor] { actor->exit(); });
}
// now ourself
- simgrid::kernel::actor::simcall([myself] { myself->exit(); });
+ simgrid::kernel::actor::simcall_answered([myself] { myself->exit(); });
return MPI_SUCCESS;
}
return smpi_mpi_wtime();
}
-extern double sg_maxmin_precision;
+extern double sg_surf_precision;
double PMPI_Wtick()
{
- return sg_maxmin_precision;
+ return sg_surf_precision;
}
int PMPI_Address(const void* location, MPI_Aint* address)
int PMPI_Get_processor_name(char *name, int *resultlen)
{
- int len = std::min<int>(sg_host_self()->get_name().size(), MPI_MAX_PROCESSOR_NAME - 1);
- std::string(sg_host_self()->get_name()).copy(name, len);
+ int len = std::min(static_cast<int>(sg_host_self()->get_name().size()), MPI_MAX_PROCESSOR_NAME - 1);
+ sg_host_self()->get_name().copy(name, len);
name[len] = '\0';
*resultlen = len;
} else if (not datatype->is_valid()) {
return MPI_ERR_TYPE;
} else {
- size_t size = datatype->size();
- if (size == 0) {
+ if (datatype->size() == 0) {
*count = 0;
- } else if (status->count % size != 0) {
+ } else if (status->count % datatype->size() != 0) {
*count = MPI_UNDEFINED;
} else {
*count = simgrid::smpi::Status::get_count(status, datatype);