From 69948afec199baa67a6deaef7a043468a8d9da22 Mon Sep 17 00:00:00 2001 From: wkliao Date: Thu, 19 Oct 2023 16:14:46 -0500 Subject: [PATCH] add README.md in examples --- README.md | 88 +------------------------- examples/README.md | 122 +++++++++++++++++++++++++++++++++++++ examples/concated.tiff | Bin 0 -> 19064 bytes examples/s06_s07.tiff | Bin 0 -> 33378 bytes examples/sample_stdout.txt | 2 +- 5 files changed, 126 insertions(+), 86 deletions(-) create mode 100644 examples/README.md create mode 100644 examples/concated.tiff create mode 100644 examples/s06_s07.tiff diff --git a/README.md b/README.md index 407fc0a..55f82bf 100644 --- a/README.md +++ b/README.md @@ -153,91 +153,9 @@ concatenation is important. have been created previously in the output file and their names must be the same as the one used in '-k' option. -## Sample input and output files -* There are four sample input HDF5 files provided in folder `examples`. - + examples/sample_r11981_s06.gz - + examples/sample_r11981_s07.gz - + examples/sample_r11981_s08.gz - + examples/sample_r11981_s09.gz -* These sample files are previously compressed. Run command 'make' will - uncompress them into HDF5 files, or run command below to uncompress them. - ```console - % gzip -dc examples/sample_r11981_s06.gz > examples/sample_r11981_s06.h5 - % gzip -dc examples/sample_r11981_s07.gz > examples/sample_r11981_s07.h5 - % gzip -dc examples/sample_r11981_s08.gz > examples/sample_r11981_s08.h5 - % gzip -dc examples/sample_r11981_s09.gz > examples/sample_r11981_s09.h5 - ``` -* Sample run commands - ```console - % mpiexec -n 2 ./ph5_concat -i examples/sample_list.txt -o sample_output.h5 - % mpiexec -n 4 ./ph5_concat -i examples/sample_list.txt -o sample_output.h5 -k evt - ``` - The output shown on screen is stored in `examples/sample_stdout.txt`. -* Sample output files - + The output files from concatenating the 4 sample files are available in - `examples/sample_output.h5.gz` whose metadata dumped from command below is - also available in `examples/sample_output.metadata`. - ```console - % gzip -dc examples/sample_output.h5.gz > sample_output.h5 - % h5dump -Hp sample_output.h5 - ``` - -## An example timing output from a run on Cori using 128 MPI processes. - ```console - % srun -n 128 ./ph5_concat -i ./nd_list_128.txt -o /scratch1/FS_1M_128/nd_out.h5 -b 512 -k evt - - Number of input HDF5 files: 128 - Input directory name: /global/cscratch1/sd/wkliao/FS_1M_8 - Output file name: /global/cscratch1/sd/wkliao/FS_1M_128/nd_out.h5 - Output datasets are compressed with level 6 - Read metadata from input files takes 1.2776 seconds - Create output file + datasets takes 25.7466 seconds - Concatenating 1D datasets takes 158.8101 seconds - Writ partition key datasets takes 14.0372 seconds - Concatenating 2D datasets takes 114.4464 seconds - Close input files takes 0.0037 seconds - Close output files takes 0.4797 seconds - ------------------------------------------------------------- - Input directory name: /scratch/FS_1M_8 - Number of input HDF5 files: 128 - Output HDF5 file name: /scratch1/FS_1M_128/nd_out.h5 - Parallel I/O strategy: 2 - Use POSIX I/O to open file: ON - POSIX In-memory I/O: ON - 1-process-create-followed-by-all-open: OFF - Chunk caching for raw data: ON - GZIP level: 6 - Internal I/O buffer size: 512.0 MiB - Dataset used to produce partition key: evt - Name of partition key datasets: evt.seq - ------------------------------------------------------------- - Number of groups: 999 - Number of non-zero-sized groups: 108 - Number of groups have partition key: 108 - Total number of datasets: 17971 - Total number of non-zero datasets: 2795 - ------------------------------------------------------------- - Number of MPI processes: 128 - Number calls to MPI_Allreduce: 3 - Number calls to MPI_Exscan: 2 - ------------------------------------------------------------- - H5Dcreate: 25.6772 - H5Dread for 1D datasets: 1.8583 - H5Dwrite for 1D datasets: 170.2729 - H5Dread for 2D datasets: 19.9304 - H5Dwrite for 2D datasets: 93.9265 - H5Dclose for input datasets: 0.0737 - H5Dclose for output datasets: 0.0516 - ------------------------------------------------------------- - Read metadata from input files: 1.2782 - Create output file + datasets: 25.7466 - Concatenate small datasets: 158.8102 - Write to partition key datasets: 14.0372 - Concatenate large datasets: 114.4520 - Close input files: 0.0124 - Close output files: 0.4799 - End-to-end: 314.8095 - ``` +## Run example +An example run with small input files for illustration is available in +folder [examples](./examples). ## Publications * Sunwoo Lee, Kai-yuan Hou, Kewei Wang, Saba Sehrish, Marc Paterno, diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..0ed72a7 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,122 @@ +# Examples of running 'ph5concat' + +This folder contains examples of running `ph5concat`, including a set of small +input files, run commands, concatenated output file, and metadata of input and +out files. + +# Input files +* There are four input HDF5 files, each containing a small number of dataset + extracted from neutrino simulation data for illustrative purpose. + + sample_r11981_s06.gz + + sample_r11981_s07.gz + + sample_r11981_s08.gz + + sample_r11981_s09.gz + +* These input files are compressed. Run command 'make' will uncompress them + into HDF5 files. They can also be uncompressed manually by commands below. + ```console + % gzip -dc sample_r11981_s06.gz > sample_r11981_s06.h5 + % gzip -dc sample_r11981_s07.gz > sample_r11981_s07.h5 + % gzip -dc sample_r11981_s08.gz > sample_r11981_s08.h5 + % gzip -dc sample_r11981_s09.gz > sample_r11981_s09.h5 + ``` + +* Metadata of input files + * Metadata of individual files can be retrieved by running command 'h5ls -r' + or 'h5dump -H'. + * The metadata of files 'sample_r11981_s06.h5' and 'sample_r11981_s07.h5' is + shown below. +

