#include <memory>
#include <numeric>
#include <unordered_map>
+#include <sstream>
#include <vector>
using simgrid::s4u::Actor;
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_replay,smpi,"Trace Replay with SMPI");
-static int active_processes = 0;
static std::unordered_map<int, std::vector<MPI_Request>*> reqq;
static MPI_Datatype MPI_DEFAULT_TYPE;
#define CHECK_ACTION_PARAMS(action, mandatory, optional) \
{ \
- if (action.size() < static_cast<unsigned long>(mandatory + 2)) \
+ if (action.size() < static_cast<unsigned long>(mandatory + 2)) { \
+ std::stringstream ss; \
+ for (const auto& elem : action) { \
+ ss << elem << " "; \
+ } \
THROWF(arg_error, 0, "%s replay failed.\n" \
"%zu items were given on the line. First two should be process_id and action. " \
"This action needs after them %lu mandatory arguments, and accepts %lu optional ones. \n" \
+ "The full line that was given is:\n %s\n" \
"Please contact the Simgrid team if support is needed", \
- __func__, action.size(), static_cast<unsigned long>(mandatory), static_cast<unsigned long>(optional)); \
+ __func__, action.size(), static_cast<unsigned long>(mandatory), static_cast<unsigned long>(optional), ss.str().c_str()); \
+ }\
}
static void log_timed_action(simgrid::xbt::ReplayAction& action, double clock)
/* start a simulated timer */
smpi_process()->simulated_start();
- /*initialize the number of active processes */
- active_processes = smpi_process_count();
-
set_reqq_self(new std::vector<MPI_Request>);
}
};
/** @brief actually run the replay after initialization */
void smpi_replay_main(int* argc, char*** argv)
{
+ static int active_processes = 0;
+ active_processes++;
simgrid::xbt::replay_runner(*argc, *argv);
/* and now, finalize everything */