#include <simgrid/smpi/smpi_replay.hpp>
#include <src/smpi/include/private.hpp>
+#include <cmath>
+#include <limits>
#include <memory>
#include <numeric>
+#include <tuple>
#include <unordered_map>
#include <vector>
-#include <tuple>
-
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_replay, smpi, "Trace Replay with SMPI");
// From https://stackoverflow.com/questions/7110301/generic-hash-for-tuples-in-unordered-map-unordered-set
/* Helper function */
static double parse_double(const std::string& string)
{
- return xbt_str_parse_double(string.c_str(), "%s is not a double");
+ return xbt_str_parse_double(string.c_str(), "not a double");
}
namespace simgrid {
void ReduceArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string&)
{
CHECK_ACTION_PARAMS(action, 2, 2)
- comm_size = parse_double(action[2]);
+ double arg2 = trunc(parse_double(action[2]));
+ xbt_assert(0.0 <= arg2 && arg2 <= static_cast<double>(std::numeric_limits<unsigned>::max()));
+ comm_size = static_cast<unsigned>(arg2);
comp_size = parse_double(action[3]);
root = (action.size() > 4) ? std::stoi(action[4]) : 0;
if (action.size() > 5)
void AllReduceArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string&)
{
CHECK_ACTION_PARAMS(action, 2, 1)
- comm_size = parse_double(action[2]);
+ double arg2 = trunc(parse_double(action[2]));
+ xbt_assert(0.0 <= arg2 && arg2 <= static_cast<double>(std::numeric_limits<unsigned>::max()));
+ comm_size = static_cast<unsigned>(arg2);
comp_size = parse_double(action[3]);
if (action.size() > 4)
datatype1 = simgrid::smpi::Datatype::decode(action[4]);
Datatype::encode(args.datatype1),
Datatype::encode(args.datatype2)));
- colls::alltoall(send_buffer(args.send_size * args.comm_size * args.datatype1->size()), args.send_size, args.datatype1,
- recv_buffer(args.recv_size * args.comm_size * args.datatype2->size()), args.recv_size, args.datatype2,
+ colls::alltoall(send_buffer(args.datatype1->size() * args.send_size * args.comm_size), args.send_size, args.datatype1,
+ recv_buffer(args.datatype2->size() * args.recv_size * args.comm_size), args.recv_size, args.datatype2,
MPI_COMM_WORLD);
TRACE_smpi_comm_out(get_pid());
if (get_name() == "gather") {
int rank = MPI_COMM_WORLD->rank();
colls::gather(send_buffer(args.send_size * args.datatype1->size()), args.send_size, args.datatype1,
- (rank == args.root) ? recv_buffer(args.recv_size * args.comm_size * args.datatype2->size()) : nullptr,
+ (rank == args.root) ? recv_buffer(args.datatype2->size() * args.recv_size * args.comm_size) : nullptr,
args.recv_size, args.datatype2, args.root, MPI_COMM_WORLD);
} else
colls::allgather(send_buffer(args.send_size * args.datatype1->size()), args.send_size, args.datatype1,
/* and now, finalize everything */
/* One active process will stop. Decrease the counter*/
unsigned int count_requests = storage[simgrid::s4u::this_actor::get_pid()].size();
- XBT_DEBUG("There are %ud elements in reqq[*]", count_requests);
+ XBT_DEBUG("There are %u elements in reqq[*]", count_requests);
if (count_requests > 0) {
std::vector<MPI_Request> requests(count_requests);
unsigned int i=0;