diff options
-rw-r--r-- | gprofng/gp-display-html/gp-display-html.in | 766 |
1 files changed, 441 insertions, 325 deletions
diff --git a/gprofng/gp-display-html/gp-display-html.in b/gprofng/gp-display-html/gp-display-html.in index 306c99a..8894449 100644 --- a/gprofng/gp-display-html/gp-display-html.in +++ b/gprofng/gp-display-html/gp-display-html.in @@ -197,7 +197,7 @@ my $thresh = 0; $driver_cmd = "gprofng display html"; $tool_name = "gp-display-html"; #$binutils_version = "2.38.50"; -$binutils_version = "BINUTILS_VERSION"; +$binutils_version = "2.43.0"; $version_info = $tool_name . " GNU binutils version " . $binutils_version; #------------------------------------------------------------------------------ @@ -908,7 +908,8 @@ sub main #------------------------------------------------------------------------------ $outputdir = append_forward_slash ($outputdir); - gp_message ("debug", $subr_name, "prepared outputdir = $outputdir"); + $msg = "prepared outputdir = ". $outputdir; + gp_message ("debug", $subr_name, $msg); #------------------------------------------------------------------------------ #------------------------------------------------------------------------------ @@ -921,6 +922,13 @@ sub main $detail_metrics_system = 'e.totalcpu:e.system'; $call_metrics = 'a.totalcpu'; + $msg = "set detail_metrics_system = " . $detail_metrics_system; + gp_message ("debug", $subr_name, $msg); + $msg = "set detail_metrics = " . $detail_metrics; + gp_message ("debug", $subr_name, $msg); + $msg = "set call_metrics = " . $call_metrics; + gp_message ("debug", $subr_name, $msg); + my $cmd_options; my $metrics_cmd; @@ -1029,15 +1037,15 @@ sub main $number_of_metrics = split (":", $summary_metrics); $msg = "summary_metrics = " . $summary_metrics; - gp_message ("debugXL", $subr_name, $msg); + gp_message ("debugM", $subr_name, $msg); $msg = "detail_metrics = " . $detail_metrics; - gp_message ("debugXL", $subr_name, $msg); + gp_message ("debugM", $subr_name, $msg); $msg = "detail_metrics_system = " . $detail_metrics_system; - gp_message ("debugXL", $subr_name, $msg); + gp_message ("debugM", $subr_name, $msg); $msg = "call_metrics = " . $call_metrics; - gp_message ("debugXL", $subr_name, $msg); + gp_message ("debugM", $subr_name, $msg); $msg = "number_of_metrics = " . $number_of_metrics; - gp_message ("debugXL", $subr_name, $msg); + gp_message ("debugM", $subr_name, $msg); #------------------------------------------------------------------------------ # TBD Find a way to better handle this situation: @@ -1488,6 +1496,9 @@ sub check_and_define_cmds { $target_cmd = "(command -v $cmd; echo \$\?)"; + $msg = "check target_cmd = " . $target_cmd; + gp_message ("debug", $subr_name, $msg); + ($error_code, $output_cmd) = execute_system_cmd ($target_cmd); if ($error_code != 0) @@ -4098,8 +4109,7 @@ sub extract_info_from_map_xml } #-- End of subroutine extract_info_from_map_xml #------------------------------------------------------------------------------ -# This routine analyzes the metric line and extracts the metric specifics -# from it. +# This routine analyzes the metric line and extracts the metric details. # Example input: Exclusive Total CPU Time: e.%totalcpu #------------------------------------------------------------------------------ sub extract_metric_specifics @@ -4113,11 +4123,13 @@ sub extract_metric_specifics my $metric_visibility; my $metric_name; my $metric_spec; + my $msg; # Ruud if (($metric =~ /\s*(.*):\s+(\S)((\.\S+)|(\+\S+))/) && !($metric =~/^Current/)){ if (($metric_line =~ /\s*(.+):\s+([ei])([\.\+%]+)(\S*)/) and !($metric_line =~/^Current/)) { - gp_message ("debug", $subr_name, "line of interest: $metric_line"); + $msg = "input line = " . $metric_line; + gp_message ("debug", $subr_name, $msg); $metric_description = $1; $metric_flavor = $2; @@ -4153,6 +4165,17 @@ sub extract_metric_specifics # $metric_spec =~ s/\%//; # print "DB: after \$metric_spec = $metric_spec\n"; + $msg = "on return: metric_spec = " . $metric_spec; + gp_message ("debugM", $subr_name, $msg); + $msg = "on return: metric_flavor = " . $metric_flavor; + gp_message ("debugM", $subr_name, $msg); + $msg = "on return: metric_visibility = " . $metric_visibility; + gp_message ("debugM", $subr_name, $msg); + $msg = "on return: metric_name = " . $metric_name; + gp_message ("debugM", $subr_name, $msg); + $msg = "on return: metric_description = " . $metric_description; + gp_message ("debugM", $subr_name, $msg); + return ($metric_spec, $metric_flavor, $metric_visibility, $metric_name, $metric_description); } @@ -4402,7 +4425,7 @@ sub extract_option_value $msg .= " in a future update"; gp_message ("warning", $subr_name, $msg); - $msg = "please check the man page of gp-display-html"; + $msg = "please check the gprofng-display-html man page"; $msg .= " for more details"; gp_message ("warning", $subr_name, $msg); $g_total_warning_count++; @@ -7034,7 +7057,19 @@ sub generate_function_level_info #------------------------------------------------------------------------------ print SCRIPT_PC "# outfile $outputdir"."gp-metrics-calls-PC\n"; print SCRIPT_PC "outfile $outputdir"."gp-metrics-calls-PC\n"; - $script_pc_metrics = "address:$call_metrics"; +#------------------------------------------------------------------------------ +# TBD: fix the situation that call_metrics is empty. +#------------------------------------------------------------------------------ + if ($call_metrics ne "") + { + $script_pc_metrics = "address:$call_metrics"; + } + else + { + $script_pc_metrics = "address"; + $msg = "warning: call_metrics is empty - only address field printed"; + gp_message ("debug", $subr_name, $msg); + } print SCRIPT_PC "# metrics $script_pc_metrics\n"; print SCRIPT_PC "metrics $script_pc_metrics\n"; @@ -9106,6 +9141,7 @@ sub get_hot_functions my $expr_name; my $first_metric; my $gp_display_text_cmd; + my $msg; my $ignore_value; my @sort_fields = (); @@ -9123,6 +9159,15 @@ sub get_hot_functions @sort_fields = split (":", $summary_metrics); +#-- RUUD + + $msg = "summary_metrics = " . $summary_metrics; + gp_message ("debug", $subr_name, $msg); + for my $field (@sort_fields) + { + $msg = "metric field = " . $field; + gp_message ("debug", $subr_name, $msg); + } #------------------------------------------------------------------------------ # This is extremely unlikely to happen, but if so, it is a fatal error. #------------------------------------------------------------------------------ @@ -10469,7 +10514,7 @@ sub msg_display_text_failure } #-- End of subroutine msg_display_text_failure #------------------------------------------------------------------------------ -# TBD. +# TBD. Still needed? I think this entire function and usage can be removed. #------------------------------------------------------------------------------ sub name_regex { @@ -10479,16 +10524,21 @@ sub name_regex my %metric_description = %{ $metric_description_ref }; + my $msg; + my @splitted_metrics; my $splitted_metrics; my $m; my $mf; my $nf; - my $re; + my $re = "This value should never show up anywhere"; my $Xre; - my $noPCfile; +#------------------------------------------------------------------------------ +# Make sure to check for these to have a value. +#------------------------------------------------------------------------------ + my $noPCfile = undef; + my $reported_metrics = undef; my @reported_metrics; - my $reported_metrics; my $hdr_regex; my $hdr_href_regex; my $hdr_src_regex; @@ -10606,152 +10656,174 @@ sub name_regex # # TBD: This should be done only once! #------------------------------------------------------------------------------ - @reported_metrics = split (":", $reported_metrics); - for my $i (@reported_metrics) + if (not defined($reported_metrics)) { - gp_message ("debugXL", $subr_name, "reported_metrics = $i"); + $msg = "reported_metrics is not defined"; + gp_message ("debug", $subr_name, $msg); } - - $hdr_regex = "^\\s*"; - $hdr_href_regex = "^\\s*"; - $hdr_src_regex = "^(\\s+|<i>\\s+)"; - - for my $m (@reported_metrics) + else { + $msg = "reported_metrics = " . $reported_metrics; + gp_message ("debug", $subr_name, $msg); - my $description = ${ retrieve_metric_description (\$m, \%metric_description) }; - gp_message ("debugXL", $subr_name, "m = $m description = $description"); - if (substr ($m,0,1) eq "e") + @reported_metrics = split (":", $reported_metrics); + for my $i (@reported_metrics) { - push (@moo,"$m:$description\n"); - $hdr_regex .= "(Excl\\.\.*)"; - $hdr_href_regex .= "(<a.*>)(Excl\\.)(<\/a>)([^<]+)"; - $hdr_src_regex .= "(Excl\\.\.*)"; - next; - } - if (substr ($m,0,1) eq "i") - { - push (@moo,"$m:$description\n"); - $hdr_regex .= "(Incl\\.\.*)"; - $hdr_href_regex .= "(<a.*>)(Incl\\.)(<\/a>)([^<]+)"; - $hdr_src_regex .= "(Incl\\.\.*)"; - next; + gp_message ("debugXL", $subr_name, "reported_metrics = $i"); } - if (substr ($m,0,1) eq "a") + + $hdr_regex = "^\\s*"; + $hdr_href_regex = "^\\s*"; + $hdr_src_regex = "^(\\s+|<i>\\s+)"; + + for my $m (@reported_metrics) { - my $a; - my $am; - $a = $m; - $a =~ s/^a/e/; - $am = ${ retrieve_metric_description (\$a, \%metric_description) }; - $am =~ s/Exclusive/Attributed/; - push (@moo,"$m:$am\n"); - $hdr_regex .= "(Attr\\.\.*)"; - $hdr_href_regex .= "(<a.*>)(Attr\\.)(<\/a>)([^<]+)"; - $hdr_src_regex .= "(Attr\\.\.*)";next; + + my $description = ${ retrieve_metric_description (\$m, \%metric_description) }; + gp_message ("debugXL", $subr_name, "m = $m description = $description"); + if (substr ($m,0,1) eq "e") + { + push (@moo,"$m:$description\n"); + $hdr_regex .= "(Excl\\.\.*)"; + $hdr_href_regex .= "(<a.*>)(Excl\\.)(<\/a>)([^<]+)"; + $hdr_src_regex .= "(Excl\\.\.*)"; + next; + } + if (substr ($m,0,1) eq "i") + { + push (@moo,"$m:$description\n"); + $hdr_regex .= "(Incl\\.\.*)"; + $hdr_href_regex .= "(<a.*>)(Incl\\.)(<\/a>)([^<]+)"; + $hdr_src_regex .= "(Incl\\.\.*)"; + next; + } + if (substr ($m,0,1) eq "a") + { + my $a; + my $am; + $a = $m; + $a =~ s/^a/e/; + $am = ${ retrieve_metric_description (\$a, \%metric_description) }; + $am =~ s/Exclusive/Attributed/; + push (@moo,"$m:$am\n"); + $hdr_regex .= "(Attr\\.\.*)"; + $hdr_href_regex .= "(<a.*>)(Attr\\.)(<\/a>)([^<]+)"; + $hdr_src_regex .= "(Attr\\.\.*)";next; + } } } + + $hdr_regex .= "(Name\.*)"; + $hdr_href_regex .= "(Name\.*)"; - $hdr_regex .= "(Name\.*)"; - $hdr_href_regex .= "(Name\.*)"; - - @splitted_metrics = split (":","$metrics"); - $nf = scalar (@splitted_metrics); - gp_message ("debug", $subr_name,"number of fields in $metrics -> $nf"); - - open (ZMETRICS, ">", "$noPCfile.metrics") - or die ("Not able to open file $noPCfile.metrics for writing - '$!'"); - gp_message ("debug", $subr_name, "$noPCfile - opened file $noPCfile.metrics for writing"); - - print ZMETRICS @moo; - close (ZMETRICS); - - gp_message ("debug", $subr_name, "wrote file $noPCfile.metrics"); + @splitted_metrics = split (":","$metrics"); + $nf = scalar (@splitted_metrics); + gp_message ("debug", $subr_name,"number of fields in $metrics -> $nf"); - open (XREGEXP, ">", "$noPCfile.c.regex") - or die ("Not able to open file $noPCfile.c.regex for writing - '$!'"); - gp_message ("debug", $subr_name, "$noPCfile - opened file $noPCfile.c.regex for writing"); - - print XREGEXP "\# Number of metric fields\n"; - print XREGEXP "$nf\n"; - print XREGEXP "\# Header regex\n"; - print XREGEXP "$hdr_regex\n"; - print XREGEXP "\# href Header regex\n"; - print XREGEXP "$hdr_href_regex\n"; - print XREGEXP "\# src Header regex\n"; - print XREGEXP "$hdr_src_regex\n"; + if (not defined($noPCfile)) + { + $msg = "noPCfile is not defined"; + gp_message ("debug", $subr_name, $msg); + } + else + { + $msg = "noPCfile = " . $noPCfile; + gp_message ("debug", $subr_name, $msg); - $mf = 1; + open (ZMETRICS, ">", "$noPCfile.metrics") + or die ("Not able to open file $noPCfile.metrics for writing - '$!'"); + gp_message ("debug", $subr_name, "$noPCfile - opened file $noPCfile.metrics for writing"); + + print ZMETRICS @moo; + close (ZMETRICS); + + gp_message ("debug", $subr_name, "wrote file $noPCfile.metrics"); + + open (XREGEXP, ">", "$noPCfile.c.regex") + or die ("Not able to open file $noPCfile.c.regex for writing - '$!'"); + gp_message ("debug", $subr_name, "$noPCfile - opened file $noPCfile.c.regex for writing"); + + print XREGEXP "\# Number of metric fields\n"; + print XREGEXP "$nf\n"; + print XREGEXP "\# Header regex\n"; + print XREGEXP "$hdr_regex\n"; + print XREGEXP "\# href Header regex\n"; + print XREGEXP "$hdr_href_regex\n"; + print XREGEXP "\# src Header regex\n"; + print XREGEXP "$hdr_src_regex\n"; + + $mf = 1; #--------------------------------------------------------------------------- # Find the index of "field" in the metric list, plus one. #--------------------------------------------------------------------------- - if ( ($field eq "functions") or ($field eq "calls") or ($field eq "calltree")) - { - $mf = $nf + 1; - } - else - { - for my $candidate_metric (@splitted_metrics) - { - gp_message ("debugXL", $subr_name, "field = $field candidate_metric = $candidate_metric and mf = $mf"); - if ($candidate_metric eq $field) + if ( ($field eq "functions") or ($field eq "calls") or ($field eq "calltree")) { - last; + $mf = $nf + 1; } - $mf++; - } - } - gp_message ("debugXL", $subr_name, "Final value mf = $mf"); - - if ($mf == 1) - { - $re = "^\\s*(\\S+)"; # metric value - } - else - { - $re = "^\\s*\\S+"; - } - $Xre = "^\\s*(\\S+)"; + else + { + for my $candidate_metric (@splitted_metrics) + { + gp_message ("debugXL", $subr_name, "field = $field candidate_metric = $candidate_metric and mf = $mf"); + if ($candidate_metric eq $field) + { + last; + } + $mf++; + } + } + gp_message ("debugXL", $subr_name, "Final value mf = $mf"); - $m = 2; - while (--$nf) - { - if ($nf) - { - if ($m == $mf) + if ($mf == 1) { - $re .= "\\s+(\\S+)"; # metric value + $re = "^\\s*(\\S+)"; # metric value } else { - $re .= "\\s+\\S+"; + $re = "^\\s*\\S+"; } - if ($nf != 1) + $Xre = "^\\s*(\\S+)"; + + $m = 2; + while (--$nf) { - $Xre .= "\\s+(\\S+)"; + if ($nf) + { + if ($m == $mf) + { + $re .= "\\s+(\\S+)"; # metric value + } + else + { + $re .= "\\s+\\S+"; + } + if ($nf != 1) + { + $Xre .= "\\s+(\\S+)"; + } + $m++; + } } - $m++; - } - } - - if ($field eq "calltree") - { - $re .= "\\s+.*\\+-(.*)"; # name - $Xre .= "\\s+.*\\+-(.*)\$"; # name (Right?) - } - else - { - $re .= "\\s+(.*)"; # name - $Xre .= "\\s+(.*)\$"; # name - } - print XREGEXP "\# Metrics and Name regex\n"; - print XREGEXP "$Xre\n"; - close (XREGEXP); + if ($field eq "calltree") + { + $re .= "\\s+.*\\+-(.*)"; # name + $Xre .= "\\s+.*\\+-(.*)\$"; # name (Right?) + } + else + { + $re .= "\\s+(.*)"; # name + $Xre .= "\\s+(.*)\$"; # name + } - gp_message ("debug", $subr_name, "wrote file $noPCfile.c.regex"); - gp_message ("debugXL", $subr_name, "on return Xre = $Xre"); - gp_message ("debugXL", $subr_name, "on return re = $re"); + print XREGEXP "\# Metrics and Name regex\n"; + print XREGEXP "$Xre\n"; + close (XREGEXP); + + gp_message ("debug", $subr_name, "wrote file $noPCfile.c.regex"); + gp_message ("debugXL", $subr_name, "on return Xre = $Xre"); + gp_message ("debugXL", $subr_name, "on return re = $re"); + } return ($re); @@ -11388,7 +11460,7 @@ sub prepend_backslashes } #-- End of subroutine prepend_backslashes #------------------------------------------------------------------------------ -# TBD +# TBD Still needed? #------------------------------------------------------------------------------ sub preprocess_function_files { @@ -12467,6 +12539,7 @@ sub process_function_files #------------------------------------------------------------------------------ # TBD: Name cleanup needed. #------------------------------------------------------------------------------ + my $msg; my $number_of_metrics; my $expr_name; @@ -12669,7 +12742,11 @@ sub process_function_files #------------------------------------------------------------------------------ # Strip the internal number from the address field. #------------------------------------------------------------------------------ + $msg = "address_field before regex = " . $address_field; + gp_message ("debugXL", $subr_name, $msg); $address_field =~ s/$remove_number_regex//; + $msg = "address_field after regex = " . $address_field; + gp_message ("debugXL", $subr_name, $msg); ## $disfile = "file\.$routine_index\.dis"; $disfile = "file." . $routine_index . "." . $g_html_base_file_name{"disassembly"}; @@ -13553,6 +13630,13 @@ sub process_metrics_data my $detail_metrics_system; my $call_metrics; +#------------------------------------------------------------------------------ +# The regex section. +#------------------------------------------------------------------------------ + my $metrics_line_regex = '\s*(.*):\s+(\d+\.?\d*)'; + my $metric_of_interest_1_regex = '^Exclusive\ *'; + my $metric_of_interest_2_regex = '^Inclusive\ *'; + if ($g_user_settings{"default_metrics"}{"current_value"} eq "off") { $msg = "g_user_settings{default_metrics}{current_value} = "; @@ -13575,104 +13659,103 @@ sub process_metrics_data gp_message ("debug", $subr_name, "opened $outfile2 to parse metric value data"); #------------------------------------------------------------------------------ -# Below an example of the file that has just been opened. The lines I marked -# with a * has been wrapped by my for readability. This is not the case in the -# file, but makes for a really long line. -# -# Also, the data comes from one PC experiment and two HWC experiments. +# Below an example of the file that has just been opened. #------------------------------------------------------------------------------ # <Total> -# Exclusive Total CPU Time: 32.473 (100.0%) -# Inclusive Total CPU Time: 32.473 (100.0%) -# Exclusive CPU Cycles: 23.586 (100.0%) -# " count: 47054706905 -# Inclusive CPU Cycles: 23.586 (100.0%) -# " count: 47054706905 -# Exclusive Instructions Executed: 54417033412 (100.0%) -# Inclusive Instructions Executed: 54417033412 (100.0%) -# Exclusive Last-Level Cache Misses: 252730685 (100.0%) -# Inclusive Last-Level Cache Misses: 252730685 (100.0%) -# * Exclusive Instructions Per Cycle: Inclusive Instructions Per Cycle: -# * Exclusive Cycles Per Instruction: -# * Inclusive Cycles Per Instruction: -# * Size: 0 -# PC Address: 1:0x00000000 -# Source File: (unknown) -# Object File: (unknown) -# Load Object: <Total> -# Mangled Name: -# Aliases: +# Exclusive Total CPU Time: 3.232 (100.0%) +# Inclusive Total CPU Time: 3.232 (100.0%) +# Exclusive insts Events: 7628146366 (100.0%) +# Inclusive insts Events: 7628146366 (100.0%) +# Exclusive cycles Events: 5167454376 (100.0%) +# Inclusive cycles Events: 5167454376 (100.0%) +# Exclusive dTLB-load-misses Events: 0 ( 0. %) +# Inclusive dTLB-load-misses Events: 0 ( 0. %) +# Exclusive Instructions Per Cycle: 1.476 +# Inclusive Instructions Per Cycle: 1.476 +# Exclusive Cycles Per Instruction: 0.677 +# Inclusive Cycles Per Instruction: 0.677 +# Exclusive branch-instructions Events: 1268741580 (100.0%) +# Inclusive branch-instructions Events: 1268741580 (100.0%) +# Size: 0 +# PC Address: 1:0x00000000 +# Source File: (unknown) +# Object File: (unknown) +# Load Object: <Total> +# Mangled Name: +# Aliases: #------------------------------------------------------------------------------ while (<METRICTOTALS>) { $metricdata = $_; chomp ($metricdata); - gp_message ("debug", $subr_name, "file metrictotals: $metricdata"); + + $msg = "file metrictotals: input line = " . $metricdata; + gp_message ("debug", $subr_name, $msg); #------------------------------------------------------------------------------ # Ignoring whitespace, search for any line with a ":" in it, followed by -# a number with or without a dot. So, an integer or floating-point number. +# a number with, or without, a dot. So, an integer or floating-point number. #------------------------------------------------------------------------------ - if ($metricdata =~ /\s*(.*):\s+(\d+\.*\d*)/) + if ($metricdata =~ /$metrics_line_regex/) { - gp_message ("debug", $subr_name, " candidate => $metricdata"); - $metric = $1; - $value = $2; - if ( ($metric eq "PC Address") or ($metric eq "Size")) + $msg = "selected input line for processing"; + gp_message ("debug", $subr_name, $msg); + + if (defined($1) and defined($2)) { - gp_message ("debug", $subr_name, " skipped => $metric $value"); - next; + $metric = $1; + $value = $2; + $msg = "metric = " . $metric; + gp_message ("debug", $subr_name, $msg); + $msg = "value = " . $value; + gp_message ("debug", $subr_name, $msg); } - gp_message ("debug", $subr_name, " proceed => $metric $value"); - if ($metric eq '" count') + else + { + $msg = "unexpected input in " . $metricdata; + gp_message ("assertion", $subr_name, $msg); + } + #------------------------------------------------------------------------------ -# Hardware counter experiments have this info. Note that this line is not the -# first one to be encountered, so $last_metric has been defined already. +# Select the metrics of interest. #------------------------------------------------------------------------------ + if (($metric =~ /$metric_of_interest_1_regex/) or + ($metric =~ /$metric_of_interest_2_regex/) ) { - $metric = $last_metric." Count"; # we presume ....... - gp_message ("debug", $subr_name, "last_metric = $last_metric metric = $metric"); + $msg = "metric of interest = " . $metric; + $msg .= " - proceed with processing"; + gp_message ("debug", $subr_name, $msg); } - $i=index ($metricdata,":"); - $r=rindex ($metricdata,":"); - gp_message ("debug", $subr_name, "metricdata = $metricdata => i = $i r = $r"); - if ($i == $r) + else { - if ($value > 0) # Not interested in metrics contributing zero - { - $metric_value{$metric} = $value; - gp_message ("debug", $subr_name, "archived metric_value{$metric} = $metric_value{$metric}"); - # e.g. $metric_value{Exclusive Total Thread Time} = 302.562 - # e.g. $metric_value{Exclusive Instructions Executed} = 2415126222484 - } + $msg = "metric = " . $metric; + $msg .= " - ignored and further processing is skipped"; + gp_message ("debug", $subr_name, $msg); + next; } - else + #------------------------------------------------------------------------------ -# TBD This code deals with an old bug and may be removed. +# When we get here, it means that this is a metric we want to process. #------------------------------------------------------------------------------ - { # er_print bug - e.g. -# Exclusive Instructions Per Cycle: Inclusive Instructions Per Cycle: Exclusive Cycles Per Instruction: Inclusive Cycles Per Instruction: Exclusive OpenMP Work Time: 162.284 (100.0%) - gp_message ("debug", $subr_name, "metrictotals odd line:->$metricdata<-"); - $r=rindex ($metricdata,":",$r-1); - if ($r == -1) - { # ignore - gp_message ("debug", $subr_name, "metrictotals odd line ignored<-"); - $last_metric = "foo"; - next; - } - my ($good_part)=substr ($metricdata,$r+1); - if ($good_part =~ /\s*(.*):\s+(\d+\.*\d*)/) - { - $metric = $1; - $value = $2; - if ($value>0) # Not interested in metrics contributing zero - { - $metric_value{$metric} = $value; - $msg = "metrictotals odd line rescued '$metric'=$value"; - gp_message ("debug", $subr_name, $msg); - } - } + +#------------------------------------------------------------------------------ +# TBD - Still needed? Don't see it in the input anymore (?) +#------------------------------------------------------------------------------ + if ($metric eq '" count') +#------------------------------------------------------------------------------ +# Hardware counter experiments have this info. Note that this line is not the +# first one to be encountered, so $last_metric has been defined already. +#------------------------------------------------------------------------------ + { + $metric = $last_metric . " Count"; + $msg = "last_metric = $last_metric metric = $metric"; + gp_message ("debug", $subr_name, $msg); } + + $metric_value{$metric} = $value; + $msg = "archived: metric_value{$metric} = " . + $metric_value{$metric}; + gp_message ("debug", $subr_name, $msg); #------------------------------------------------------------------------------ # Preserve the current metric. #------------------------------------------------------------------------------ @@ -13684,20 +13767,26 @@ sub process_metrics_data if (scalar (keys %metric_value) == 0) #------------------------------------------------------------------------------ -# If we have no metrics > 0, fudge a "Exclusive Total CPU Time", else we -# blow up later. -# -# TBD: See if this can be handled differently. +# This means that there are no metrics in the input file. That is a fatal +# error and execution is terminated. #------------------------------------------------------------------------------ { - $metric_value{"Exclusive Total CPU Time"} = 0; - gp_message ("debug", $subr_name, "no metrics found and a stub was added"); + $msg = "no metrics have been found in the input file"; + gp_message ("assertion", $subr_name, $msg); + } + else +#------------------------------------------------------------------------------ +# All is well. Print the metrics that have been found. +#------------------------------------------------------------------------------ + { + $msg = "stored the following metrics and values:"; + gp_message ("debug", $subr_name, $msg); + for my $metric (sort keys %metric_value) + { + $msg = "metric_value{$metric} = " . $metric_value{$metric}; + gp_message ("debug", $subr_name, $msg); + } } - - for my $metric (sort keys %metric_value) - { - gp_message ("debug", $subr_name, "Stored metric_value{$metric} = $metric_value{$metric}"); - } gp_message ("debug", $subr_name, "proceed to process file $outfile1"); @@ -13740,7 +13829,7 @@ sub process_metrics_data $metric_line = $_; chomp ($metric_line); - gp_message ("debug", $subr_name, "processing line $metric_line"); + gp_message ("debug", $subr_name, "processing line: $metric_line"); #------------------------------------------------------------------------------ # The original regex has bugs because the line should not be allowed to start # with a ":". So this is wrong: @@ -13759,113 +13848,113 @@ sub process_metrics_data #------------------------------------------------------------------------------ # Ruud if (($metric =~ /\s*(.*):\s+(\S)((\.\S+)|(\+\S+))/) && !($metric =~/^Current/)){ - ($metric_spec, $metric_flavor, $metric_visibility, $metric_name, $metric_text) = + ($metric_spec, $metric_flavor, $metric_visibility, $metric_name, + $metric_text) = extract_metric_specifics ($metric_line); # if (($metric_line =~ /\s*(.+):\s+([ei])([\.\+%]+)(\S*)/) and !($metric_line =~/^Current/)) if ($metric_spec eq "skipped") { - gp_message ("debug", $subr_name, "skipped line: $metric_line"); + $msg = "skipped processing line: " . $metric_line; + gp_message ("debug", $subr_name, $msg); + next } - else - { - gp_message ("debug", $subr_name, "line of interest: $metric_line"); + $msg = "line of interest: " . $metric_line; + gp_message ("debug", $subr_name, $msg); - $metric_found{$metric_spec} = 1; + $metric_found{$metric_spec} = $TRUE; - if ($g_user_settings{"ignore_metrics"}{"defined"}) +#------------------------------------------------------------------------------ +# TBD +# Currently always FALSE since this feature has not been fully implemented yet. +#------------------------------------------------------------------------------ + if ($g_user_settings{"ignore_metrics"}{"defined"}) + { + gp_message ("debug", $subr_name, "check for $metric_spec"); + if (exists ($ignored_metrics{$metric_name})) { - gp_message ("debug", $subr_name, "check for $metric_spec"); - if (exists ($ignored_metrics{$metric_name})) - { - gp_message ("debug", $subr_name, "user asked to ignore metric $metric_name"); - next; - } - } + $msg = "user asked to ignore metric " . $metric_name; + gp_message ("debug", $subr_name, $msg); + $msg = "further processing of line of interest is skipped"; + gp_message ("debug", $subr_name, $msg); + next; + } + } #------------------------------------------------------------------------------ # This metric is not on the ignored list and qualifies, so store it. #------------------------------------------------------------------------------ - $metric_description{$metric_spec} = $metric_text; + $metric_description{$metric_spec} = $metric_text; # TBD: add for other visibilities too, like + - gp_message ("debug", $subr_name, "stored $metric_description{$metric_spec} = $metric_description{$metric_spec}"); + $msg = "stored metric_description{$metric_spec} = "; + $msg .= $metric_description{$metric_spec}; + gp_message ("debug", $subr_name, $msg); - if ($metric_flavor ne "e") - { - gp_message ("debug", $subr_name, "metric $metric_spec is ignored"); - } - else + if ($metric_flavor ne "e") + { + $msg = "metric $metric_spec is ignored"; + gp_message ("debug", $subr_name, $msg); + $msg = "further processing of this line is skipped"; + gp_message ("debug", $subr_name, $msg); + } + else #------------------------------------------------------------------------------ # Only the exclusive metrics are shown. #------------------------------------------------------------------------------ - { - gp_message ("debug", $subr_name, "metric $metric_spec ($metric_text) is considered"); + { + $msg = "metric $metric_spec ($metric_text) is considered"; + gp_message ("debug", $subr_name, $msg); - if ($metric_spec =~ /user/) - { - $user_metrics = $TRUE; - gp_message ("debug", $subr_name, "m: user_metrics set to TRUE"); - } - elsif ($metric_spec =~ /system/) - { - $system_metrics = $TRUE; - gp_message ("debug", $subr_name, "m: system_metrics set to TRUE"); - } - elsif ($metric_spec =~ /wall/) - { - $wall_metrics = $TRUE; - gp_message ("debug", $subr_name, "m: wall_metrics set to TRUE"); - } #------------------------------------------------------------------------------ -# TBD I don't see why these need to be skipped. Also, should be totalcpu. +# Legacy metrics, but may re-appear one day and so the code is left in here. #------------------------------------------------------------------------------ - elsif (($metric_spec =~ /^e\.total$/) or ($metric_spec =~/^e\.total_cpu$/)) - { - # skip total thread time and total CPU time - gp_message ("debug", $subr_name, "m: skip above"); - } - elsif (defined ($metric_value{$metric_text})) + if ($metric_spec =~ /user/) + { + $user_metrics = $TRUE; + $msg = "user_metrics set to TRUE"; + gp_message ("debug", $subr_name, $msg); + } + elsif ($metric_spec =~ /system/) + { + $system_metrics = $TRUE; + $msg = "system_metrics set to TRUE"; + gp_message ("debug", $subr_name, $msg); + } + elsif ($metric_spec =~ /wall/) + { + $wall_metrics = $TRUE; + $msg = "wall_metrics set to TRUE"; + gp_message ("debug", $subr_name, $msg); + } + elsif (defined ($metric_value{$metric_text})) + { + $msg = "total attributed to this metric "; + $msg .= "metric_value{" . $metric_text . "} = "; + $msg .= $metric_value{$metric_text}; + gp_message ("debug", $subr_name, $msg); + + if ($summary_metrics ne '') { - gp_message ("debug", $subr_name, "Total attributed to this metric metric_value{$metric_text} = $metric_value{$metric_text}"); - if ($summary_metrics ne '') - { - $summary_metrics = $summary_metrics.':'.$metric_spec; - gp_message ("debug", $subr_name, "updated summary_metrics = $summary_metrics - 1"); - if ($metric_spec !~ /\.wait$|\.ulock$|\.text$|\.data$|\.owait$|total$|mpiwork$|mpiwait$|ompwork$|ompwait$/) - { - $detail_metrics = $detail_metrics.':'.$metric_spec; - gp_message ("debug", $subr_name, "updated m:detail_metrics=$detail_metrics - 1"); - $detail_metrics_system = $detail_metrics_system.':'.$metric_spec; - gp_message ("debug", $subr_name, "updated m:detail_metrics_system=$detail_metrics_system - 1"); - } - else - { - gp_message ("debug", $subr_name, "m: no want above metric for detail_metrics or detail_metrics_system"); - } - } - else - { - $summary_metrics = $metric_spec; - gp_message ("debug", $subr_name, "initialized summary_metrics = $summary_metrics - 2"); - if ($metric_spec !~ /\.wait$|\.ulock$|\.text$|\.data$|\.owait$|total$|mpiwork$|mpiwait$|ompwork$|ompwait$/) - { - $detail_metrics = $metric_spec; - gp_message ("debug", $subr_name, "m:detail_metrics=$detail_metrics - 2"); - $detail_metrics_system = $metric_spec; - gp_message ("debug", $subr_name, "m:detail_metrics_system=$detail_metrics_system - 2"); - } - else - { - gp_message ("debug", $subr_name, "m: no want above metric for detail_metrics or detail_metrics_system"); - } - } - gp_message ("debug", $subr_name, " metric $metric_spec added"); + $summary_metrics .= ':' . $metric_spec; + $msg = "updated summary_metrics = " . $summary_metrics; + gp_message ("debug", $subr_name, $msg); } else { - gp_message ("debug", $subr_name, "m: no want above metric was a 0 total"); + $summary_metrics = $metric_spec; + $msg = "initialized summary_metrics = " . $summary_metrics; + gp_message ("debug", $subr_name, $msg); } + gp_message ("debug", $subr_name, "metric $metric_spec added"); + } + else + { +#------------------------------------------------------------------------------ +# TBD: This doesn't seem to make much sense. +#------------------------------------------------------------------------------ + $msg = "no action taken for " . $metric_spec; + gp_message ("debug", $subr_name, $msg); } } } @@ -13874,21 +13963,32 @@ sub process_metrics_data if ($wall_metrics > 0) { - gp_message ("debug", $subr_name,"m:wall_metrics set adding to summary_metrics"); + $msg = "adding e.wall to summary_metrics"; + gp_message ("debug", $subr_name, $msg); $summary_metrics = "e.wall:".$summary_metrics; - gp_message ("debug", $subr_name,"m:summary_metrics=$summary_metrics - 3"); + $msg = "after update summary_metrics = " . $summary_metrics; + gp_message ("debug", $subr_name, $msg); } if ($system_metrics > 0) { - gp_message ("debug", $subr_name,"m:system_metrics set adding to summary_metrics,call_metrics and detail_metrics_system"); - $summary_metrics = "e.system:".$summary_metrics; - $call_metrics = "i.system:".$call_metrics; - $detail_metrics_system ='e.system:'.$detail_metrics_system; + $msg = "adding e.system to summary_metrics and detail_metrics_system"; + gp_message ("debug", $subr_name, $msg); + + $summary_metrics = "e.system:" . $summary_metrics; + $detail_metrics_system = "e.system:" . $detail_metrics_system; + + $msg = "adding i.system to call_metrics"; + gp_message ("debug", $subr_name, $msg); - gp_message ("debug", $subr_name,"m:summary_metrics=$summary_metrics - 4"); - gp_message ("debug", $subr_name,"m:call_metrics=$call_metrics"); - gp_message ("debug", $subr_name,"m:detail_metrics_system=$detail_metrics_system - 3"); + $call_metrics = "i.system:" . $call_metrics; + + $msg = "after update summary_metrics = " . $summary_metrics; + gp_message ("debug", $subr_name, $msg); + $msg = "after update call_metrics = " . $call_metrics; + gp_message ("debug", $subr_name, $msg); + $msg = "after update detail_metrics_system = " . $detail_metrics_system; + gp_message ("debug", $subr_name, $msg); } @@ -13898,7 +13998,6 @@ sub process_metrics_data if ($user_metrics > 0) { - gp_message ("debug", $subr_name,"m:user_metrics set adding to summary_metrics,detail_metrics,detail_metrics_system and call_metrics"); # Ruud if (!exists ($IMETRICS{"i.user"})){ if ($g_user_settings{"ignore_metrics"}{"defined"} and exists ($ignored_metrics{"user"})) { @@ -13908,14 +14007,12 @@ sub process_metrics_data { $summary_metrics = "e.user:i.user:".$summary_metrics; } + $detail_metrics = "e.user:".$detail_metrics; $detail_metrics_system = "e.user:".$detail_metrics_system; - gp_message ("debug", $subr_name,"m:summary_metrics=$summary_metrics - 5"); - gp_message ("debug", $subr_name,"m:detail_metrics=$detail_metrics - 3"); - gp_message ("debug", $subr_name,"m:detail_metrics_system=$detail_metrics_system - 4"); - - if ($g_user_settings{"ignore_metrics"}{"defined"} and exists ($ignored_metrics{"user"})) + if ($g_user_settings{"ignore_metrics"}{"defined"} and + exists ($ignored_metrics{"user"})) { $call_metrics = "a.user:".$call_metrics; } @@ -13923,28 +14020,47 @@ sub process_metrics_data { $call_metrics = "a.user:i.user:".$call_metrics; } - gp_message ("debug", $subr_name,"m:call_metrics=$call_metrics - 2"); + $msg = "updated summary_metrics = " . $summary_metrics; + gp_message ("debug", $subr_name, $msg); + $msg = "updated detail_metrics = " . $detail_metrics; + gp_message ("debug", $subr_name, $msg); + $msg = "updated detail_metrics_system = " . $detail_metrics_system; + gp_message ("debug", $subr_name, $msg); + $msg = "updated call_metrics = " . $call_metrics; + gp_message ("debug", $subr_name, $msg); + } +#------------------------------------------------------------------------------ +# TBD +# It doesn't look right in case call_metrics ends up being set to "" +#------------------------------------------------------------------------------ if ($call_metrics eq "") { $call_metrics = $detail_metrics; - - gp_message ("debug", $subr_name,"m:call_metrics is not set, setting it to detail_metrics "); - gp_message ("debug", $subr_name,"m:call_metrics=$call_metrics - 3"); + $msg = "call_metrics is not set, setting it to " . $call_metrics; + gp_message ("debug", $subr_name, $msg); + if ($detail_metrics eq '') + { + $msg = "detail_metrics and call_metrics are blank and could"; + $msg .= " cause trouble later on"; + gp_message ("debug", $subr_name, $msg); + } } for my $metric (sort keys %ignored_metrics) { if ($ignored_metrics{$metric}) { - gp_message ("debug", $subr_name, "active metric, but ignored: $metric"); + $msg = "active metric, but ignored: " . $metric; + gp_message ("debug", $subr_name, $msg); } } - return (\%metric_value, \%metric_description, \%metric_found, $user_metrics, $system_metrics, $wall_metrics, - $summary_metrics, $detail_metrics, $detail_metrics_system, $call_metrics); + return (\%metric_value, \%metric_description, \%metric_found, $user_metrics, + $system_metrics, $wall_metrics, $summary_metrics, $detail_metrics, + $detail_metrics_system, $call_metrics); } #-- End of subroutine process_metrics_data |