Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Factorize code, reindent, etc.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Wed, 18 Aug 2021 19:49:57 +0000 (21:49 +0200)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Wed, 18 Aug 2021 19:50:54 +0000 (21:50 +0200)
teshsuite/smpi/replay-ti-colls/replay-ti-colls.c

index 2f4955a..4e0cb63 100644 (file)
 //exclude from clang static analysis, as there is an intentional uninitialized value passed to MPI calls.
 #ifndef __clang_analyzer__
 
+#include "mpi.h"
 #include <stdio.h>
 #include <string.h>
-#include "mpi.h"
 
+#define BUFSIZE (1024 * 1024)
+#define BOUNDED(sz) ((sz) < BUFSIZE ? (sz) : BUFSIZE)
+
+static void setup_recvbuf(int nprocs, int** recvbuf, int** displs, int** counts, int** rcounts)
+{
+  *recvbuf = malloc(BUFSIZE * nprocs * sizeof(int));
+  for (int i = 0; i < BUFSIZE * nprocs; i++)
+    (*recvbuf)[i] = i;
+
+  *displs  = malloc(nprocs * sizeof(int));
+  *counts  = malloc(nprocs * sizeof(int));
+  *rcounts = malloc(nprocs * sizeof(int));
+  for (int i = 0; i < nprocs; i++) {
+    (*displs)[i]  = i * BUFSIZE;
+    (*counts)[i]  = BOUNDED(i);
+    (*rcounts)[i] = (*counts)[i];
+  }
+}
 
