diff options
-rwxr-xr-x | perform/gen_report.pl | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/perform/gen_report.pl b/perform/gen_report.pl new file mode 100755 index 0000000..db82096 --- /dev/null +++ b/perform/gen_report.pl @@ -0,0 +1,262 @@ +#!/usr/bin/perl -w +# +# Copyright (C) 2002 +# National Center for Supercomputing Applications. +# All rights reserved. +# + +# +# 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' => ## +# } +# ) +# ) +# } + +if ($#ARGV != 0) { + print "gen_report.pl [FILE]\n"; + exit 1; +} + +my ($ascii_output, $excel_output); + +foreach my $arg (@ARGV) { + if ($arg !~ /^-/) { + $arg =~ /f([0-9]+.)\.i([0-9]+)\.d([0-9]+)\.X([0-9]+.)\.x([0-9]+.)\.(.*)/; + + my $output = "result_f" . $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 (/Maximum Throughput: (-?[0-9]+\.[0-9]{2}) MB\/s/) { + $results{$num_procs}{$xfer_size}[$type]{$avg_type} = $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 Raw"; + + 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 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 (defined($results{$procs}{$xfer}[0]{"read-only"}) || + defined($results{$procs}{$xfer}[1]{"read-only"}) || + defined($results{$procs}{$xfer}[2]{"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 Raw |"; + + 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 (defined($results{$procs}{$xfer}[0]{"read-only"}) || + defined($results{$procs}{$xfer}[1]{"read-only"}) || + defined($results{$procs}{$xfer}[2]{"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"); + } +} + +write_excel_file; +write_ascii_file; |