From adbdcbddadcbd685b72259874d1ebfd9cbbcc497 Mon Sep 17 00:00:00 2001 From: Augustin Degomme Date: Fri, 17 Nov 2023 19:15:09 +0100 Subject: [PATCH] add gatherv test --- .../smpi/mpich3-test/coll/CMakeLists.txt | 3 +- teshsuite/smpi/mpich3-test/coll/gatherv.c | 90 +++++++++++++++++++ teshsuite/smpi/mpich3-test/coll/testlist | 1 + 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 teshsuite/smpi/mpich3-test/coll/gatherv.c diff --git a/teshsuite/smpi/mpich3-test/coll/CMakeLists.txt b/teshsuite/smpi/mpich3-test/coll/CMakeLists.txt index c07450a874..5b8561d301 100644 --- a/teshsuite/smpi/mpich3-test/coll/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/coll/CMakeLists.txt @@ -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 index 0000000000..6423f355cb --- /dev/null +++ b/teshsuite/smpi/mpich3-test/coll/gatherv.c @@ -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 +#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); +} diff --git a/teshsuite/smpi/mpich3-test/coll/testlist b/teshsuite/smpi/mpich3-test/coll/testlist index 3b17eb2b43..1035ac7f99 100644 --- a/teshsuite/smpi/mpich3-test/coll/testlist +++ b/teshsuite/smpi/mpich3-test/coll/testlist @@ -80,6 +80,7 @@ exscan 10 exscan2 5 gather 4 gather2 4 +gatherv 5 scattern 4 scatter2 4 scatter3 4 -- 2.20.1