Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add mpi alltoallv bruck and fix mpi alltoallv pairwise
authorPaul Bédaride <paul.bedaride@gmail.com>
Wed, 10 Apr 2013 16:25:27 +0000 (18:25 +0200)
committerPaul Bédaride <paul.bedaride@gmail.com>
Wed, 10 Apr 2013 16:25:27 +0000 (18:25 +0200)
buildtools/Cmake/AddTests.cmake
buildtools/Cmake/DefinePackages.cmake
src/smpi/colls/alltoallv-bruck.c [new file with mode: 0644]
src/smpi/colls/alltoallv-pairwise.c
src/smpi/colls/colls.h
src/smpi/smpi_pmpi.c
src/smpi/smpi_replay.c

index 59ef4d7..a231c57 100644 (file)
@@ -383,7 +383,7 @@ if(NOT enable_memcheck)
                           simple bruck basic_linear pairwise)
         ADD_TEST(smpi-alltoall-coll-${ALLTOALL_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/alltoall:${ALLTOALL_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/alltoall_coll.tesh)
     ENDFOREACH()
-    FOREACH (ALLTOALLV_COLL default pairwise)
+    FOREACH (ALLTOALLV_COLL default bruck pairwise)
         ADD_TEST(smpi-alltoallv-coll-${ALLTOALLV_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/alltoallv:${ALLTOALLV_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/alltoallv_coll.tesh)
     ENDFOREACH()
     FOREACH (BCAST_COLL default arrival_nb arrival_pattern_aware arrival_pattern_aware_wait arrival_scatter
index a387bc9..2602b59 100644 (file)
@@ -154,7 +154,8 @@ set(SMPI_SRC
   src/smpi/colls/alltoall-ring-mpi-barrier.c
   src/smpi/colls/alltoall-ring-one-barrier.c
   src/smpi/colls/alltoall-simple.c
-  src/smpi/colls/alltoallv-pairwise.c  
+  src/smpi/colls/alltoallv-pairwise.c
+  src/smpi/colls/alltoallv-bruck.c
   src/smpi/colls/bcast-arrival-nb.c
   src/smpi/colls/bcast-arrival-pattern-aware.c
   src/smpi/colls/bcast-arrival-pattern-aware-wait.c
diff --git a/src/smpi/colls/alltoallv-bruck.c b/src/smpi/colls/alltoallv-bruck.c
new file mode 100644 (file)
index 0000000..0296798
--- /dev/null
@@ -0,0 +1,70 @@
+#include "colls_private.h"
+
+/**
+ * Alltoall Bruck
+ *
+ * Openmpi calls this routine when the message size sent to each rank < 2000 bytes and size < 12
+ * FIXME: uh, check smpi_pmpi again, but this routine is called for > 12, not
+ * less...
+ **/
+int smpi_coll_tuned_alltoallv_bruck(void *sendbuf, int *sendcounts, int *senddisps,
+                                   MPI_Datatype sendtype, void *recvbuf,
+                                   int *recvcounts, int *recvdisps, MPI_Datatype recvtype,
+                                   MPI_Comm comm)
+{
+  int system_tag = 777;
+  int i, rank, size, err, count;
+  MPI_Aint lb;
+  MPI_Aint sendext = 0;
+  MPI_Aint recvext = 0;
+  MPI_Request *requests;
+
+  // FIXME: check implementation
+  rank = smpi_comm_rank(comm);
+  size = smpi_comm_size(comm);
+  XBT_DEBUG("<%d> algorithm alltoall_bruck() called.", rank);
+
+  err = smpi_datatype_extent(sendtype, &lb, &sendext);
+  err = smpi_datatype_extent(recvtype, &lb, &recvext);
+  /* Local copy from self */
+  err =
+      smpi_datatype_copy((char *)sendbuf + senddisps[rank] * sendext, 
+                         sendcounts[rank], sendtype, 
+                         (char *)recvbuf + recvdisps[rank] * recvext,
+                         recvcounts[rank], recvtype);
+  if (err == MPI_SUCCESS && size > 1) {
+    /* Initiate all send/recv to/from others. */
+    requests = xbt_new(MPI_Request, 2 * (size - 1));
+    count = 0;
+    /* Create all receives that will be posted first */
+    for (i = 0; i < size; ++i) {
+      if (i == rank) {
+        XBT_DEBUG("<%d> skip request creation [src = %d, recvcount = %d]",
+               rank, i, recvcounts[i]);
+        continue;
+      }
+      requests[count] =
+          smpi_irecv_init((char *)recvbuf + recvdisps[i] * recvext, recvcounts[i],
+                          recvtype, i, system_tag, comm);
+      count++;
+    }
+    /* Now create all sends  */
+    for (i = 0; i < size; ++i) {
+      if (i == rank) {
+        XBT_DEBUG("<%d> skip request creation [dst = %d, sendcount = %d]",
+               rank, i, sendcounts[i]);
+        continue;
+      }
+      requests[count] =
+          smpi_isend_init((char *)sendbuf + senddisps[i] * sendext, sendcounts[i],
+                          sendtype, i, system_tag, comm);
+      count++;
+    }
+    /* Wait for them all. */
+    smpi_mpi_startall(count, requests);
+    XBT_DEBUG("<%d> wait for %d requests", rank, count);
+    smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE);
+    xbt_free(requests);
+  }
+  return MPI_SUCCESS;
+}
index 30e339d..cc088b3 100644 (file)
@@ -19,9 +19,9 @@ int smpi_coll_tuned_alltoallv_pairwise(void *sendbuf, int *sendcounts, int *send
     sendto = (rank + step) % size;
     recvfrom = (rank + size - step) % size;
     /* send and receive */
-    smpi_mpi_sendrecv(&((char *) sendbuf)[senddisps[sendto] * sendsize * sendcounts[sendto]],
+    smpi_mpi_sendrecv(&((char *) sendbuf)[senddisps[sendto] * sendsize],
                       sendcounts[sendto], sendtype, sendto, system_tag,
-                      &((char *) recvbuf)[recvdisps[recvfrom] * recvsize * recvcounts[recvfrom]],
+                      &((char *) recvbuf)[recvdisps[recvfrom] * recvsize],
                       recvcounts[recvfrom], recvtype, recvfrom, system_tag, comm,
                       MPI_STATUS_IGNORE);
   }
index 5294eda..57473ea 100644 (file)
@@ -110,6 +110,7 @@ COLL_ALLTOALLS(COLL_PROTO, COLL_NOsep)
                           MPI_Comm com)
 
 #define COLL_ALLTOALLVS(action, COLL_sep) \
+COLL_APPLY(action, COLL_ALLTOALLV_SIG, bruck) COLL_sep \
 COLL_APPLY(action, COLL_ALLTOALLV_SIG, pairwise)
 
 COLL_ALLTOALLVS(COLL_PROTO, COLL_NOsep)
index b173064..378f42a 100644 (file)
@@ -1963,7 +1963,7 @@ int PMPI_Alltoallv(void *sendbuf, int *sendcounts, int *senddisps,
     retval = MPI_ERR_ARG;
   } else {
     retval =
-        smpi_coll_basic_alltoallv(sendbuf, sendcounts, senddisps, sendtype,
+        mpi_coll_alltoallv_fun(sendbuf, sendcounts, senddisps, sendtype,
                                   recvbuf, recvcounts, recvdisps, recvtype,
                                   comm);
   }
index 930239e..c2002b5 100644 (file)
@@ -563,7 +563,7 @@ static void action_allToAllv(const char *const *action) {
   TRACE_smpi_computing_out(rank);
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
 #endif
-    smpi_coll_basic_alltoallv(sendbuf, sendcounts, senddisps,  MPI_CURRENT_TYPE,
+    mpi_coll_alltoallv_fun(sendbuf, sendcounts, senddisps,     MPI_CURRENT_TYPE,
                                recvbuf, recvcounts, recvdisps, MPI_CURRENT_TYPE,
                                MPI_COMM_WORLD);
 #ifdef HAVE_TRACING