-/* Copyright (c) 2008-2022. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2008-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 "smpi_config.hpp"
-#include "include/xbt/config.hpp"
-#include "mc/mc.h"
+
+#if defined(_GNU_SOURCE)
+ #define DEFINED_GNUSOURCE 1
+#else
+ #define _GNU_SOURCE
+#endif
+
+#if defined(__linux__)
+ #include <features.h>
+//inspired by https://stackoverflow.com/a/70211227
+ #if not defined(__USE_GNU)
+ #define __MUSL__
+ #endif
+#endif
+
+#ifndef DEFINED_GNUSOURCE
+ #undef _GNU_SOURCE
+#endif
+
#include "private.hpp"
#include "smpi_coll.hpp"
+#include "smpi_config.hpp"
+#include "src/mc/mc.h"
+#include "xbt/config.hpp"
#include "xbt/ex.h"
#include "xbt/parse_units.hpp"
#include <boost/algorithm/string.hpp> /* trim */
#include <boost/tokenizer.hpp>
-#if SIMGRID_HAVE_MC
#include "src/mc/mc_config.hpp"
-#endif
+#include "src/mc/mc_replay.hpp"
#if defined(__APPLE__)
# include <AvailabilityMacros.h>
# ifndef MAC_OS_X_VERSION_10_12
# define MAC_OS_X_VERSION_10_12 101200
# endif
-constexpr bool HAVE_WORKING_MMAP = (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12);
-#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__sun) || defined(__HAIKU__)
+# ifndef __MAC_11_0
+# define __MAC_11_0 110000
+# endif
+
+constexpr bool HAVE_WORKING_MMAP = ((MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12) && (MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_11_0));
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__sun) || defined(__HAIKU__) || defined(__MUSL__)
constexpr bool HAVE_WORKING_MMAP = false;
#else
constexpr bool HAVE_WORKING_MMAP = true;
[](const std::string& str) {
_smpi_cfg_host_speed = xbt_parse_get_speed("smpi/host-speed", 1, str, "option smpi/host-speed");
xbt_assert(_smpi_cfg_host_speed > 0.0, "Invalid value (%s) for 'smpi/host-speed': it must be positive.",
- _smpi_cfg_host_speed_string.get().c_str());
+ str.c_str());
}};
simgrid::config::Flag<bool> _smpi_cfg_simulate_computation{
auto end = std::next(tok.begin());
std::string location = *it;
boost::trim(location);
- location2speedup.insert(std::pair<std::string, double>(location, std::stod(*end)));
+ location2speedup.try_emplace(location, std::stod(*end));
}
}
}};
simgrid::config::Flag<bool> _smpi_cfg_default_errhandler_is_error{
"smpi/errors-are-fatal", "Whether MPI errors are fatal or just return. Default is true", true };
simgrid::config::Flag<bool> _smpi_cfg_pedantic{
- "smpi/pedantic", "Activate extra checks that may crash slightly incorrect codes which would not crash on actual implementations", true };
+ "smpi/pedantic", "Activate extra checks that may crash slightly incorrect codes which would not crash on actual implementations", false };
simgrid::config::Flag<double> _smpi_init_sleep(
"smpi/init", "Time to inject inside a call to MPI_Init", 0.0);
#if HAVE_PAPI
simgrid::config::declare_flag<std::string>(
"smpi/privatization", "How we should privatize global variable at runtime (no, yes, mmap, dlopen).",
default_privatization, [](const std::string& smpi_privatize_option) {
- if (smpi_privatize_option == "no" || smpi_privatize_option == "0")
+ if (smpi_privatize_option == "no" || smpi_privatize_option == "0" || smpi_privatize_option == "OFF")
_smpi_cfg_privatization = SmpiPrivStrategies::NONE;
- else if (smpi_privatize_option == "yes" || smpi_privatize_option == "1")
+ else if (smpi_privatize_option == "yes" || smpi_privatize_option == "1" || smpi_privatize_option == "ON")
_smpi_cfg_privatization = SmpiPrivStrategies::DEFAULT;
else if (smpi_privatize_option == "mmap")
_smpi_cfg_privatization = SmpiPrivStrategies::MMAP;
simgrid::config::declare_flag<std::string>(
"smpi/or", "Small messages timings (MPI_Recv minimum time for small messages)", "0:0:0:0:0");
- simgrid::config::declare_flag<bool>("smpi/finalization-barrier", "Do we add a barrier in MPI_Finalize or not", false);
+ simgrid::config::declare_flag<bool>("smpi/barrier-finalization", {"smpi/finalization-barrier"},
+ "Do we add a barrier in MPI_Finalize or not", false);
+ simgrid::config::declare_flag<bool>("smpi/barrier-collectives",
+ "Inject a barrier in each colllective operation, to detect some deadlocks in "
+ "incorrect MPI codes, which may not be triggered in all cases",
+ false);
smpi_options_initialized = true;
}
void smpi_check_options()
{
-#if SIMGRID_HAVE_MC
- if (MC_is_active()) {
+ if (MC_is_active() || MC_record_replay_is_active()) {
if (_sg_mc_buffering == "zero")
simgrid::config::set_value<int>("smpi/send-is-detached-thresh", 0);
else if (_sg_mc_buffering == "infty")
else
THROW_IMPOSSIBLE;
}
-#endif
xbt_assert(smpi_cfg_async_small_thresh() <= smpi_cfg_detached_send_thresh(),
"smpi/async-small-thresh (=%d) should be smaller or equal to smpi/send-is-detached-thresh (=%d)",
simgrid::smpi::colls::set_collectives();
simgrid::smpi::colls::smpi_coll_cleanup_callback = nullptr;
}
-