**Option** ``smpi/barrier-collectives`` **default:** off
-This option adds a simple barrier in all collectives operation to catch dangerous
-code that may or may not work depending on the MPI implementation. It is disabled
-by default, and activated by the `-analyze` flag of smpirun.
+This option adds a simple barrier in some collective operations to catch dangerous
+code that may or may not work depending on the MPI implementation: Bcast, Exscan,
+Gather, Gatherv, Scan, Scatter, Scatterv and Reduce.
For example, the following code works with OpenMPI while it deadlocks in MPICH and
-Intel MPI. It seems to mean that OpenMPI has a "fire and forget" implementation for
-Broadcast.
+Intel MPI. Broadcast seem to be "fire and forget" in OpenMPI while other
+implementations expect to receive a message.
.. code-block:: C
MPI_Bcast(buf1, buff_size, MPI_CHAR, 0, newcom);
}
+The barrier is only simulated and does not involve any additional message (it is a S4U barrier).
+This option is disabled by default, and activated by the `-analyze` flag of smpirun.
+
.. _cfg=smpi/barrier-finalization:
Add a barrier in MPI_Finalize
new simgrid::instr::CollTIData(request == MPI_REQUEST_IGNORED ? "bcast" : "ibcast", root, -1.0,
count, 0,
simgrid::smpi::Datatype::encode(datatype), ""));
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
+ if (simgrid::config::get_value<bool>("smpi/barrier-collectives") &&
+ request == MPI_REQUEST_IGNORED) // No barrier in Ibcast
smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
if (comm->size() > 1) {
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
+ if (simgrid::config::get_value<bool>("smpi/barrier-collectives") &&
+ request == MPI_REQUEST_IGNORED) // no barrier in Igather
smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
aid_t pid = simgrid::s4u::this_actor::get_pid();
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
+ if (simgrid::config::get_value<bool>("smpi/barrier-collectives") &&
+ request == MPI_REQUEST_IGNORED) // no barrier in Igatherv
smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
const void* real_sendbuf = sendbuf;
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
- smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
-
aid_t pid = simgrid::s4u::this_actor::get_pid();
TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Allgather" : "PMPI_Iallggather",
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
- smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
-
if (sendbuf == MPI_IN_PLACE) {
sendbuf = static_cast<char*>(recvbuf) + recvtype->get_extent() * displs[comm->rank()];
sendcount = recvcounts[comm->rank()];
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
+ if (simgrid::config::get_value<bool>("smpi/barrier-collectives") &&
+ request == MPI_REQUEST_IGNORED) // no barrier in Iscatter
smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
aid_t pid = simgrid::s4u::this_actor::get_pid();
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
+ if (simgrid::config::get_value<bool>("smpi/barrier-collectives") &&
+ request == MPI_REQUEST_IGNORED) // no barrier in Iscatterv
smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
aid_t pid = simgrid::s4u::this_actor::get_pid();
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
+ if (simgrid::config::get_value<bool>("smpi/barrier-collectives") &&
+ request == MPI_REQUEST_IGNORED) // no barrier in Ireduce
smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
aid_t pid = simgrid::s4u::this_actor::get_pid();
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
- smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
-
std::vector<unsigned char> tmp_sendbuf;
const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, count, datatype);
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
+ if (simgrid::config::get_value<bool>("smpi/barrier-collectives") &&
+ request == MPI_REQUEST_IGNORED) // no barrier in Iscan
smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
aid_t pid = simgrid::s4u::this_actor::get_pid();
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
+ if (simgrid::config::get_value<bool>("smpi/barrier-collectives") &&
+ request == MPI_REQUEST_IGNORED) // no barrier in Iexscan
smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
aid_t pid = simgrid::s4u::this_actor::get_pid();
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
- smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
-
aid_t pid = simgrid::s4u::this_actor::get_pid();
auto trace_recvcounts = std::make_shared<std::vector<int>>();
trace_recvcounts->insert(trace_recvcounts->end(), &recvcounts[0], &recvcounts[comm->size()]);
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
- smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
-
int count = comm->size();
aid_t pid = simgrid::s4u::this_actor::get_pid();
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
- smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
-
TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Alltoall" : "PMPI_Ialltoall",
new simgrid::instr::CollTIData(
request == MPI_REQUEST_IGNORED ? "alltoall" : "ialltoall", -1, -1.0,
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
- smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
-
int send_size = 0;
int recv_size = 0;
auto trace_sendcounts = std::make_shared<std::vector<int>>();
const SmpiBenchGuard suspend_bench;
- if (simgrid::config::get_value<bool>("smpi/barrier-collectives"))
- smpi_deployment_startup_barrier(smpi_process()->get_instance_id());
-
int send_size = 0;
int recv_size = 0;
auto trace_sendcounts = std::make_shared<std::vector<int>>();