#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
- if(!MC_is_active())
- 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 );
+ }
+
}
/**
smpi_process_data_t data = smpi_process_data();
if(data->comm_self==MPI_COMM_NULL){
MPI_Group group = smpi_group_new(1);
- data->comm_self = smpi_comm_new(group);
+ data->comm_self = smpi_comm_new(group, NULL);
smpi_group_set_mapping(group, smpi_process_index(), 0);
}
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
process_data[i]->sampling = 0;
}
group = smpi_group_new(process_count);
- MPI_COMM_WORLD = smpi_comm_new(group);
+ MPI_COMM_WORLD = smpi_comm_new(group, NULL);
MPI_UNIVERSE_SIZE = smpi_comm_size(MPI_COMM_WORLD);
for (i = 0; i < process_count; i++) {
smpi_group_set_mapping(group, i, i);
{
smpi_process_init(&argc, &argv);
user_main_();
- //xbt_die("Should not be in this smpi_simulated_main");
return 0;
}