+ +

+ * In these examples, each file contains 4 groups at the root level, namely + 'neutrino', 'rec.me.trkkalman', 'rec.training.cvnmaps', and 'spill'. The + number of groups and their names must be identical among all input files to + be concatenated. + * In an input file, the number of datasets in a group can be different from + another group. + * Given a group, the number of datasets and their names it contains must be + identical among all input files. However, the size of first dimension of + datasets can be different. + + +* Run commands + ```console + % mpiexec -n 2 ../ph5_concat -i sample_list.txt -o sample_output.h5 + % mpiexec -n 4 ../ph5_concat -i sample_list.txt -o sample_output.h5 -k evt + ``` + When completed, the output shown on screen is available in + [sample_stdout.txt](./sample_stdout.txt). + +* Concatenated output file + + The concatenated output file is provided in `sample_output.h5.gz`. + + The metadata retrieved from 'h5dump' command is also available in + `sample_output.metadata`. + ```console + % gzip -dc sample_output.h5.gz > sample_output.h5 + % h5dump -Hp sample_output.h5 + ``` + * A short version of the metadata is shown below. +

+ +

+ +## An example output from a run concatenating 128 files +Below is an example timing output from a larger run on Cori using 128 MPI +processes. +```console + % srun -n 128 ./ph5_concat -i ./nd_list_128.txt -o /scratch1/FS_1M_128/nd_out.h5 -b 512 -k evt + + Number of input HDF5 files: 128 + Input directory name: /global/cscratch1/sd/wkliao/FS_1M_8 + Output file name: /global/cscratch1/sd/wkliao/FS_1M_128/nd_out.h5 + Output datasets are compressed with level 6 + Read metadata from input files takes 1.2776 seconds + Create output file + datasets takes 25.7466 seconds + Concatenating 1D datasets takes 158.8101 seconds + Write partition key datasets takes 14.0372 seconds + Concatenating 2D datasets takes 114.4464 seconds + Close input files takes 0.0037 seconds + Close output files takes 0.4797 seconds + ------------------------------------------------------------- + Input directory name: /scratch/FS_1M_8 + Number of input HDF5 files: 128 + Output HDF5 file name: /scratch1/FS_1M_128/nd_out.h5 + Parallel I/O strategy: 2 + Use POSIX I/O to open file: ON + POSIX In-memory I/O: ON + 1-process-create-followed-by-all-open: OFF + Chunk caching for raw data: ON + GZIP level: 6 + Internal I/O buffer size: 512.0 MiB + Dataset used to produce partition key: evt + Name of partition key datasets: evt.seq + ------------------------------------------------------------- + Number of groups: 999 + Number of non-zero-sized groups: 108 + Number of groups have partition key: 108 + Total number of datasets: 17971 + Total number of non-zero datasets: 2795 + ------------------------------------------------------------- + Number of MPI processes: 128 + Number calls to MPI_Allreduce: 3 + Number calls to MPI_Exscan: 2 + ------------------------------------------------------------- + H5Dcreate: 25.6772 + H5Dread for 1D datasets: 1.8583 + H5Dwrite for 1D datasets: 170.2729 + H5Dread for 2D datasets: 19.9304 + H5Dwrite for 2D datasets: 93.9265 + H5Dclose for input datasets: 0.0737 + H5Dclose for output datasets: 0.0516 + ------------------------------------------------------------- + Read metadata from input files: 1.2782 + Create output file + datasets: 25.7466 + Concatenate small datasets: 158.8102 + Write to partition key datasets: 14.0372 + Concatenate large datasets: 114.4520 + Close input files: 0.0124 + Close output files: 0.4799 + End-to-end: 314.8095 +``` + diff --git a/examples/concated.tiff b/examples/concated.tiff new file mode 100644 index 0000000000000000000000000000000000000000..8391ef359897544054b8916d5b112d8280f9c05d GIT binary patch literal 19064 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 =Q^XhuA8Oo8u%^n_|&8nx3tudrh* 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 literal 0 HcmV?d00001 diff --git a/examples/sample_stdout.txt b/examples/sample_stdout.txt index 0e5b884..8a40687 100644 --- a/examples/sample_stdout.txt +++ b/examples/sample_stdout.txt @@ -5,7 +5,7 @@ Output datasets are compressed with level 6 Read metadata from input files takes 0.0096 seconds Create output file + datasets takes 0.0149 seconds Concatenating 1D datasets takes 0.0480 seconds -Writ partition key datasets takes 0.0240 seconds +Write partition key datasets takes 0.0240 seconds Concatenating 2D datasets takes 0.0081 seconds Close input files takes 0.0005 seconds Close output files takes 0.0010 seconds