#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"
"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);
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
}
#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 */
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();
errno = EFAULT;
return -1;
}
- if (not smpi_process())
+ 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();
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);