#include "private.h"
#include "smpi_mpi_dt_private.h"
#include "mc/mc.h"
+#include "xbt/replay.h"
#include "surf/surf.h"
#include "simix/smx_private.h"
#include "simgrid/sg_config.h"
simcall_rdv_set_receiver(data->mailbox_small, proc);
XBT_DEBUG("<%d> New process in the game: %p", index, proc);
}
+ if (smpi_process_data() == NULL)
+ xbt_die("smpi_process_data() returned NULL. You probably gave a NULL parameter to MPI_Init. Although it's required by MPI-2, this is currently not supported by SMPI.");
}
void smpi_process_destroy(void)
*/
void smpi_process_finalize(void)
{
- // wait for all pending asynchronous comms to finish
- while (SIMIX_process_has_pending_comms(SIMIX_process_self())) {
- simcall_process_sleep(0.01);
+ int i;
+ int size = smpi_comm_size(MPI_COMM_WORLD);
+ int rank = smpi_comm_rank(MPI_COMM_WORLD);
+ /* All non-root send & receive zero-length message. */
+ if (rank > 0) {
+ smpi_mpi_ssend (NULL, 0, MPI_BYTE, 0,
+ COLL_TAG_BARRIER,
+ MPI_COMM_WORLD);
+ smpi_mpi_recv (NULL, 0, MPI_BYTE, 0,
+ COLL_TAG_BARRIER,
+ MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
+ /* The root collects and broadcasts the messages. */
+ else {
+ MPI_Request* requests;
+ requests = (MPI_Request*)malloc( size * sizeof(MPI_Request) );
+ for (i = 1; i < size; ++i) {
+ requests[i] = smpi_mpi_irecv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE,
+ COLL_TAG_BARRIER, MPI_COMM_WORLD
+ );
+ }
+ smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE );
+ for (i = 1; i < size; ++i) {
+ requests[i] = smpi_mpi_issend(NULL, 0, MPI_BYTE, i,
+ COLL_TAG_BARRIER,
+ MPI_COMM_WORLD
+ );
+ }
+ smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE );
+ free( requests );
+ }
+
}
/**
void *buff, size_t buff_size)
{
XBT_DEBUG("Copy the data over");
+ if(_xbt_replay_is_active()) return;
memcpy(comm->comm.dst_buff, buff, buff_size);
if (comm->comm.detached) {
// if this is a detached send, the source buffer was duplicated by SMPI
{
smpi_process_init(&argc, &argv);
user_main_();
- //xbt_die("Should not be in this smpi_simulated_main");
return 0;
}