-/* Copyright (c) 2007-2020. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2007-2021. 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 "simgrid/modelchecker.h"
#include "simgrid/s4u/Exec.hpp"
#include "smpi_comm.hpp"
+#include "smpi_utils.hpp"
#include "src/internal_config.h"
#include "src/mc/mc_replay.hpp"
#include "xbt/config.hpp"
#ifndef WIN32
#include <sys/mman.h>
#endif
+#include <cerrno>
#include <cmath>
#if HAVE_PAPI
"Minimum time to inject inside a call to MPI_Wtime(), gettimeofday() and clock_gettime()",
1e-8 /* Documented to be 10 ns */);
-double smpi_total_benched_time = 0;
-
// Private execute_flops used by smpi_execute and smpi_execute_benched
void private_execute_flops(double flops) {
xbt_assert(flops >= 0, "You're trying to execute a negative amount of flops (%f)!", flops);
void smpi_execute_benched(double duration)
{
smpi_bench_end();
- double speed = sg_host_speed(sg_host_self());
+ double speed = sg_host_get_speed(sg_host_self());
smpi_execute_flops(duration*speed);
smpi_bench_begin();
}
if (not smpi_cfg_papi_events_file().empty()) {
int event_set = smpi_process()->papi_event_set();
// PAPI_start sets everything to 0! See man(3) PAPI_start
- if (PAPI_LOW_LEVEL_INITED == PAPI_is_initialized() && PAPI_start(event_set) != PAPI_OK) {
- // TODO This needs some proper handling.
- XBT_CRITICAL("Could not start PAPI counters.\n");
- xbt_die("Error.");
- }
+ if (PAPI_LOW_LEVEL_INITED == PAPI_is_initialized() && event_set)
+ xbt_assert(PAPI_start(event_set) == PAPI_OK,
+ "Could not start PAPI counters (TODO: this needs some proper handling).");
}
#endif
xbt_os_threadtimer_start(smpi_process()->timer());
int event_set = smpi_process()->papi_event_set();
std::vector<long long> event_values(counter_data.size());
- if (PAPI_stop(event_set, &event_values[0]) != PAPI_OK) { // Error
- XBT_CRITICAL("Could not stop PAPI counters.\n");
- xbt_die("Error.");
- } else {
- for (unsigned int i = 0; i < counter_data.size(); i++) {
- counter_data[i].second += event_values[i];
- }
- }
+ if (event_set)
+ xbt_assert(PAPI_stop(event_set, &event_values[0]) == PAPI_OK, "Could not stop PAPI counters.");
+ for (unsigned int i = 0; i < counter_data.size(); i++)
+ counter_data[i].second += event_values[i];
}
#endif
if (smpi_process()->sampling()) {
XBT_CRITICAL("Cannot do recursive benchmarks.");
- XBT_CRITICAL("Are you trying to make a call to MPI within a SMPI_SAMPLE_ block?");
+ XBT_CRITICAL("Are you trying to make a call to MPI within an SMPI_SAMPLE_ block?");
xbt_backtrace_display_current();
xbt_die("Aborting.");
}
#if HAVE_PAPI
if (not smpi_cfg_papi_events_file().empty() && TRACE_smpi_is_enabled()) {
- const simgrid::instr::Container* container =
+ simgrid::instr::Container* container =
simgrid::instr::Container::by_name(std::string("rank-") + std::to_string(simgrid::s4u::this_actor::get_pid()));
const papi_counter_t& counter_data = smpi_process()->papi_counters();
for (auto const& pair : counter_data) {
- auto* variable = static_cast<simgrid::instr::VariableType*>(container->type_->by_name(pair.first));
- variable->set_event(SIMIX_get_clock(), pair.second);
+ container->get_variable(pair.first)->set_event(SIMIX_get_clock(), pair.second);
}
}
#endif
- smpi_total_benched_time += xbt_os_timer_elapsed(timer);
+ simgrid::smpi::utils::add_benched_time(xbt_os_timer_elapsed(timer));
}
/* Private sleep function used by smpi_sleep(), smpi_usleep() and friends */
smpi_bench_end();
XBT_DEBUG("Sleep for: %lf secs", secs);
- int rank = simgrid::s4u::this_actor::get_pid();
- TRACE_smpi_sleeping_in(rank, secs);
+ aid_t pid = simgrid::s4u::this_actor::get_pid();
+ TRACE_smpi_sleeping_in(pid, secs);
simgrid::s4u::this_actor::sleep_for(secs);
- TRACE_smpi_sleeping_out(rank);
+ TRACE_smpi_sleeping_out(pid);
smpi_bench_begin();
return 0;
int smpi_gettimeofday(struct timeval* tv, struct timezone* tz)
{
- if (not smpi_process())
+ if (not smpi_process()->initialized() || smpi_process()->finalized() || smpi_process()->sampling())
return gettimeofday(tv, tz);
smpi_bench_end();
#if _POSIX_TIMERS > 0
int smpi_clock_gettime(clockid_t clk_id, struct timespec* tp)
{
- if (not smpi_process())
+ if (not tp) {
+ errno = EFAULT;
+ return -1;
+ }
+ if (not smpi_process()->initialized() || smpi_process()->finalized() || smpi_process()->sampling())
return clock_gettime(clk_id, tp);
//there is only one time in SMPI, so clk_id is ignored.
smpi_bench_end();
double now = SIMIX_get_clock();
- if (tp) {
- tp->tv_sec = static_cast<time_t>(now);
- tp->tv_nsec = static_cast<long int>((now - tp->tv_sec) * 1e9);
- }
+ tp->tv_sec = static_cast<time_t>(now);
+ tp->tv_nsec = static_cast<long int>((now - tp->tv_sec) * 1e9);
if (smpi_wtime_sleep > 0)
simgrid::s4u::this_actor::sleep_for(smpi_wtime_sleep);
smpi_bench_begin();
XBT_DEBUG("sample2 %s %d", loc.c_str(), iter_count);
auto sample = samples.find(loc);
- if (sample == samples.end())
- xbt_die("Y U NO use SMPI_SAMPLE_* macros? Stop messing directly with smpi_sample_* functions!");
+ xbt_assert(sample != samples.end(),
+ "Y U NO use SMPI_SAMPLE_* macros? Stop messing directly with smpi_sample_* functions!");
const LocalData& data = sample->second;
if (data.benching) {
XBT_DEBUG("sample3 %s", loc.c_str());
auto sample = samples.find(loc);
- if (sample == samples.end())
- xbt_die("Y U NO use SMPI_SAMPLE_* macros? Stop messing directly with smpi_sample_* functions!");
+ xbt_assert(sample != samples.end(),
+ "Y U NO use SMPI_SAMPLE_* macros? Stop messing directly with smpi_sample_* functions!");
LocalData& data = sample->second;
if (not data.benching)
XBT_DEBUG("sample exit %s", loc.c_str());
auto sample = samples.find(loc);
- if (sample == samples.end())
- xbt_die("Y U NO use SMPI_SAMPLE_* macros? Stop messing directly with smpi_sample_* functions!");
-
+ xbt_assert(sample != samples.end(),
+ "Y U NO use SMPI_SAMPLE_* macros? Stop messing directly with smpi_sample_* functions!");
+
if (smpi_process()->sampling()){//end of loop, but still sampling needed
const LocalData& data = sample->second;
smpi_process()->set_sampling(0);