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();
}
}
int smpi_enabled() {
- return not process_data.empty();
+ 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);
- if (not fstream.is_open()) {
- xbt_die("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
smpi_copy_file(libpath, target_lib, fdin_size2);
std::string sedcommand = "sed -i -e 's/" + libname + "/" + target_lib + "/g' " + target_executable;
- int ret = system(sedcommand.c_str());
- if (ret != 0)
- xbt_die("error while applying sed command %s \n", sedcommand.c_str());
+ xbt_assert(system(sedcommand.c_str()) == 0, "error while applying sed command %s \n", sedcommand.c_str());
}
}
for (const std::string& target_lib : target_libs)
unlink(target_lib.c_str());
}
- if (handle == nullptr)
- xbt_die("dlopen failed: %s (errno: %d -- %s)", dlerror(), saved_errno, strerror(saved_errno));
+ xbt_assert(handle != nullptr, "dlopen failed: %s (errno: %d -- %s)", dlerror(), saved_errno,
+ strerror(saved_errno));
+
smpi_entry_point_type entry_point = smpi_resolve_function(handle);
- if (not entry_point)
- xbt_die("Could not resolve entry point");
+ xbt_assert(entry_point, "Could not resolve entry point");
smpi_run_entry_point(entry_point, executable, args);
});
};
{
if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP)
smpi_prepare_global_memory_segment();
+
// Load the dynamic library and resolve the entry point:
void* handle = dlopen(executable.c_str(), RTLD_LAZY | RTLD_LOCAL);
- if (handle == nullptr)
- xbt_die("dlopen failed for %s: %s (errno: %d -- %s)", executable.c_str(), dlerror(), errno, strerror(errno));
+ xbt_assert(handle != nullptr, "dlopen failed for %s: %s (errno: %d -- %s)", executable.c_str(), dlerror(), errno,
+ strerror(errno));
smpi_entry_point_type entry_point = smpi_resolve_function(handle);
- if (not entry_point)
- xbt_die("main not found in %s", executable.c_str());
+ xbt_assert(entry_point, "main not found in %s", executable.c_str());
+
if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP)
smpi_backup_global_memory_segment();
"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);
}