On Mon, 30 Nov 2009, Avantika Mathur wrote:

The data collection doesn't seem to work, when I run it, I get this error:
Argument "STREAM" isn't numeric in addition (+) at
/root/libhugetlbfs-2.6-17-g8ca78b6/TLBC/OpCollect.pm line 120.

I did not get any information about percentage of cycles spent on
tlb misses.  Also, there are nit-picky comments below.

Eric

> Please review my preliminary patch to add percentage of time spent on DTLB 
> misses to cpupcstat.
> I appreciate your feedback.
> 
> Thank you
> 
> Avantika 
> 
> -----
> 
> 
> This patch adds percentage of execution time spent servicing DTLB misses to 
> the results of the cpupcstat script.  This is a preliminary patch which
> makes changes to OProfile collection, adding collection of execution time
> in cycles, but does not make changes to data collection using Perf.
> It assumes that a file tlbmiscost.config exists under libhugetlbfs, 
> containing the tlb miss cost in format: TLBMISSCOST=n, where n is the tlb
> miss cost measured in cycles.
> 
> Signed-off-by: Avantika Mathur <mat...@us.ibm.com>
> ---
>  TLBC/OpCollect.pm      |   40 ++++++++++++++++++++++++++--------------
>  cpupcstat              |   28 ++++++++++++++++++++++++----
>  oprofile_map_events.pl |   13 ++++++++++---
>  3 files changed, 60 insertions(+), 21 deletions(-)
> 
> diff -uprN libhugetlbfs/cpupcstat libhugetlbfs-new/cpupcstat
> --- libhugetlbfs/cpupcstat    2009-09-01 19:01:29.000000000 -0400
> +++ libhugetlbfs-new/cpupcstat        2009-11-29 23:26:58.000000000 -0500
> @@ -26,6 +26,14 @@ my $time_limit;
>  my $persist = 0;
>  my $kernel;
>  my $force_oprofile;
> +my $tlbcostconfig="tlbmisscost.config";
> +my $data;
> +my $cycles_executed;
> +my $cycles_miss;
> +my $tlbmisscost;
> +my $percent;
> +my $samples_timer;
> +my $samples_dtlb;
> 
>  sub start_target()
>  {
> @@ -52,6 +60,7 @@ sub run_profile()
>       my $new;
>       my $collector;
> 
> +     printf("BIng is %s \n", $Bin);

Is BIng supposed to be Bin?

>       if ($force_oprofile) {
>               $collector = TLBC::OpCollect->new();
>       } else {
> @@ -63,7 +72,7 @@ sub run_profile()
>       if ($collector->setup($vmlinux, "dtlb_miss") == 0) {
>               $collector = TLBC::OpCollect->new();
>               if ($force_oprofile ||
> -                     $collector->setup($vmlinux, "dtlb_miss") == 0) {
> +                     $collector->setup($vmlinux, "timer,dtlb_miss") == 0) {
>                       die("Unable to setup data collector");
>               }
>       }
> @@ -86,17 +95,18 @@ sub run_profile()
>       $binName = `basename $binName`;
>       chomp($binName);
> 
> +     ($samples_timer, $samples_dtlb) = split(/,/, $collector->samples());
>       printf("%20s%20s%24s\n", "Target Name", "DTLB Miss Samples",
>               "Samples/second");
> 
> -     printf("%20s%20s%24s\n", "", "Sample every " . $collector->samples(), 
> "");
> +     printf("%20s%20s%24s\n", "", "Sample every " . $samples_dtlb, "");
>       sleep($wait_time);
> 
>       # While our target is still running and we have not exceeded our
>       # runtime, collect oprofile data every $wait_time seconds to display
>       # the dtlb miss rate.
>       while (waitpid($pid, WNOHANG) <= 0 || $persist) {
> -             $ret = $collector->get_current_eventcount($binName);
> +             ($new,$ret) = split(/,/, 
> $collector->get_current_eventcount($binName));
>               $new = $ret - $prev;
>               printf("%20s%20d%24f\n", $binName, $new, $new / $wait_time);
>               $prev = $ret;
> @@ -116,7 +126,7 @@ sub run_profile()
>       }
>       $end_time = time();
>       $time_elapsed = $end_time - $start_time;
> -     $misses = $collector->get_current_eventcount($binName);
> +     ($cycles_executed, $misses) = split(/,/, 
> $collector->get_current_eventcount($binName));
>       if ($kernel) {
>               $kern_misses = $collector->get_current_eventcount("vmlinux");
>       }
> @@ -192,6 +202,16 @@ if ($misses > 0) {
>       print("\n$target saw $misses total DTLB miss samples over ",
>               "$time_elapsed seconds\n");
>       print("at rate of ", $misses / $time_elapsed, " samples/second\n");
> +     open(DAT, $tlbcostconfig) || die("Failed to open file %s", 
> $tlbcostconfig);
> +     $data=<DAT>;
> +     close(DAT);
> +     ($data,$tlbmisscost)=split(/\=/,$data);
> +     chomp($tlbmisscost);
> +
> +     $cycles_executed = $cycles_executed * $samples_timer;
> +     $cycles_miss = $tlbmisscost * $misses * $samples_dtlb;
> +     $percent=($cycles_miss / $cycles_executed) * 100;
> +     print("$percent%", " of the execution time was spent servicing DTLB 
> misses\n");
>  }
> 
>  if ($kern_misses > 0) {
> diff -uprN libhugetlbfs/oprofile_map_events.pl 
> libhugetlbfs-new/oprofile_map_events.pl
> --- libhugetlbfs/oprofile_map_events.pl       2009-11-24 15:14:58.000000000 
> -0500
> +++ libhugetlbfs-new/oprofile_map_events.pl   2009-11-29 23:48:44.000000000 
> -0500
> @@ -17,6 +17,7 @@ my $opt_event;
>  my $opt_cycle_factor=1;
>  my $opt_event_factor=1;
>  my $p = "oprofile_map_events.pl";
> +my $verify = 0;
> 
>  my $oprofile_event;
>  my (%map_event_name, %map_event_mask);
> @@ -85,6 +86,7 @@ open (CPUTYPE, "/proc/sys/dev/oprofile/c
>       open (CPUTYPE, "/dev/oprofile/cpu_type") ||
>               die("Failed to open cpu_type oprofile device");
>  ($arch, $cputype) = split(/\//, <CPUTYPE>);
> +$cputype="970MP";

I think that this is a rement of testing.

>  close CPUTYPE;
>  printVerbose("$p\::arch = $arch\n");
>  printVerbose("$p\::cputype = $cputype\n");
> @@ -124,14 +126,19 @@ if ($opt_cycle_factor != 1 || $opt_event
>  open (VERIFY, "opcontrol --list-events|") || die("Failed to exec opcontrol");
>  my ($oprofile_event_name) = split(/:/, $oprofile_event);
>  printVerbose("$p\::checking $oprofile_event_name\n");
> +printVerbose("oprofile_event: %s, oprofile_event_name: %s\n", 
> $oprofile_event, $oprofile_event_name);
>  while (!eof(VERIFY)) {
>       if (<VERIFY> =~ /^$oprofile_event_name:/) {
>               close(VERIFY);
>               print "$oprofile_event\n";
> +             $verify = 1;
>               exit(0);
>       }
>  }
>  close(VERIFY);
> -printVerbose("$p\::opcontrol --list-events disagrees\n");
> -print "UNKNOWN_OPROFILE_DISPARITY\n";
> -exit(-3);
> +if ( $verify == 0) {
> +     printVerbose("$p\::opcontrol --list-events disagrees\n");
> +     print "UNKNOWN_OPROFILE_DISPARITY\n";
> +     exit(-3);
> +}
> +exit(0);
> diff -uprN libhugetlbfs/TLBC/OpCollect.pm libhugetlbfs-new/TLBC/OpCollect.pm
> --- libhugetlbfs/TLBC/OpCollect.pm    2009-09-01 19:01:29.000000000 -0400
> +++ libhugetlbfs-new/TLBC/OpCollect.pm        2009-11-30 00:15:00.000000000 
> -0500
> @@ -18,7 +18,7 @@ use TLBC::DataCollect;
> 
>  our @ISA = qw(TLBC::DataCollect);
> 
> -my $count = 0;
> +my $count = " ";
>  my $reference;
> 
>  #use interface 'DataCollect';
> @@ -38,8 +38,12 @@ sub _setup_oprofile()
>       my $self = shift;
>       my $vmlinux = shift;
>       my $event = shift;
> -     my $cmd = "$Bin/oprofile_start.sh --vmlinux=$vmlinux " .
> -                "--event=$event  > /dev/null 2>&1";
> +     my @events = split(/,/, $event);
> +     my $list = "";
> +     foreach $event (@events) {
> +             $list = "--event $event $list";
> +     }
> +     my $cmd = "$Bin/oprofile_start.sh --vmlinux=$vmlinux $list";
>       system($cmd) == 0 or return 0;
>       return $self;
>  }
> @@ -50,14 +54,18 @@ sub _get_event()
>       my $event = shift;
>       my @vals;
>       my $lowlevel_event;
> -     $lowlevel_event = `$Bin/oprofile_map_events.pl --event $event 
> 2>/dev/null`;
> -     chomp($lowlevel_event);
> -     if ($lowlevel_event eq "" || $lowlevel_event !~ /^[A-Z0-9_]+:[0-9]+/) {
> -             die "Unable to find $event event for this CPU\n";
> -     }
> +     my @events = split(/,/, $event);
> +
> +     foreach $event (@events) {
> +             $lowlevel_event = `$Bin/oprofile_map_events.pl --event $event 
> 2>/dev/null`;
> +             chomp($lowlevel_event);
> +             if ($lowlevel_event eq "" || $lowlevel_event !~ 
> /^[A-Z0-9_]+:[0-9]+/) {
> +                     die "Unable to find $event event for this CPU\n";
> +             }
> +             @vals = split(/:/, $lowlevel_event);
> +             $count = "$count $vals[1],";
> +        }
> 
> -     @vals = split(/:/, $lowlevel_event);
> -     $count = $vals[1];
>       return $self;
>  }
> 
> @@ -93,9 +101,11 @@ sub get_current_eventcount()
>       my @results;
>       my $line;
>       my $report;
> -     my $hits = 0;
> +     my $event1 = 0;
> +     my $event2 = 0;
>       my $self = shift;
>       my $binName = shift;
> +     my $return;
> 
>       system("opcontrol --dump > /dev/null 2>&1");
>       $report = `opreport`;
> @@ -105,11 +115,13 @@ sub get_current_eventcount()
>                       chomp($line);
>                       $line =~ s/^\s+//;
>                       $line =~ s/\s+$//;
> -                     my @vals = split(/ /, $line);
> -                     $hits += $vals[0];
> +                     my @vals = split(/\s+/, $line);
> +                     $event1 += $vals[0];
> +                     $event2 += $vals[2];
>               }
>       }
> -     return $hits;
> +     $return = "$event1,$event2";
> +     return $return;
>  }
> 
>  sub shutdown()
> 
> 

-- 
Eric B Munson
IBM Linux Technology Center
ebmun...@us.ibm.com

Attachment: signature.asc
Description: Digital signature

------------------------------------------------------------------------------
Join us December 9, 2009 for the Red Hat Virtual Experience,
a free event focused on virtualization and cloud computing. 
Attend in-depth sessions from your desk. Your couch. Anywhere.
http://p.sf.net/sfu/redhat-sfdev2dev
_______________________________________________
Libhugetlbfs-devel mailing list
Libhugetlbfs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel

Reply via email to