]> AND Public Git Repository - simgrid.git/blobdiff - src/smpi/smpi_global.c
Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'mc++' into mc-merge
[simgrid.git] / src / smpi / smpi_global.c
index 0339c33323aa0b9ee343ff01bdcfb3836d78190b..e90b83a11c3f9855b39c28a56a92664cbac4ca91 100644 (file)
@@ -7,6 +7,7 @@
 #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"
@@ -99,10 +100,38 @@ 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 );
+  }
+
 }
 
 /**
@@ -290,6 +319,7 @@ static void smpi_comm_copy_buffer_callback(smx_action_t comm,
                                            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
@@ -389,7 +419,6 @@ int __attribute__ ((weak)) smpi_simulated_main_(int argc, char **argv)
 {
   smpi_process_init(&argc, &argv);
   user_main_();
-  //xbt_die("Should not be in this smpi_simulated_main");
   return 0;
 }