From e890c4ab63d109ed551a3b4c74beeebe971174d9 Mon Sep 17 00:00:00 2001 From: Geoffroy Vallee Date: Fri, 5 Feb 2021 20:08:26 -0500 Subject: [PATCH 1/5] Add example with two different basic datatypes (utlimately for validation) --- examples/Makefile | 7 ++- examples/alltoallv_dt.c | 106 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 examples/alltoallv_dt.c diff --git a/examples/Makefile b/examples/Makefile index 9174a7d4..de7c8142 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,8 +1,11 @@ -all: alltoallv_c alltoallv_multicomms_c alltoallv_f alltoallv_bigcounts_c +all: alltoallv_c alltoallv_dt_c alltoallv_multicomms_c alltoallv_f alltoallv_bigcounts_c alltoallv_c: alltoallv.c mpicc -g alltoallv.c -o alltoallv_c +alltoallv_dt_c: alltoallv_dt.c + mpicc -g alltoallv_dt.c -o alltoallv_dt_c + alltoallv_multicomms_c: alltoallv_multicomms.c mpicc -g alltoallv_multicomms.c -o alltoallv_multicomms_c @@ -13,4 +16,4 @@ alltoallv_bigcounts_c: alltoallv_bigcounts.c mpicc -g alltoallv_bigcounts.c -o alltoallv_bigcounts_c clean: - @rm -f alltoallv_c alltoallv_f alltoallv_multicomms_c alltoallv_bigcounts_c + @rm -f alltoallv_c alltoallv_dt_c alltoallv_f alltoallv_multicomms_c alltoallv_bigcounts_c diff --git a/examples/alltoallv_dt.c b/examples/alltoallv_dt.c new file mode 100644 index 00000000..45e4177b --- /dev/null +++ b/examples/alltoallv_dt.c @@ -0,0 +1,106 @@ +/************************************************************************* + * Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + * + * See LICENSE.txt for license information + ************************************************************************/ + +#include +#include +#include +#include "mpi.h" + +#define MPICHECK(c) \ + do \ + { \ + if (c != MPI_SUCCESS) \ + { \ + fprintf(stderr, "MPI command failed\n"); \ + return 1; \ + } \ + } while (0); + +int main(int argc, char **argv) +{ + int i; + int world_size; + int world_rank; + int *send_buffer_int; + int *recv_buffer_int; + double *send_buffer_double; + double *recv_buffer_double; + int *send_count; + int *recv_count; + int *recv_displ; + int *send_displ; + + MPICHECK(MPI_Init(&argc, &argv)); + MPICHECK(MPI_Comm_size(MPI_COMM_WORLD, &world_size)); + MPICHECK(MPI_Comm_rank(MPI_COMM_WORLD, &world_rank)); + + send_buffer_int = (int *)calloc(world_size * world_size, sizeof(int)); + assert(send_buffer_int); + recv_buffer_int = (int *)calloc(world_size * world_size, sizeof(int)); + assert(recv_buffer_int); + send_buffer_double = (double *)calloc(world_size * world_size, sizeof(double)); + assert(send_buffer_double); + recv_buffer_double = (double *)calloc(world_size * world_size, sizeof(double)); + assert(recv_buffer_double); + send_count = calloc(world_size, sizeof(int)); + assert(send_count); + recv_count = calloc(world_size, sizeof(int)); + assert(recv_count); + send_displ = calloc(world_size, sizeof(int)); + assert(send_displ); + recv_displ = calloc(world_size, sizeof(int)); + assert(recv_displ); + + for (i = 0; i < world_size * world_size; i++) + { + send_buffer_int[i] = i + 10 * world_rank; + } + + for (i = 0; i < world_size * world_size; i++) + { + send_buffer_double[i] = i + 10 * world_rank; + } + + for (i = 0; i < world_size; i++) + { + send_count[i] = 1; + recv_count[i] = 1; + recv_displ[i] = 0; + send_displ[i] = 0; + } + + if (world_rank == 0) + { + int s; + MPI_Type_size(MPI_INT, &s); + fprintf(stdout, "Size of MPI_INT: %d\n", s); + MPI_Type_size(MPI_DOUBLE, &s); + fprintf(stdout, "Size of MPI_DOUBLE: %d\n", s); + } + + MPICHECK(MPI_Alltoallv(send_buffer_int, send_count, send_displ, MPI_INT, + recv_buffer_int, recv_count, recv_displ, MPI_INT, + MPI_COMM_WORLD)); + + MPICHECK(MPI_Alltoallv(send_buffer_double, send_count, send_displ, MPI_DOUBLE, + recv_buffer_double, recv_count, recv_displ, MPI_DOUBLE, + MPI_COMM_WORLD)); + + free(send_buffer_int); + free(recv_buffer_int); + free(send_buffer_double); + free(recv_buffer_double); + free(send_count); + free(recv_count); + free(send_displ); + free(recv_displ); + MPI_Finalize(); + return EXIT_SUCCESS; + +exit_on_failure: + MPI_Finalize(); + return EXIT_FAILURE; +} From eae2b2a4a9474935408d3107d0f37d3ce3fc14d0 Mon Sep 17 00:00:00 2001 From: Geoffroy Vallee Date: Fri, 5 Feb 2021 20:08:59 -0500 Subject: [PATCH 2/5] Datatype size bugfix --- src/alltoall/mpi_alltoall.c | 10 ++++++++-- src/alltoallv/mpi_alltoallv.c | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/alltoall/mpi_alltoall.c b/src/alltoall/mpi_alltoall.c index 93e071fb..5d43a59b 100755 --- a/src/alltoall/mpi_alltoall.c +++ b/src/alltoall/mpi_alltoall.c @@ -1280,7 +1280,10 @@ int _mpi_alltoall(const void *sendbuf, const int sendcount, MPI_Datatype sendtyp #endif #if ((ENABLE_RAW_DATA || ENABLE_PER_RANK_STATS || ENABLE_VALIDATION) && ENABLE_COMPACT_FORMAT) - if (insert_sendrecv_data(sbuf, rbuf, comm_size, sizeof(sendtype), sizeof(recvtype))) + int s_dt_size, r_dt_size; + MPI_Type_size(sendtype, &s_dt_size); + MPI_Type_size(recvtype, &r_dt_size); + if (insert_sendrecv_data(sbuf, rbuf, comm_size, s_dt_size, r_dt_size)) { fprintf(stderr, "[%s:%d][ERROR] unable to insert send/recv counts\n", __FILE__, __LINE__); MPI_Abort(MPI_COMM_WORLD, 1); @@ -1288,7 +1291,10 @@ int _mpi_alltoall(const void *sendbuf, const int sendcount, MPI_Datatype sendtyp #endif // ((ENABLE_RAW_DATA || ENABLE_PER_RANK_STATS || ENABLE_VALIDATION) && ENABLE_COMPACT_FORMAT) #if ((ENABLE_RAW_DATA || ENABLE_PER_RANK_STATS || ENABLE_VALIDATION) && !ENABLE_COMPACT_FORMAT) - save_counts(sbuf, rbuf, sizeof(sendtype), sizeof(recvtype), comm_size, avCalls); + int s_dt_size, r_dt_size; + MPI_Type_size(sendtype, &s_dt_size); + MPI_Type_size(recvtype, &r_dt_size); + save_counts(sbuf, rbuf, s_dt_size, r_dt_size, comm_size, avCalls); #endif // ((ENABLE_RAW_DATA || ENABLE_PER_RANK_STATS || ENABLE_VALIDATION) && !ENABLE_COMPACT_FORMAT) #if ENABLE_PATTERN_DETECTION diff --git a/src/alltoallv/mpi_alltoallv.c b/src/alltoallv/mpi_alltoallv.c index 8c112a75..200b124b 100755 --- a/src/alltoallv/mpi_alltoallv.c +++ b/src/alltoallv/mpi_alltoallv.c @@ -1270,7 +1270,10 @@ int _mpi_alltoallv(const void *sendbuf, const int *sendcounts, const int *sdispl #endif #if ((ENABLE_RAW_DATA || ENABLE_PER_RANK_STATS || ENABLE_VALIDATION) && ENABLE_COMPACT_FORMAT) - if (insert_sendrecv_data(sbuf, rbuf, comm_size, sizeof(sendtype), sizeof(recvtype))) + int s_dt_size, r_dt_size; + MPI_Type_size(sendtype, &s_dt_size); + MPI_Type_size(recvtype, &r_dt_size); + if (insert_sendrecv_data(sbuf, rbuf, comm_size, s_dt_size, r_dt_size)) { fprintf(stderr, "[%s:%d][ERROR] unable to insert send/recv counts\n", __FILE__, __LINE__); MPI_Abort(MPI_COMM_WORLD, 1); @@ -1278,7 +1281,10 @@ int _mpi_alltoallv(const void *sendbuf, const int *sendcounts, const int *sdispl #endif // ((ENABLE_RAW_DATA || ENABLE_PER_RANK_STATS || ENABLE_VALIDATION) && ENABLE_COMPACT_FORMAT) #if ((ENABLE_RAW_DATA || ENABLE_PER_RANK_STATS || ENABLE_VALIDATION) && !ENABLE_COMPACT_FORMAT) - save_counts(sbuf, rbuf, sizeof(sendtype), sizeof(recvtype), comm_size, avCalls); + int s_dt_size, r_dt_size; + MPI_Type_size(sendtype, &s_dt_size); + MPI_Type_size(recvtype, &r_dt_size); + save_counts(sbuf, rbuf, s_dt_size, r_dt_size, comm_size, avCalls); #endif // ((ENABLE_RAW_DATA || ENABLE_PER_RANK_STATS || ENABLE_VALIDATION) && !ENABLE_COMPACT_FORMAT) #if ENABLE_PATTERN_DETECTION From cb5c4adb705c77379a0318911e45e8e9395b7fc0 Mon Sep 17 00:00:00 2001 From: Geoffroy Vallee Date: Sun, 7 Feb 2021 15:23:47 -0500 Subject: [PATCH 3/5] Update copyright statement --- examples/alltoallv_dt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/alltoallv_dt.c b/examples/alltoallv_dt.c index 45e4177b..c816721d 100644 --- a/examples/alltoallv_dt.c +++ b/examples/alltoallv_dt.c @@ -1,5 +1,5 @@ /************************************************************************* - * Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2020-2021, NVIDIA CORPORATION. All rights reserved. * * See LICENSE.txt for license information ************************************************************************/ From a576e593db53e09f10f79c7921c4bdc9b0f3ecd3 Mon Sep 17 00:00:00 2001 From: Geoffroy Vallee Date: Mon, 8 Feb 2021 01:52:21 -0500 Subject: [PATCH 4/5] Validation code for datatypes' sizes --- doc/tool_dependencies.png | Bin 85300 -> 0 bytes .../expectedOutput/stats-job0-rank0.md | 4 +- .../recv-counters.job0.rank0.txt | 2 +- .../send-counters.job0.rank0.txt | 2 +- .../expectedOutput/stats-job0-rank0.md | 4 +- .../expectedOutput/patterns-job0-rank0.md | 10 +++++ .../patterns-summary-job0-rank0.md | 12 ++++++ .../profile_alltoallv_job0.rank0.md | 3 ++ .../expectedOutput/stats-job0-rank0.md | 37 ++++++++++++++++++ .../recv-counters.job0.rank0.txt | 2 +- .../send-counters.job0.rank0.txt | 2 +- .../expectedOutput/stats-job0-rank0.md | 4 +- .../recv-counters.job0.rank0.txt | 4 +- .../recv-counters.job0.rank2.txt | 2 +- .../send-counters.job0.rank0.txt | 4 +- .../send-counters.job0.rank2.txt | 2 +- .../expectedOutput/stats-job0-rank0.md | 4 +- tools/cmd/validate/validate.go | 13 ++++++ tools/internal/pkg/counts/counts_writer.go | 29 ++++++++++++-- 19 files changed, 118 insertions(+), 22 deletions(-) delete mode 100644 doc/tool_dependencies.png create mode 100755 tests/alltoallv_dt_c/expectedOutput/patterns-job0-rank0.md create mode 100755 tests/alltoallv_dt_c/expectedOutput/patterns-summary-job0-rank0.md create mode 100644 tests/alltoallv_dt_c/expectedOutput/profile_alltoallv_job0.rank0.md create mode 100755 tests/alltoallv_dt_c/expectedOutput/stats-job0-rank0.md diff --git a/doc/tool_dependencies.png b/doc/tool_dependencies.png deleted file mode 100644 index 63d58058efea388e11686523feeca3c674b17be1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85300 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
    U4S~& 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 diff --git a/tests/alltoallv_bigcounts_c/expectedOutput/stats-job0-rank0.md b/tests/alltoallv_bigcounts_c/expectedOutput/stats-job0-rank0.md index 51de8a60..aa96d795 100755 --- a/tests/alltoallv_bigcounts_c/expectedOutput/stats-job0-rank0.md +++ b/tests/alltoallv_bigcounts_c/expectedOutput/stats-job0-rank0.md @@ -2,8 +2,8 @@ Total number of alltoallv calls: 1000000 # Datatypes -1000000/1000000 calls use a datatype of size 8 while sending data -1000000/1000000 calls use a datatype of size 8 while receiving data +1000000/1000000 calls use a datatype of size 4 while sending data +1000000/1000000 calls use a datatype of size 4 while receiving data # Communicator size(s) diff --git a/tests/alltoallv_c/expectedOutput/recv-counters.job0.rank0.txt b/tests/alltoallv_c/expectedOutput/recv-counters.job0.rank0.txt index 1b7e98f9..15e90eb0 100644 --- a/tests/alltoallv_c/expectedOutput/recv-counters.job0.rank0.txt +++ b/tests/alltoallv_c/expectedOutput/recv-counters.job0.rank0.txt @@ -1,7 +1,7 @@ # Raw counters Number of ranks: 4 -Datatype size: 8 +Datatype size: 4 Alltoallv calls 0-0 Count: 1 calls - 0 diff --git a/tests/alltoallv_c/expectedOutput/send-counters.job0.rank0.txt b/tests/alltoallv_c/expectedOutput/send-counters.job0.rank0.txt index 9381e25f..422b135d 100644 --- a/tests/alltoallv_c/expectedOutput/send-counters.job0.rank0.txt +++ b/tests/alltoallv_c/expectedOutput/send-counters.job0.rank0.txt @@ -1,7 +1,7 @@ # Raw counters Number of ranks: 4 -Datatype size: 8 +Datatype size: 4 Alltoallv calls 0-0 Count: 1 calls - 0 diff --git a/tests/alltoallv_c/expectedOutput/stats-job0-rank0.md b/tests/alltoallv_c/expectedOutput/stats-job0-rank0.md index f95e2376..dc709b67 100755 --- a/tests/alltoallv_c/expectedOutput/stats-job0-rank0.md +++ b/tests/alltoallv_c/expectedOutput/stats-job0-rank0.md @@ -2,8 +2,8 @@ Total number of alltoallv calls: 1 # Datatypes -1/1 calls use a datatype of size 8 while sending data -1/1 calls use a datatype of size 8 while receiving data +1/1 calls use a datatype of size 4 while sending data +1/1 calls use a datatype of size 4 while receiving data # Communicator size(s) diff --git a/tests/alltoallv_dt_c/expectedOutput/patterns-job0-rank0.md b/tests/alltoallv_dt_c/expectedOutput/patterns-job0-rank0.md new file mode 100755 index 00000000..8e981f08 --- /dev/null +++ b/tests/alltoallv_dt_c/expectedOutput/patterns-job0-rank0.md @@ -0,0 +1,10 @@ +# Patterns +## Pattern #0 (2/2 alltoallv calls) + +Alltoallv calls: 0-1 + +4 ranks sent to 4 other ranks + +4 ranks recv'd from 4 other ranks + + diff --git a/tests/alltoallv_dt_c/expectedOutput/patterns-summary-job0-rank0.md b/tests/alltoallv_dt_c/expectedOutput/patterns-summary-job0-rank0.md new file mode 100755 index 00000000..af42b2fd --- /dev/null +++ b/tests/alltoallv_dt_c/expectedOutput/patterns-summary-job0-rank0.md @@ -0,0 +1,12 @@ + +# N to n patterns + +## Pattern #0 (2/2 alltoallv calls) + +Alltoallv calls: 0-1 + +4 ranks sent to 4 other ranks + +4 ranks recv'd from 4 other ranks + + diff --git a/tests/alltoallv_dt_c/expectedOutput/profile_alltoallv_job0.rank0.md b/tests/alltoallv_dt_c/expectedOutput/profile_alltoallv_job0.rank0.md new file mode 100644 index 00000000..5baaa17a --- /dev/null +++ b/tests/alltoallv_dt_c/expectedOutput/profile_alltoallv_job0.rank0.md @@ -0,0 +1,3 @@ +# Summary +COMM_WORLD size: 4 +Total number of Alltoallv calls = 2 (limit is 0; -1 means no limit) diff --git a/tests/alltoallv_dt_c/expectedOutput/stats-job0-rank0.md b/tests/alltoallv_dt_c/expectedOutput/stats-job0-rank0.md new file mode 100755 index 00000000..01b005f9 --- /dev/null +++ b/tests/alltoallv_dt_c/expectedOutput/stats-job0-rank0.md @@ -0,0 +1,37 @@ +Total number of alltoallv calls: 2 + +# Datatypes + +1/2 calls use a datatype of size 4 while sending data +1/2 calls use a datatype of size 8 while sending data +1/2 calls use a datatype of size 4 while receiving data +1/2 calls use a datatype of size 8 while receiving data + +# Communicator size(s) + +2/2 calls use a communicator size of 4 + +# Message sizes + +0/32 of all messages are large (threshold = 200) +32/32 of all messages are small (threshold = 200) +32/32 of all messages are small, but not 0-size (threshold = 200) + +# Sparsity + +2/2 of all calls have 0 send counts equals to zero +2/2 of all calls have 0 recv counts equals to zero + +# Min/max +2/2 calls have a send count min of 1 + +2/2 calls have a recv count min of 1 + +2/2 calls have a send count min of 0 (excluding zero) + +2/2 calls have a recv count min of 0 (excluding zero) + +2/2 calls have a send count max of 1 + +2/2 calls have a recv count max of 1 + diff --git a/tests/alltoallv_f/expectedOutput/recv-counters.job0.rank0.txt b/tests/alltoallv_f/expectedOutput/recv-counters.job0.rank0.txt index 29fac385..ded0b0c9 100644 --- a/tests/alltoallv_f/expectedOutput/recv-counters.job0.rank0.txt +++ b/tests/alltoallv_f/expectedOutput/recv-counters.job0.rank0.txt @@ -1,7 +1,7 @@ # Raw counters Number of ranks: 3 -Datatype size: 8 +Datatype size: 4 Alltoallv calls 0-1 Count: 2 calls - 0-1 diff --git a/tests/alltoallv_f/expectedOutput/send-counters.job0.rank0.txt b/tests/alltoallv_f/expectedOutput/send-counters.job0.rank0.txt index 9269160f..315d8252 100644 --- a/tests/alltoallv_f/expectedOutput/send-counters.job0.rank0.txt +++ b/tests/alltoallv_f/expectedOutput/send-counters.job0.rank0.txt @@ -1,7 +1,7 @@ # Raw counters Number of ranks: 3 -Datatype size: 8 +Datatype size: 4 Alltoallv calls 0-1 Count: 2 calls - 0-1 diff --git a/tests/alltoallv_f/expectedOutput/stats-job0-rank0.md b/tests/alltoallv_f/expectedOutput/stats-job0-rank0.md index 61178bc3..47aced74 100755 --- a/tests/alltoallv_f/expectedOutput/stats-job0-rank0.md +++ b/tests/alltoallv_f/expectedOutput/stats-job0-rank0.md @@ -2,8 +2,8 @@ Total number of alltoallv calls: 2 # Datatypes -2/2 calls use a datatype of size 8 while sending data -2/2 calls use a datatype of size 8 while receiving data +2/2 calls use a datatype of size 4 while sending data +2/2 calls use a datatype of size 4 while receiving data # Communicator size(s) diff --git a/tests/alltoallv_multicomms_c/expectedOutput/recv-counters.job0.rank0.txt b/tests/alltoallv_multicomms_c/expectedOutput/recv-counters.job0.rank0.txt index e0970aac..c5edeb14 100644 --- a/tests/alltoallv_multicomms_c/expectedOutput/recv-counters.job0.rank0.txt +++ b/tests/alltoallv_multicomms_c/expectedOutput/recv-counters.job0.rank0.txt @@ -1,7 +1,7 @@ # Raw counters Number of ranks: 2 -Datatype size: 8 +Datatype size: 4 Alltoallv calls 0-2 Count: 2 calls - 0, 2 @@ -13,7 +13,7 @@ END DATA # Raw counters Number of ranks: 4 -Datatype size: 8 +Datatype size: 4 Alltoallv calls 0-2 Count: 1 calls - 1 diff --git a/tests/alltoallv_multicomms_c/expectedOutput/recv-counters.job0.rank2.txt b/tests/alltoallv_multicomms_c/expectedOutput/recv-counters.job0.rank2.txt index 7bd32f5d..284f364b 100644 --- a/tests/alltoallv_multicomms_c/expectedOutput/recv-counters.job0.rank2.txt +++ b/tests/alltoallv_multicomms_c/expectedOutput/recv-counters.job0.rank2.txt @@ -1,7 +1,7 @@ # Raw counters Number of ranks: 2 -Datatype size: 8 +Datatype size: 4 Alltoallv calls 0-1 Count: 2 calls - 0, 2 diff --git a/tests/alltoallv_multicomms_c/expectedOutput/send-counters.job0.rank0.txt b/tests/alltoallv_multicomms_c/expectedOutput/send-counters.job0.rank0.txt index 92d9237f..4644ac5b 100644 --- a/tests/alltoallv_multicomms_c/expectedOutput/send-counters.job0.rank0.txt +++ b/tests/alltoallv_multicomms_c/expectedOutput/send-counters.job0.rank0.txt @@ -1,7 +1,7 @@ # Raw counters Number of ranks: 2 -Datatype size: 8 +Datatype size: 4 Alltoallv calls 0-2 Count: 2 calls - 0, 2 @@ -12,7 +12,7 @@ END DATA # Raw counters Number of ranks: 4 -Datatype size: 8 +Datatype size: 4 Alltoallv calls 0-2 Count: 1 calls - 1 diff --git a/tests/alltoallv_multicomms_c/expectedOutput/send-counters.job0.rank2.txt b/tests/alltoallv_multicomms_c/expectedOutput/send-counters.job0.rank2.txt index a5a56aaf..f91bd07f 100644 --- a/tests/alltoallv_multicomms_c/expectedOutput/send-counters.job0.rank2.txt +++ b/tests/alltoallv_multicomms_c/expectedOutput/send-counters.job0.rank2.txt @@ -1,7 +1,7 @@ # Raw counters Number of ranks: 2 -Datatype size: 8 +Datatype size: 4 Alltoallv calls 0-1 Count: 2 calls - 0, 2 diff --git a/tests/alltoallv_multicomms_c/expectedOutput/stats-job0-rank0.md b/tests/alltoallv_multicomms_c/expectedOutput/stats-job0-rank0.md index 11b303ab..dede32e0 100755 --- a/tests/alltoallv_multicomms_c/expectedOutput/stats-job0-rank0.md +++ b/tests/alltoallv_multicomms_c/expectedOutput/stats-job0-rank0.md @@ -2,8 +2,8 @@ Total number of alltoallv calls: 3 # Datatypes -3/3 calls use a datatype of size 8 while sending data -3/3 calls use a datatype of size 8 while receiving data +3/3 calls use a datatype of size 4 while sending data +3/3 calls use a datatype of size 4 while receiving data # Communicator size(s) diff --git a/tools/cmd/validate/validate.go b/tools/cmd/validate/validate.go index 0cc650b5..38110d1e 100644 --- a/tools/cmd/validate/validate.go +++ b/tools/cmd/validate/validate.go @@ -32,6 +32,7 @@ const ( sharedLibA2ATime = "liballtoallv_exec_timings.so" exampleFileC = "alltoallv.c" + exampleFileDatatypeC = "alltoallv_dt.c" exampleFileF = "alltoallv.f90" exampleFileMulticommC = "alltoallv_multicomms.c" exampleFileBigCountsC = "alltoallv_bigcounts.c" @@ -40,6 +41,7 @@ const ( exampleBinaryF = "alltoallv_f" exampleBinaryMulticommC = "alltoallv_multicomms_c" exampleBinaryBigCountsC = "alltoallv_bigcounts_c" + exampleBinaryDatatypeC = "alltoallv_dt_c" ) // Test gathers all the information required to run a specific test @@ -225,6 +227,17 @@ func validateProfiler(keepResults bool, fullValidation bool) (map[string]string, expectedA2ATimeFiles: []string{"a2a-timings.job0.rank0.md"}, expectedLateArrivalFiles: []string{"late-arrivals-timings.job0.rank0.md"}, }, + { + np: 4, + source: exampleFileDatatypeC, + binary: exampleBinaryDatatypeC, + expectedSendCompactCountsFiles: []string{"send-counters.job0.rank0.txt"}, + expectedRecvCompactCountsFiles: []string{"recv-counters.job0.rank0.txt"}, + // todo: expectedCountsFiles + expectedLocationFiles: []string{}, + expectedA2ATimeFiles: []string{"a2a-timings.job0.rank0.md"}, + expectedLateArrivalFiles: []string{"late-arrivals-timings.job0.rank0.md"}, + }, } if fullValidation { diff --git a/tools/internal/pkg/counts/counts_writer.go b/tools/internal/pkg/counts/counts_writer.go index d9f5aff9..f800cba6 100644 --- a/tools/internal/pkg/counts/counts_writer.go +++ b/tools/internal/pkg/counts/counts_writer.go @@ -9,23 +9,44 @@ package counts import ( "fmt" "os" + "sort" "github.com/gvallee/alltoallv_profiling/tools/internal/pkg/format" ) +// WriteDatatypeToFile save datatype stats to a file func WriteDatatypeToFile(fd *os.File, numCalls int, datatypesSend map[int]int, datatypesRecv map[int]int) error { + // Sort by datatype size first so we have a predictable output + sKeys := make([]int, len(datatypesSend)) + i := 0 + for key := range datatypesSend { + sKeys[i] = key + i++ + } + sort.Ints(sKeys) + + rKeys := make([]int, len(datatypesRecv)) + i = 0 + for key := range datatypesRecv { + rKeys[i] = key + i++ + } + sort.Ints(rKeys) + _, err := fd.WriteString("# Datatypes\n\n") if err != nil { return err } - for datatypeSize, n := range datatypesSend { - _, err := fd.WriteString(fmt.Sprintf("%d/%d calls use a datatype of size %d while sending data\n", n, numCalls, datatypeSize)) + //for datatypeSize, n := range datatypesSend { + for _, size := range sKeys { + _, err := fd.WriteString(fmt.Sprintf("%d/%d calls use a datatype of size %d while sending data\n", datatypesSend[size], numCalls, size)) if err != nil { return err } } - for datatypeSize, n := range datatypesRecv { - _, err := fd.WriteString(fmt.Sprintf("%d/%d calls use a datatype of size %d while receiving data\n", n, numCalls, datatypeSize)) + //for datatypeSize, n := range datatypesRecv { + for _, size := range rKeys { + _, err := fd.WriteString(fmt.Sprintf("%d/%d calls use a datatype of size %d while receiving data\n", datatypesRecv[size], numCalls, size)) if err != nil { return err } From f0878e9e8a7403ef886773a468b979974adaeac9 Mon Sep 17 00:00:00 2001 From: Geoffroy Vallee Date: Mon, 8 Feb 2021 02:19:26 -0500 Subject: [PATCH 5/5] Update/add copyright statements. --- examples/Makefile | 6 ++++++ src/alltoall/mpi_alltoall.c | 2 +- src/alltoallv/mpi_alltoallv.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/Makefile b/examples/Makefile index de7c8142..333ced0b 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,3 +1,9 @@ +# +# Copyright (c) 2020-2021, NVIDIA CORPORATION. All rights reserved. +# +# See LICENSE.txt for license information +# + all: alltoallv_c alltoallv_dt_c alltoallv_multicomms_c alltoallv_f alltoallv_bigcounts_c alltoallv_c: alltoallv.c diff --git a/src/alltoall/mpi_alltoall.c b/src/alltoall/mpi_alltoall.c index 5d43a59b..64aa13a8 100755 --- a/src/alltoall/mpi_alltoall.c +++ b/src/alltoall/mpi_alltoall.c @@ -1,6 +1,6 @@ /************************************************************************* * Copyright (c) 2019-2010, Mellanox Technologies, Inc. All rights reserved. - * Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2020-2021, NVIDIA CORPORATION. All rights reserved. * * See LICENSE.txt for license information ************************************************************************/ diff --git a/src/alltoallv/mpi_alltoallv.c b/src/alltoallv/mpi_alltoallv.c index 200b124b..446968c9 100755 --- a/src/alltoallv/mpi_alltoallv.c +++ b/src/alltoallv/mpi_alltoallv.c @@ -1,6 +1,6 @@ /************************************************************************* * Copyright (c) 2019-2010, Mellanox Technologies, Inc. All rights reserved. - * Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2020-2021, NVIDIA CORPORATION. All rights reserved. * * See LICENSE.txt for license information ************************************************************************/