-#define BUFSIZE 1024*1024
-
-int
-main (int argc, char **argv){
-  int i, nprocs = -1;
-  int rank = -1;
-  int *sendbuf, *recvbuf, *displs, *counts, *rcounts, *alltoallvcounts;
+int main(int argc, char** argv)
+{
+  int nprocs = -1;
+  int rank   = -1;
 
   /* init */
-  MPI_Init (&argc, &argv);
-  MPI_Comm_size (MPI_COMM_WORLD, &nprocs);
-  MPI_Comm_rank (MPI_COMM_WORLD, &rank);
+  MPI_Init(&argc, &argv);
+  MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
+  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 
-  sendbuf = (int *) malloc (BUFSIZE * nprocs * sizeof(int));
-  for (i = 0; i < BUFSIZE * nprocs; i++)
+  int* sendbuf = malloc(BUFSIZE * nprocs * sizeof(int));
+  for (int i = 0; i < BUFSIZE * nprocs; i++)
     sendbuf[i] = rank;
 
-  alltoallvcounts = (int *) malloc (nprocs * sizeof(int));
-  for (i = 0; i < nprocs; i++)
-    if ((i + rank) < BUFSIZE)
-      alltoallvcounts[i] = i + rank;
-    else
-      alltoallvcounts[i] = BUFSIZE;
-
-  if (rank == 0) {
-    recvbuf = (int *) malloc (BUFSIZE * nprocs * sizeof(int));
-    for (i = 0; i < BUFSIZE * nprocs; i++)
-      recvbuf[i] = i;
-
-    displs = (int *) malloc (nprocs * sizeof(int));
-    counts = (int *) malloc (nprocs * sizeof(int));
-    rcounts = (int *) malloc (nprocs * sizeof(int));
-    for (i = 0; i < nprocs; i++) {
-      displs[i] = i * BUFSIZE;
-      if (i < BUFSIZE)
-        rcounts[i] = counts[i] = i;
-      else
-        rcounts[i] = counts[i] = BUFSIZE;
-    }
-  }
-
-  //first test, with unallocated non significative buffers
-  MPI_Barrier (MPI_COMM_WORLD);
-  MPI_Bcast (sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
-  MPI_Gather (&sendbuf[rank*BUFSIZE], BUFSIZE, MPI_INT, recvbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
-  MPI_Scatter (recvbuf, BUFSIZE, MPI_INT, sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
-  MPI_Gatherv (&sendbuf[rank*BUFSIZE], (rank < BUFSIZE) ? rank : BUFSIZE, MPI_INT, recvbuf, rcounts, displs, MPI_INT, 0, MPI_COMM_WORLD);
-  MPI_Scatterv (recvbuf, counts, displs, MPI_INT, sendbuf, (rank < BUFSIZE) ? rank : BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
-  MPI_Reduce (sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
-
-  if (rank != 0) {
-    recvbuf = (int *) malloc (BUFSIZE * nprocs * sizeof(int));
-    for (i = 0; i < BUFSIZE * nprocs; i++)
-      recvbuf[i] = i;
-
-    displs = (int *) malloc (nprocs * sizeof(int));
-    counts = (int *) malloc (nprocs * sizeof(int));
-    rcounts = (int *) malloc (nprocs * sizeof(int));
-    for (i = 0; i < nprocs; i++) {
-      displs[i] = i * BUFSIZE;
-      if (i < BUFSIZE)
-        rcounts[i] = counts[i] = i;
-      else
-        rcounts[i] = counts[i] = BUFSIZE;
-    }
-  }
-
-  MPI_Barrier (MPI_COMM_WORLD);
-  MPI_Bcast (sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
-  MPI_Gather (&sendbuf[rank*BUFSIZE], BUFSIZE, MPI_INT, recvbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
-  MPI_Scatter (recvbuf, BUFSIZE, MPI_INT, sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
-  MPI_Gatherv (&sendbuf[rank*BUFSIZE], (rank < BUFSIZE) ? rank : BUFSIZE, MPI_INT, recvbuf, rcounts, displs, MPI_INT, 0, MPI_COMM_WORLD);
-  MPI_Scatterv (recvbuf, counts, displs, MPI_INT, sendbuf, (rank < BUFSIZE) ? rank : BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
-  MPI_Reduce (sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
-  MPI_Allgather (sendbuf, BUFSIZE, MPI_INT, recvbuf, BUFSIZE, MPI_INT, MPI_COMM_WORLD);
-  MPI_Alltoall (recvbuf, BUFSIZE, MPI_INT, sendbuf, BUFSIZE, MPI_INT, MPI_COMM_WORLD);
-  MPI_Allgatherv (sendbuf, (rank < BUFSIZE) ? rank : BUFSIZE, MPI_INT, recvbuf, rcounts, displs, MPI_INT, MPI_COMM_WORLD);
-  MPI_Alltoallv (recvbuf, alltoallvcounts, displs, MPI_INT, sendbuf, alltoallvcounts, displs, MPI_INT, MPI_COMM_WORLD);
-  MPI_Allreduce (sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
-  MPI_Reduce_scatter (sendbuf, recvbuf, rcounts, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
-  MPI_Scan (sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
-  MPI_Exscan (sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
-  MPI_Barrier (MPI_COMM_WORLD);
-
-  free (alltoallvcounts);
-  free (sendbuf);
-  free (recvbuf);
-  free (displs);
-  free (counts);
-  free (rcounts);
-
-  MPI_Finalize ();
+  int* alltoallvcounts = malloc(nprocs * sizeof(int));
+  for (int i = 0; i < nprocs; i++)
+    alltoallvcounts[i] = BOUNDED(i + rank);
+
+  int* recvbuf;
+  int* displs;
+  int* counts;
+  int* rcounts;
+  if (rank == 0)
+    setup_recvbuf(nprocs, &recvbuf, &displs, &counts, &rcounts);
+
+  // first test, with unallocated non significative buffers
+  MPI_Barrier(MPI_COMM_WORLD);
+  MPI_Bcast(sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Gather(&sendbuf[rank * BUFSIZE], BUFSIZE, MPI_INT, recvbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Scatter(recvbuf, BUFSIZE, MPI_INT, sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Gatherv(&sendbuf[rank * BUFSIZE], BOUNDED(rank), MPI_INT, recvbuf, rcounts, displs, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Scatterv(recvbuf, counts, displs, MPI_INT, sendbuf, BOUNDED(rank), MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Reduce(sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
+
+  if (rank != 0)
+    setup_recvbuf(nprocs, &recvbuf, &displs, &counts, &rcounts);
+
+  MPI_Barrier(MPI_COMM_WORLD);
+  MPI_Bcast(sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Gather(&sendbuf[rank * BUFSIZE], BUFSIZE, MPI_INT, recvbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Scatter(recvbuf, BUFSIZE, MPI_INT, sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Gatherv(&sendbuf[rank * BUFSIZE], BOUNDED(rank), MPI_INT, recvbuf, rcounts, displs, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Scatterv(recvbuf, counts, displs, MPI_INT, sendbuf, BOUNDED(rank), MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Reduce(sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
+  MPI_Allgather(sendbuf, BUFSIZE, MPI_INT, recvbuf, BUFSIZE, MPI_INT, MPI_COMM_WORLD);
+  MPI_Alltoall(recvbuf, BUFSIZE, MPI_INT, sendbuf, BUFSIZE, MPI_INT, MPI_COMM_WORLD);
+  MPI_Allgatherv(sendbuf, BOUNDED(rank), MPI_INT, recvbuf, rcounts, displs, MPI_INT, MPI_COMM_WORLD);
+  MPI_Alltoallv(recvbuf, alltoallvcounts, displs, MPI_INT, sendbuf, alltoallvcounts, displs, MPI_INT, MPI_COMM_WORLD);
+  MPI_Allreduce(sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
+  MPI_Reduce_scatter(sendbuf, recvbuf, rcounts, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
+  MPI_Scan(sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
+  MPI_Exscan(sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
+  MPI_Barrier(MPI_COMM_WORLD);
+
+  free(alltoallvcounts);
+  free(sendbuf);
+  free(recvbuf);
+  free(displs);
+  free(counts);
+  free(rcounts);
+
+  MPI_Finalize();
   return 0;
 }
 
-#endif
\ No newline at end of file
+#endif