- TRACE_smpi_comm_in(my_proc_id, "action_reducescatter",
- new simgrid::instr::VarCollTIData("reducescatter", -1, 0, nullptr, -1, args.recvcounts,
- std::to_string(args.comp_size), /* ugly hack to print comp_size */
- Datatype::encode(args.datatype1)));
-
- Colls::reduce_scatter(send_buffer(args.recv_size_sum * args.datatype1->size()),
- recv_buffer(args.recv_size_sum * args.datatype1->size()), args.recvcounts->data(),
- args.datatype1, MPI_OP_NULL, MPI_COMM_WORLD);
+ const ReduceScatterArgParser& args = get_args();
+ TRACE_smpi_comm_in(
+ get_pid(), "action_reducescatter",
+ new simgrid::instr::VarCollTIData(get_name(), -1, -1, nullptr, -1, args.recvcounts,
+ /* ugly as we use datatype field to pass computation as string */
+ /* and because of the trick to avoid getting 0.000000 when 0 is given */
+ args.comp_size == 0 ? "0" : std::to_string(args.comp_size),
+ Datatype::encode(args.datatype1)));
+
+ colls::reduce_scatter(send_buffer(args.recv_size_sum * args.datatype1->size()),
+ recv_buffer(args.recv_size_sum * args.datatype1->size()), args.recvcounts->data(),
+ args.datatype1, MPI_OP_NULL, MPI_COMM_WORLD);
+ if (args.comp_size != 0.0)
+ simgrid::s4u::this_actor::exec_init(args.comp_size)
+ ->set_name("computation")
+ ->start()
+ ->wait();
+ TRACE_smpi_comm_out(get_pid());
+}
+
+void ScanAction::kernel(simgrid::xbt::ReplayAction&)
+{
+ const ScanArgParser& args = get_args();
+ TRACE_smpi_comm_in(get_pid(), "action_scan",
+ new simgrid::instr::CollTIData(get_name(), -1, args.comp_size,
+ args.size, 0, Datatype::encode(args.datatype1), ""));
+ if (get_name() == "scan")
+ colls::scan(send_buffer(args.size * args.datatype1->size()),
+ recv_buffer(args.size * args.datatype1->size()), args.size,
+ args.datatype1, MPI_OP_NULL, MPI_COMM_WORLD);
+ else
+ colls::exscan(send_buffer(args.size * args.datatype1->size()),
+ recv_buffer(args.size * args.datatype1->size()), args.size,
+ args.datatype1, MPI_OP_NULL, MPI_COMM_WORLD);