X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/dbf5a46e507e90f9cb5176dd07cac0f3798c14d9..036c801d55e3ab07b470c79640109080fed049a1:/teshsuite/smpi/replay-ti-colls/replay-ti-colls.c diff --git a/teshsuite/smpi/replay-ti-colls/replay-ti-colls.c b/teshsuite/smpi/replay-ti-colls/replay-ti-colls.c index 2f4955ad67..c14b802d10 100644 --- a/teshsuite/smpi/replay-ti-colls/replay-ti-colls.c +++ b/teshsuite/smpi/replay-ti-colls/replay-ti-colls.c @@ -1,104 +1,90 @@ -//exclude from clang static analysis, as there is an intentional uninitialized value passed to MPI calls. -#ifndef __clang_analyzer__ - +#include "mpi.h" #include #include -#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 = xbt_malloc(BUFSIZE * nprocs * sizeof(int)); + for (int i = 0; i < BUFSIZE * nprocs; i++) + (*recvbuf)[i] = i; + + *displs = xbt_malloc(nprocs * sizeof(int)); + *counts = xbt_malloc(nprocs * sizeof(int)); + *rcounts = xbt_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 = xbt_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 = xbt_malloc(nprocs * sizeof(int)); + for (int i = 0; i < nprocs; i++) + alltoallvcounts[i] = BOUNDED(i + rank); + + int* dummy_buffer = xbt_malloc(sizeof(int)); + // initialize buffers with an invalid value (we want to trigger a valgrind error if they are used) + int* recvbuf = dummy_buffer + 1; + int* displs = dummy_buffer + 1; + int* counts = dummy_buffer + 1; + int* rcounts = dummy_buffer + 1; + 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); + + xbt_free(dummy_buffer); + 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); + + xbt_free(alltoallvcounts); + xbt_free(sendbuf); + xbt_free(recvbuf); + xbt_free(displs); + xbt_free(counts); + xbt_free(rcounts); + + MPI_Finalize(); return 0; } - -#endif \ No newline at end of file