Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add gatherv test
authorAugustin Degomme <adegomme@users.noreply.github.com>
Fri, 17 Nov 2023 18:15:09 +0000 (19:15 +0100)
committerAugustin Degomme <adegomme@users.noreply.github.com>
Fri, 17 Nov 2023 18:15:09 +0000 (19:15 +0100)
teshsuite/smpi/mpich3-test/coll/CMakeLists.txt
teshsuite/smpi/mpich3-test/coll/gatherv.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/coll/testlist

index c07450a..5b8561d 100644 (file)
@@ -11,7 +11,7 @@ if(enable_smpi AND enable_testsuite_smpi_MPICH3)
           allred2 allred3 allred4 allred5 allred6 allredmany alltoall1
           alltoallv0 alltoallv alltoallw1 alltoallw2 alltoallw_zeros
           bcasttest bcastzerotype coll2 coll3 coll4 coll5 coll6 coll7 coll8
-          coll9 coll10 coll11 coll12 coll13 exscan exscan2 gather gather2
+          coll9 coll10 coll11 coll12 coll13 exscan exscan2 gather gather2 gatherv
           gather_big ibarrier longuser nonblocking nonblocking2 nonblocking3 iallred
         # icallgather icallgatherv icallreduce
         # icalltoall icalltoallv icalltoallw icbarrier icbcast
@@ -120,6 +120,7 @@ set(examples_src  ${examples_src}
  ${CMAKE_CURRENT_SOURCE_DIR}/gather2.c
  ${CMAKE_CURRENT_SOURCE_DIR}/gather_big.c
  ${CMAKE_CURRENT_SOURCE_DIR}/gather.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/gatherv.c
  ${CMAKE_CURRENT_SOURCE_DIR}/iallred.c
  ${CMAKE_CURRENT_SOURCE_DIR}/ibarrier.c
  ${CMAKE_CURRENT_SOURCE_DIR}/icallgather.c
diff --git a/teshsuite/smpi/mpich3-test/coll/gatherv.c b/teshsuite/smpi/mpich3-test/coll/gatherv.c
new file mode 100644 (file)
index 0000000..6423f35
--- /dev/null
@@ -0,0 +1,90 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *  (C) 2001 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "mpitest.h"
+
+#define MAX_PROCESSES 10
+
+int main(int argc, char **argv)
+{
+    int rank, size, i, j;
+    int table[MAX_PROCESSES][MAX_PROCESSES];
+    int errors = 0;
+    int participants;
+    int displs[MAX_PROCESSES];
+    int recv_counts[MAX_PROCESSES];
+
+    MTest_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    /* A maximum of MAX_PROCESSES processes can participate */
+    if (size > MAX_PROCESSES)
+        participants = MAX_PROCESSES;
+    else
+        participants = size;
+    /* while (MAX_PROCESSES % participants) participants--; */
+    if (MAX_PROCESSES % participants) {
+        fprintf(stderr, "Number of processors must divide %d\n", MAX_PROCESSES);
+        MPI_Abort(MPI_COMM_WORLD, 1);
+    }
+    if ((rank < participants)) {
+
+        /* Determine what rows are my responsibility */
+        int block_size = MAX_PROCESSES / participants;
+        int begin_row = rank * block_size;
+        int end_row = (rank + 1) * block_size;
+        int send_count = block_size * MAX_PROCESSES;
+
+        /* Fill in the displacements and recv_counts */
+        for (i = 0; i < participants; i++) {
+            displs[i] = i * block_size * MAX_PROCESSES;
+            recv_counts[i] = send_count;
+        }
+
+        /* Paint my rows my color */
+        for (i = begin_row; i < end_row; i++)
+            for (j = 0; j < MAX_PROCESSES; j++)
+                table[i][j] = rank + 10;
+
+        /* Gather everybody's result together - sort of like an */
+        /* inefficient allgather */
+        for (i = 0; i < participants; i++) {
+            void *sendbuf = (i == rank ? MPI_IN_PLACE : &table[begin_row][0]);
+            MPI_Gatherv(sendbuf, send_count, MPI_INT,
+                        &table[0][0], recv_counts, displs, MPI_INT, i, MPI_COMM_WORLD);
+        }
+
+
+        /* Everybody should have the same table now.
+         *
+         * The entries are:
+         * Table[i][j] = (i/block_size) + 10;
+         */
+        for (i = 0; i < MAX_PROCESSES; i++)
+            if ((table[i][0] - table[i][MAX_PROCESSES - 1] != 0))
+                errors++;
+        for (i = 0; i < MAX_PROCESSES; i++) {
+            for (j = 0; j < MAX_PROCESSES; j++) {
+                if (table[i][j] != (i / block_size) + 10)
+                    errors++;
+            }
+        }
+        if (errors) {
+            /* Print out table if there are any errors */
+            for (i = 0; i < MAX_PROCESSES; i++) {
+                printf("\n");
+                for (j = 0; j < MAX_PROCESSES; j++)
+                    printf("  %d", table[i][j]);
+            }
+            printf("\n");
+        }
+    }
+
+    MTest_Finalize(errors);
+    return MTestReturnValue(errors);
+}
index 3b17eb2..1035ac7 100644 (file)
@@ -80,6 +80,7 @@ exscan 10
 exscan2 5
 gather 4
 gather2 4
+gatherv 5
 scattern 4
 scatter2 4
 scatter3 4