#include <fstream>
#include <sys/stat.h>
+#if SIMGRID_HAVE_MC
+#include "src/mc/mc_config.hpp"
+#endif
+
#if SG_HAVE_SENDFILE
#include <sys/sendfile.h>
#endif
* See smpi_comm.cpp and the functions therein for details.
*/
MPI_Comm MPI_COMM_WORLD = MPI_COMM_UNINITIALIZED;
-MPI_Errhandler *MPI_ERRORS_RETURN = nullptr;
-MPI_Errhandler *MPI_ERRORS_ARE_FATAL = nullptr;
-MPI_Errhandler *MPI_ERRHANDLER_NULL = nullptr;
// No instance gets manually created; check also the smpirun.in script as
// this default name is used there as well (when the <actor> tag is generated).
static const std::string smpi_default_instance_name("smpirun");
simgrid::smpi::ActorExt* smpi_process_remote(simgrid::s4u::ActorPtr actor)
{
+ if (actor.get() == nullptr)
+ return nullptr;
return process_data.at(actor.get());
}
return smpi_process()->info_env();
}
-void smpi_process_init(int*, char***)
-{
- simgrid::smpi::ActorExt::init();
-}
-
void * smpi_process_get_user_data(){
return simgrid::s4u::Actor::self()->get_impl()->get_user_data();
}
static void smpi_check_options()
{
- //check correctness of MPI parameters
+#if SIMGRID_HAVE_MC
+ if (MC_is_active()) {
+ if (_sg_mc_buffering == "zero")
+ simgrid::config::set_value<int>("smpi/send-is-detached-thresh", 0);
+ else if (_sg_mc_buffering == "infty")
+ simgrid::config::set_value<int>("smpi/send-is-detached-thresh", INT_MAX);
+ else
+ THROW_IMPOSSIBLE;
+ }
+#endif
xbt_assert(simgrid::config::get_value<int>("smpi/async-small-thresh") <=
+ simgrid::config::get_value<int>("smpi/send-is-detached-thresh"),
+ "smpi/async-small-thresh (=%d) should be smaller or equal to smpi/send-is-detached-thresh (=%d)",
+ simgrid::config::get_value<int>("smpi/async-small-thresh"),
simgrid::config::get_value<int>("smpi/send-is-detached-thresh"));
if (simgrid::config::is_default("smpi/host-speed") && not MC_is_active()) {
return MPI_COMM_WORLD != MPI_COMM_UNINITIALIZED;
}
-void smpi_global_init()
+static void smpi_init_papi()
{
- if (not MC_is_active()) {
- global_timer = xbt_os_timer_new();
- xbt_os_walltimer_start(global_timer);
- }
-
- std::string filename = simgrid::config::get_value<std::string>("smpi/comp-adjustment-file");
- if (not filename.empty()) {
- std::ifstream fstream(filename);
- xbt_assert(fstream.is_open(), "Could not open file %s. Does it exist?", filename.c_str());
-
- std::string line;
- typedef boost::tokenizer< boost::escaped_list_separator<char>> Tokenizer;
- std::getline(fstream, line); // Skip the header line
- while (std::getline(fstream, line)) {
- Tokenizer tok(line);
- Tokenizer::iterator it = tok.begin();
- Tokenizer::iterator end = std::next(tok.begin());
-
- std::string location = *it;
- boost::trim(location);
- location2speedup.insert(std::pair<std::string, double>(location, std::stod(*end)));
- }
- }
-
#if HAVE_PAPI
// This map holds for each computation unit (such as "default" or "process1" etc.)
// the configuration as given by the user (counter data as a pair of (counter_name, counter_counter))
#endif
}
-void smpi_global_destroy()
-{
- smpi_bench_destroy();
- smpi_shared_destroy();
- smpi_deployment_cleanup_instances();
-
- if (simgrid::smpi::Colls::smpi_coll_cleanup_callback != nullptr)
- simgrid::smpi::Colls::smpi_coll_cleanup_callback();
-
- MPI_COMM_WORLD = MPI_COMM_NULL;
-
- if (not MC_is_active()) {
- xbt_os_timer_free(global_timer);
- }
-
- if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP)
- smpi_destroy_global_memory_segments();
- if(simgrid::smpi::F2C::lookup() != nullptr)
- simgrid::smpi::F2C::delete_lookup();
-}
-
static void smpi_init_options(){
// return if already called
if (smpi_cpu_threshold > -1)
args4argv->push_back(nullptr);
char** argv = args4argv->data();
- simgrid::smpi::ActorExt::init();
#if SMPI_IFORT
for_rtl_init_ (&argc, argv);
#elif SMPI_FLANG
"You may want to use sampling functions or trace replay to reduce this.");
}
}
- smpi_global_destroy();
+ SMPI_finalize();
return smpi_exit_status;
}
}
});
simgrid::s4u::Actor::on_destruction.connect([](simgrid::s4u::Actor const& actor) {
+ XBT_DEBUG("Delete the extension of actor %s", actor.get_cname());
auto it = process_data.find(&actor);
if (it != process_data.end()) {
delete it->second;
[](simgrid::s4u::Host& host) { host.extension_set(new simgrid::smpi::Host(&host)); });
smpi_init_options();
- smpi_global_init();
+ if (not MC_is_active()) {
+ global_timer = xbt_os_timer_new();
+ xbt_os_walltimer_start(global_timer);
+ }
+
+ std::string filename = simgrid::config::get_value<std::string>("smpi/comp-adjustment-file");
+ if (not filename.empty()) {
+ std::ifstream fstream(filename);
+ xbt_assert(fstream.is_open(), "Could not open file %s. Does it exist?", filename.c_str());
+
+ std::string line;
+ typedef boost::tokenizer<boost::escaped_list_separator<char>> Tokenizer;
+ std::getline(fstream, line); // Skip the header line
+ while (std::getline(fstream, line)) {
+ Tokenizer tok(line);
+ Tokenizer::iterator it = tok.begin();
+ Tokenizer::iterator end = std::next(tok.begin());
+
+ std::string location = *it;
+ boost::trim(location);
+ location2speedup.insert(std::pair<std::string, double>(location, std::stod(*end)));
+ }
+ }
+ smpi_init_papi();
smpi_check_options();
}
-void SMPI_finalize(){
- smpi_global_destroy();
+void SMPI_finalize()
+{
+ smpi_bench_destroy();
+ smpi_shared_destroy();
+ smpi_deployment_cleanup_instances();
+
+ if (simgrid::smpi::Colls::smpi_coll_cleanup_callback != nullptr)
+ simgrid::smpi::Colls::smpi_coll_cleanup_callback();
+
+ MPI_COMM_WORLD = MPI_COMM_NULL;
+
+ if (not MC_is_active()) {
+ xbt_os_timer_free(global_timer);
+ }
+
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP)
+ smpi_destroy_global_memory_segments();
+ if (simgrid::smpi::F2C::lookup() != nullptr)
+ simgrid::smpi::F2C::delete_lookup();
}
void smpi_mpi_init() {
smpi_init_fortran_types();
if(smpi_init_sleep > 0)
- simcall_process_sleep(smpi_init_sleep);
+ simgrid::s4u::this_actor::sleep_for(smpi_init_sleep);
}