summaryrefslogtreecommitdiffstats
path: root/tools/test/perform/gen_report.pl
diff options
context:
space:
mode:
authorAllen Byrne <byrn@hdfgroup.org>2016-10-27 15:06:00 (GMT)
committerAllen Byrne <byrn@hdfgroup.org>2016-10-27 15:06:00 (GMT)
commit2c6dbbf2129c4997606be4b130346d42fe12eae3 (patch)
treedb8430aa5757b32f3bd46928798cc2b686a72bfb /tools/test/perform/gen_report.pl
parent5b562d9ce9b2945d0378b9c03e01f42923da80f4 (diff)
downloadhdf5-2c6dbbf2129c4997606be4b130346d42fe12eae3.zip
hdf5-2c6dbbf2129c4997606be4b130346d42fe12eae3.tar.gz
hdf5-2c6dbbf2129c4997606be4b130346d42fe12eae3.tar.bz2
Split tools into src and test - add folders
Diffstat (limited to 'tools/test/perform/gen_report.pl')
-rw-r--r--tools/test/perform/gen_report.pl527
1 files changed, 527 insertions, 0 deletions
diff --git a/tools/test/perform/gen_report.pl b/tools/test/perform/gen_report.pl
new file mode 100644
index 0000000..285f5d7
--- /dev/null
+++ b/tools/test/perform/gen_report.pl
@@ -0,0 +1,527 @@
+#!/usr/bin/perl
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5. The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html. COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page. It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
+# access to either file, you may request a copy from help@hdfgroup.org.
+#
+
+#
+# Generates an ASCII and Excel-importable file of tables representing
+# the output of running the "pio_perf" command. The name of the input
+# file is important. The name should reflect the command-line options
+# used in the performance test. It needs to be of the form:
+#
+# f#[GMK].i#.d#.X#[GMK].x#[GMK]..*
+#
+# For example:
+#
+# PIO_output_f1G.i2.d1.X2M.x128K.frost
+#
+# for a 1GB sized file ran for 2 iterations with 1 dataset from xfer
+# buffer size of 128KB to 2MB on the frost machine.
+#
+# The output file will have the same name as the input, but will append
+# ".ascii" for the ASCII file and ".excel" for the Excel-importable
+# file.
+#
+# The data structure used in this program looks like:
+#
+# %results = {
+# num_proc => (
+# %xfer_size => (
+# %posix = {
+# 'write-only' => ##,
+# 'write-close' => ##,
+# 'read-only' => ##,
+# 'read-close' => ##
+# },
+# %mpio = {
+# 'write-only' => ##,
+# 'write-close' => ##,
+# 'read-only' => ##,
+# 'read-close' => ##
+# },
+# %phdf = {
+# 'write-only' => ##,
+# 'write-close' => ##,
+# 'read-only' => ##,
+# 'read-close' => ##
+# }
+# )
+# )
+# }
+
+use IO::Handle;
+use Getopt::Long;
+use List::Util qw[max];
+
+if ($#ARGV == -1) {
+ usage();
+}
+
+my ($ascii_output, $excel_output);
+
+GetOptions("data_type=s"=>\$data_type,
+ "buffer_size=i"=>\$transfer_buffer_size,
+ "procs=i"=>\$num_procs_graph,
+ "help!"=>\$help,
+ "throughput=s"=>\$throughput_type,
+ "io_type=i"=>\$io_type,
+ "3d!"=>\$plot_3d);
+
+usage() if $help or !@ARGV;
+
+$throughput_type = "average" if !$throughput_type;
+$io_type = 7 if !$io_type;
+
+foreach my $arg (@ARGV) {
+
+ if ($arg !~ /^-/) {
+ $arg =~ /f([0-9]+.)\.i([0-9]+)\.d([0-9]+)\.X([0-9]+.)\.x([0-9]+.)\.(.*)/;
+
+ my $output = $arg . $1 . ".X" . $4 . ".x" . $5 . "." . $6;
+
+ $ascii_output = $output . ".ascii";
+ $excel_output = $output . ".excel";
+
+ open(INPUT, "<$arg") or die "error: cannot open file $arg: $!\n";
+ open(ASCII_OUTPUT, ">$ascii_output") or
+ die "error: cannot open file $ascii_output: $!\n";
+ open(EXCEL_OUTPUT, ">$excel_output") or
+ die "error: cannot open file $excel_output: $!\n";
+ }
+ else
+ {
+ die "error: unrecognized option: $arg\n";
+ }
+}
+
+my %results;
+my $num_procs = 0;
+my ($xfer_size, $avg_type, $type);
+
+my $posix = 0, $mpio = 1, $phdf5 = 2;
+
+##"==== End of Parameters ===="
+
+while (<INPUT>) {
+ if (/Number of processors = ([0-9]+)/) {
+ $num_procs = $1;
+ }
+
+ if (/Transfer Buffer Size: ([0-9]+)/) {
+ $xfer_size = $1;
+ }
+
+ $type = $posix if /POSIX/;
+ $type = $mpio if /MPIO/;
+ $type = $phdf5 if /PHDF5/;
+
+ if (/Write Open/) {
+ $avg_type = "write-close";
+ } elsif (/Write/) {
+ $avg_type = "write-only";
+ } elsif (/Read Open/) {
+ $avg_type = "read-close";
+ } elsif (/Read/) {
+ $avg_type = "read-only";
+ }
+
+ if($throughput_type eq "max")
+ {
+ if (/Maximum Throughput: ( {0,2}[0-9]+\.[0-9]{2}) MB\/s/) {
+ $results{$num_procs}{$xfer_size}[$type]{$avg_type} = $1;
+ }
+ }
+ elsif($throughput_type eq "min")
+ {
+ if (/Minimum Throughput: ( {0,2}[0-9]+\.[0-9]{2}) MB\/s/) {
+ $results{$num_procs}{$xfer_size}[$type]{$avg_type} = $1;
+ }
+ }
+ elsif($throughput_type eq "average")
+ {
+ if (/Average Throughput: ( {0,2}[0-9]+\.[0-9]{2}) MB\/s/) {
+ $results{$num_procs}{$xfer_size}[$type]{$avg_type} = $1;
+ }
+ }
+}
+
+sub usage {
+ print "Usage: gen_reporl.pl [options] FILE
+ options are:\n
+ -data_type \"data_type\" plots the results for \"write-only\",\"read-only\", \"write-close\", or \"read-close\" (default is write-only)\n
+ -buffer_size \"buffer_size\" plots data from this buffer size (in kilobytes, default is 128)\n
+ -procs \"num_procs\" plots data from the run with num_procs processors (default is the highest number of processors for which there is data).\n
+ -throughput \"throughput_type\" plots either the \"max\", \"min\", or \"average\" throughput (default is average)\n
+ -io_type \"io_type\" where \"io_type\" is the bitwise or of the io_type for which plotting is desired (1 for POSIX, 2 for MPIO, 4 for PHDF5 (default is 7 (all))\n
+ -3d if present, does a 3d plot in addition to the normal ones\n";
+
+ exit 1;
+}
+
+sub create_excel_output_header {
+ my $output_header;
+ my $kb = 1024;
+ my $mb = $kb * $kb;
+
+ foreach my $key (sort { $a <=> $b } keys(%{$results{$num_procs}})) {
+ if ($key < $mb) {
+ $key /= $kb;
+ $output_header .= "\t". $key . "K";
+ } else {
+ $key /= $mb;
+ $output_header .= "\t". $key . "M";
+ }
+ }
+
+ $output_header;
+}
+
+sub create_excel_output_string {
+ my ($t) = @_;
+ my $output_content = "";
+
+ foreach my $procs (sort { $b <=> $a } keys(%results)) {
+ $output_content .= "\n$procs Procs";
+ $output_content .= "\n" . create_excel_output_header;
+ $output_content .= "\n POSIX";
+
+ foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+ $output_content .= "\t$results{$procs}{$xfer}[0]{$t}";
+ }
+
+ $output_content .= "\n MPIO";
+
+ foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+ $output_content .= "\t$results{$procs}{$xfer}[1]{$t}";
+ }
+
+ $output_content .= "\n PHDF5";
+
+ foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+ $output_content .= "\t$results{$procs}{$xfer}[2]{$t}";
+ }
+
+ $output_content .= "\n";
+ }
+
+ $output_content;
+}
+
+sub is_defined {
+ my ($t) = @_;
+ my $def = 1;
+
+ foreach my $procs (sort { $b <=> $a } keys(%results)) {
+ foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+ if (!defined($results{$procs}{$xfer}[0]{$t})) {
+ $def = 0;
+ }
+ }
+
+ foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+ if (!defined($results{$procs}{$xfer}[0]{$t})) {
+ $def = 0;
+ }
+ }
+
+ foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+ if (!defined($results{$procs}{$xfer}[0]{$t})) {
+ $def = 0;
+ }
+ }
+ }
+
+ $def;
+}
+
+sub write_excel_file {
+ print EXCEL_OUTPUT "\nWrite-Only\n";
+ print EXCEL_OUTPUT create_excel_output_string("write-only");
+ print EXCEL_OUTPUT "\nWrite-Close\n";
+ print EXCEL_OUTPUT create_excel_output_string("write-close");
+
+ if (is_defined("read-only")) {
+ print EXCEL_OUTPUT "\nRead-Only\n";
+ print EXCEL_OUTPUT create_excel_output_string("read-only");
+ print EXCEL_OUTPUT "\nRead-Close\n";
+ print EXCEL_OUTPUT create_excel_output_string("read-close");
+ }
+}
+
+sub create_ascii_output_header {
+ my $output_header = " " x 12 . "|";
+ my $kb = 1024;
+ my $mb = $kb * $kb;
+
+ foreach my $key (sort { $a <=> $b } keys(%{$results{$num_procs}})) {
+ if ($key < $mb) {
+ $key /= $kb;
+ $output_header = sprintf("$output_header %-4s |", $key . "K");
+ } else {
+ $key /= $mb;
+ $output_header = sprintf("$output_header %-4s |", $key . "M");
+ }
+ }
+
+ $output_header;
+}
+
+sub create_ascii_output_string {
+ my ($t) = @_;
+ my $output_content = "";
+ my $output_header = create_ascii_output_header;
+
+ foreach my $procs (sort { $b <=> $a } keys(%results)) {
+ $output_content .= "\n$procs Procs";
+ $output_content .= "\n$output_header\n";
+ $output_content .= "-" x length($output_header);
+ $output_content .= "\n POSIX |";
+
+ foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+ $output_content = sprintf("$output_content %-6s |",
+ $results{$procs}{$xfer}[0]{$t});
+ }
+
+ $output_content .= "\n ";
+ $output_content .= "-" x (length($output_header) - 4);
+ $output_content .= "\n MPI/IO |";
+
+ foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+ $output_content = sprintf("$output_content %-6s |",
+ $results{$procs}{$xfer}[1]{$t});
+ }
+
+ $output_content .= "\n ";
+ $output_content .= "-" x (length($output_header) - 4);
+ $output_content .= "\n PHDF5 |";
+
+ foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+ $output_content = sprintf("$output_content %-6s |",
+ $results{$procs}{$xfer}[2]{$t});
+ }
+
+ $output_content .= "\n";
+ $output_content .= "=" x length($output_header);
+ $output_content .= "\n";
+ }
+
+ $output_content;
+}
+
+sub write_ascii_file {
+ print ASCII_OUTPUT "\nWrite-Only";
+ print ASCII_OUTPUT "\n----------\n";
+ print ASCII_OUTPUT create_ascii_output_string("write-only");
+ print ASCII_OUTPUT "\n\nWrite-Close";
+ print ASCII_OUTPUT "\n-----------\n";
+ print ASCII_OUTPUT create_ascii_output_string("write-close");
+
+ if (is_defined("read-only")) {
+ print ASCII_OUTPUT "\n\nRead-Only";
+ print ASCII_OUTPUT "\n---------\n";
+ print ASCII_OUTPUT create_ascii_output_string("read-only");
+ print ASCII_OUTPUT "\n\nRead-Close";
+ print ASCII_OUTPUT "\n----------\n";
+ print ASCII_OUTPUT create_ascii_output_string("read-close");
+ }
+}
+
+sub draw_plot
+{
+ my($p_3d) = @_;
+
+ if($p_3d)
+ {
+ $counter = 3;
+ print GNUPLOT_PIPE "splot ";
+ }
+ else
+ {
+ $counter = 2;
+ print GNUPLOT_PIPE "plot ";
+ }
+
+ if($io_type & 1) {
+ print GNUPLOT_PIPE " \"gnuplot.data\" using 1:";
+
+ if($p_3d) { print GNUPLOT_PIPE "2:"; }
+
+ print GNUPLOT_PIPE $counter . " title 'POSIX' with linespoints";
+ $counter = $counter + 1;
+ }
+ if($io_type & 2) {
+ if($io_type & 1) { print GNUPLOT_PIPE ", "; }
+ print GNUPLOT_PIPE "\"gnuplot.data\" using 1:";
+
+ if($p_3d) { print GNUPLOT_PIPE "2:"; }
+
+ print GNUPLOT_PIPE $counter . " title 'MPIO' with linespoints";
+ $counter = $counter + 1;
+ if($io_type & 4) { print GNUPLOT_PIPE ", ";}
+ }
+ if($io_type & 4) {
+ print GNUPLOT_PIPE " \"gnuplot.data\" using 1:";
+
+ if($p_3d) { print GNUPLOT_PIPE "2:"; }
+
+ print GNUPLOT_PIPE $counter . " title 'PHDF5' with linespoints";
+
+ }
+ print GNUPLOT_PIPE "\n";
+}
+
+
+sub plot_default_graph1 {
+ open(GNUPLOT_DATA_OUTPUT, ">gnuplot.data") or
+ die "error: cannot open file gnuplot.data: $!\n";
+
+ $transfer_buffer_size = 128 if !$transfer_buffer_size;
+ $data_type = "write-only" if !$data_type;
+
+ #set up the plot
+ print GNUPLOT_PIPE "set term x11 1\n";
+ print GNUPLOT_PIPE "set xlabel \"Number of Processors\"\n";
+ print GNUPLOT_PIPE "set title \"" . $data_type . " Performance (Speed vs. Num. Procs)\"\n";
+ print GNUPLOT_PIPE "set ylabel \"Bandwdith (MB/s)\"\n";
+ print GNUPLOT_PIPE "set label 1 \"Transfer buffer size: " . $transfer_buffer_size . "K\" at graph 0.7, graph 0.7 left \n";
+
+#the next line attempts to hack gnuplot to get around it's inability to linearly scale, but logarithmically label an axis
+ print GNUPLOT_PIPE "set xtics (\"1\" 1, \"2\" 2, \"4\" 4, \"8\" 8, \"16\" 16, \"32\" 32, \"64\" 64, \"128\" 128, \"256\" 256, \"512\" 512, \"1024\" 1024)\n";
+
+
+ foreach $proc (sort { $a <=> $b }( keys %results ))
+ {
+ print GNUPLOT_DATA_OUTPUT $proc . "\t";
+ if($io_type & 1) {
+ print GNUPLOT_DATA_OUTPUT $results{$proc}{$transfer_buffer_size*1024}[0]{$data_type} . "\t";
+ }
+ if($io_type & 2) {
+ print GNUPLOT_DATA_OUTPUT $results{$proc}{$transfer_buffer_size*1024}[1]{$data_type}. "\t";
+ }
+ if($io_type & 4) {
+ print GNUPLOT_DATA_OUTPUT $results{$proc}{$transfer_buffer_size*1024}[2]{$data_type};
+ }
+ print GNUPLOT_DATA_OUTPUT "\n";
+
+ }
+
+ close(GNUPLOT_DATA_OUTPUT);
+
+ draw_plot(0);
+
+ unlink(GNUPLOT_DATA_OUTPUT);
+
+}
+
+
+sub plot_default_graph2 {
+ open(GNUPLOT_DATA_OUTPUT, ">gnuplot.data") or
+ die "error: cannot open file gnuplot.data: $!\n";
+
+ $num_procs_graph = max(sort { $a <=> $b }( keys %results )) if !$num_procs_graph;
+ print "min-rpocs: " . $num_procs_graph;
+ $data_type = "write-only" if !$data_type;
+
+ #set up the plot
+ print GNUPLOT_PIPE "set term x11 2\n";
+ print GNUPLOT_PIPE "set xlabel \"Transfer Buffer Size (in bytes)\"\n";
+ print GNUPLOT_PIPE "set title \"" . $data_type . " Performance (Speed vs. Transfer Buffer Size)\"\n";
+ print GNUPLOT_PIPE "set ylabel \"Bandwdith (MB/s)\"\n";
+ print GNUPLOT_PIPE "set label 1 \"Procs: " . $num_procs_graph . "\" at graph 0.7, graph 0.7 left \n";
+
+#the next line attempts to hack gnuplot to get around it's inability to linearly scale, but logarithmically label an axis
+ print GNUPLOT_PIPE "set xtics (\"4K\" 4*1024, \"8K\" 8*1024, \"16K\" 16*1024, \"32K\" 32*1024, \"64K\" 64*1024, \"128K\" 128*1024, \"256K\" 256*1024, \"512K\" 512*1024, \"1M\" 1024*1024, \"2M\" 2048*1024, \"4M\" 4096*1024, \"8M\" 8192*1024, \"16M\" 16384*1024)\n";
+
+ foreach $xfer (sort {$a <=> $b} ( keys %{$results{$num_procs_graph}} ))
+ {
+ print GNUPLOT_DATA_OUTPUT $xfer . "\t";
+ if($io_type & 1) {
+ print GNUPLOT_DATA_OUTPUT $results{$num_procs_graph}{$xfer}[0]{$data_type} . "\t";
+ }
+ if($io_type & 2) {
+ print GNUPLOT_DATA_OUTPUT $results{$num_procs_graph}{$xfer}[1]{$data_type}. "\t";
+ }
+ if($io_type & 4) {
+ print GNUPLOT_DATA_OUTPUT $results{$num_procs_graph}{$xfer}[2]{$data_type};
+ }
+ print GNUPLOT_DATA_OUTPUT "\n";
+
+ }
+
+ close(GNUPLOT_DATA_OUTPUT);
+
+ draw_plot(0);
+
+ unlink(GNUPLOT_DATA_OUTPUT);
+}
+
+sub plot_3d_graph3 {
+ open(GNUPLOT_DATA_OUTPUT, ">gnuplot.data") or
+ die "error: cannot open file gnuplot.data: $!\n";
+
+ #set up the plot
+ print GNUPLOT_PIPE "set term x11 3\n";
+ print GNUPLOT_PIPE "set xlabel \"Num. Processors\"\n";
+ print GNUPLOT_PIPE "set title \"Write Speed v. No. Procs v. Buffer Size\"\n";
+ print GNUPLOT_PIPE "set ylabel \"Buffer Size (bytes)\"\n";
+ print GNUPLOT_PIPE "set zlabel \"Bandwidth (in MB/s)\"\n";
+ print GNUPLOT_PIPE "set nolabel\n";
+ print GNUPLOT_PIPE "set dgrid3d 30,30\n";
+ print GNUPLOT_PIPE "set hidden3d\n";
+
+#the next lines attempts to hack gnuplot to get around it's inability to linearly scale, but logarithmically label an axis
+ print GNUPLOT_PIPE "set xtics (\"1\" 1, \"2\" 2, \"4\" 4, \"8\" 8, \"16\" 16, \"32\" 32, \"64\" 64, \"128\" 128, \"256\" 256, \"512\" 512, \"1024\" 1024)\n";
+ print GNUPLOT_PIPE "set ytics (\"4K\" 4*1024, \"8K\" 8*1024, \"16K\" 16*1024, \"32K\" 32*1024, \"64K\" 64*1024, \"128K\" 128*1024, \"256K\" 256*1024, \"512K\" 512*1024, \"1M\" 1024*1024, \"2M\" 2048*1024, \"4M\" 4096*1024, \"8M\" 8192*1024, \"16M\" 16384*1024)\n";
+
+
+#Read speed on z-axis, processors on x, buffer size on y.
+
+ foreach $proc (sort { $a <=> $b }( keys %results ))
+ {
+ foreach $xfer (sort {$a <=> $b} ( keys %{$results{$proc}} ))
+ {
+ print GNUPLOT_DATA_OUTPUT $proc . "\t" . $xfer . "\t";
+ if($io_type & 1) {
+ print GNUPLOT_DATA_OUTPUT $results{$proc}{$xfer}[0]{"write-only"} . "\t";
+ }
+ if($io_type & 2) {
+ print GNUPLOT_DATA_OUTPUT $results{$proc}{$xfer}[1]{"write-only"}. "\t";
+ }
+ if($io_type & 4) {
+ print GNUPLOT_DATA_OUTPUT $results{$proc}{$xfer}[2]{"write-only"};
+ }
+ print GNUPLOT_DATA_OUTPUT "\n";
+
+ }
+ }
+
+ close(GNUPLOT_DATA_OUTPUT);
+
+ draw_plot(1);
+
+ unlink(GNUPLOT_DATA_OUTPUT);
+}
+
+open(GNUPLOT_PIPE, "| tee gnuplot.script | gnuplot -persist") || die "Couldn't run gnuplot: $!\n";
+GNUPLOT_PIPE->autoflush(1);
+
+write_excel_file;
+write_ascii_file;
+plot_default_graph1;
+sleep 1;
+plot_default_graph2;
+sleep 1;
+
+plot_3d_graph3 if $plot_3d;
+close(GNUPLOT_PIPE);