#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
std::unordered_map<std::string, double> location2speedup;
-static std::map</*process_id*/ simgrid::s4u::Actor const*, simgrid::smpi::ActorExt*> process_data;
static int smpi_exit_status = 0;
extern double smpi_total_benched_time;
xbt_os_timer_t global_timer;
* 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");
if (me == nullptr) // This happens sometimes (eg, when linking against NS3 because it pulls openMPI...)
return nullptr;
- return process_data.at(me.get());
+ return me->extension<simgrid::smpi::ActorExt>();
}
simgrid::smpi::ActorExt* smpi_process_remote(simgrid::s4u::ActorPtr actor)
{
if (actor.get() == nullptr)
return nullptr;
- return process_data.at(actor.get());
+ return actor->extension<simgrid::smpi::ActorExt>();
}
MPI_Comm smpi_process_comm_self(){
}
void * smpi_process_get_user_data(){
- return simgrid::s4u::Actor::self()->get_impl()->get_user_data();
+ return simgrid::s4u::Actor::self()->get_data();
}
void smpi_process_set_user_data(void *data){
- simgrid::s4u::Actor::self()->get_impl()->set_user_data(data);
+ simgrid::s4u::Actor::self()->set_data(data);
}
void smpi_comm_set_copy_data_callback(void (*callback) (smx_activity_t, void*, size_t))
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()) {
TRACE_global_init();
SIMIX_global_init(&argc, argv);
+ auto engine = simgrid::s4u::Engine::get_instance();
SMPI_switch_data_segment = &smpi_switch_data_segment;
sg_storage_file_system_init();
// parse the platform file: get the host list
- simgrid::s4u::Engine::get_instance()->load_platform(argv[1]);
+ engine->load_platform(argv[1]);
SIMIX_comm_set_copy_data_callback(smpi_comm_copy_buffer_callback);
smpi_init_options();
smpi_init_privatization_no_dlopen(executable);
SMPI_init();
- simgrid::s4u::Engine::get_instance()->load_deployment(argv[2]);
- SMPI_app_instance_register(smpi_default_instance_name.c_str(), nullptr,
- process_data.size()); // This call has a side effect on process_count...
+
+ /* This is a ... heavy way to count the MPI ranks */
+ int rank_counts = 0;
+ simgrid::s4u::Actor::on_creation.connect([&rank_counts](simgrid::s4u::Actor& actor) {
+ if (not actor.is_daemon())
+ rank_counts++;
+ });
+ engine->load_deployment(argv[2]);
+
+ SMPI_app_instance_register(smpi_default_instance_name.c_str(), nullptr, rank_counts);
MPI_COMM_WORLD = *smpi_deployment_comm_world(smpi_default_instance_name);
/* Clean IO before the run */
// Called either directly from the user code, or from the code called by smpirun
void SMPI_init(){
simgrid::s4u::Actor::on_creation.connect([](simgrid::s4u::Actor& actor) {
- if (not actor.is_daemon()) {
- process_data.insert({&actor, new simgrid::smpi::ActorExt(&actor)});
- }
- });
- 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;
- process_data.erase(it);
- }
+ if (not actor.is_daemon())
+ actor.extension_set<simgrid::smpi::ActorExt>(new simgrid::smpi::ActorExt(&actor));
});
simgrid::s4u::Host::on_creation.connect(
[](simgrid::s4u::Host& host) { host.extension_set(new simgrid::smpi::Host(&host)); });
+ for (auto const& host : simgrid::s4u::Engine::get_instance()->get_all_hosts())
+ host->extension_set(new simgrid::smpi::Host(host));
smpi_init_options();
if (not MC_is_active()) {
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);
}