Actions

icon Post
text/html Subscribe
text/html Unsubscribe

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[vsipl++] [patch] Generalize datasheet.pl


  • To: VSIPL++ Developers List <vsipl++@xxxxxxxxxxxxxxxx>
  • Subject: [vsipl++] [patch] Generalize datasheet.pl
  • From: Jules Bergmann <jules@xxxxxxxxxxxxxxxx>
  • Date: Wed, 26 Mar 2008 14:52:08 -0400

This generalizes datasheet.pl script to read description from a file (instead of being hard coded).

Patch applied.

				-- Jules
--
Jules Bergmann
CodeSourcery
jules@xxxxxxxxxxxxxxxx
(650) 331-3385 x705
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 196915)
+++ ChangeLog	(working copy)
@@ -1,3 +1,8 @@
+2008-03-26  Jules Bergmann  <jules@xxxxxxxxxxxxxxxx>
+
+	* scripts/datasheet.pl: Move configuration into external file.
+	  Add support for csv output.
+
 2008-03-18  Jules Bergmann  <jules@xxxxxxxxxxxxxxxx>
 
 	Merge 1.4 MCOE updates.
Index: scripts/datasheet.pl
===================================================================
--- scripts/datasheet.pl	(revision 191870)
+++ scripts/datasheet.pl	(working copy)
@@ -12,7 +12,7 @@
    my ($db, $inf) = @_;
 
    if (!-f $inf) {
-      print "No $inf, skipping\n";
+      print "No $inf, SKIPPING\n";
       return;
       }
    open(IN, $inf) || die "Can't read '$inf': $!\n";
@@ -26,13 +26,23 @@
       last if $line[0] eq 'what';
       }
 
-   die 'Could not find leading "what"' if ($line[0] ne 'what');
+   die "Could not find leading 'what' in '$inf'" if ($line[0] ne 'what');
 
-   $line = <IN>; chomp($line); my ($t_nproc, $np) = split(',', $line);
-   $line = <IN>; chomp($line); my @keys           = split(',', $line);
+   my $np = 1;
+   my @keys;
 
-   die 'expected "nproc" on line 2' if ($t_nproc ne "nproc");
+   while ($line = <IN>) {
+      chomp($line);
+      my @l = split(',', $line);
 
+      $np = $l[1]      if ($l[0] eq 'nproc');
+      @keys = @l, last if ($l[0] eq 'size');
+      }
+
+   # $line = <IN>; chomp($line); my ($t_nproc, $np) = split(',', $line);
+   # $line = <IN>; chomp($line); my @keys           = split(',', $line);
+   # die 'expected "nproc" on line 2' if ($t_nproc ne "nproc");
+
    # my $k = "$bench-$case-$np";
    my $k = "$inf";
    $k =~ s/\.dat//;
@@ -41,10 +51,12 @@
    $db->{$k}{data} = {};
    $db->{$k}{file} = $inf;
 
-   print "$inf: $k\n";
+   # print "$inf: $k\n";
 
    while (<IN>) {
       chomp($_);
+      last if /^--/;
+
       my @line = split(',', $_);
 
       my $record = {size    => $line[0] + 0,
@@ -68,7 +80,7 @@
       my $wiob_pt = $line[7];
       my $loop    = $line[8];
       my $time    = $line[9];
-
+     
       $db->{$k}{data}{$size} = $record;
       }
    close(IN);
@@ -81,8 +93,10 @@
    my $metric = $opt{metric} || "mflop_s";
    my $rows   = $opt{rows}   || 1;
 
-   my @sizes = (1024, 8192);
+   my $sizes  = $opt{sizes}  || [1024, 8192];
 
+   my @sizes = @$sizes;
+
    return if (!defined $db->{$k} && $opt{optional});
 
    print OUT "$descr\n";
@@ -91,218 +105,178 @@
       return;
       }
 
-   my $x_name;
-   $x_name = "MFLOP/s" if ($metric eq 'mflop_s');
-   $x_name = "MB/s"    if ($metric eq 'r_mb_s');
-   $x_name = "Mpt/s"   if ($metric eq 'mpts_s');
+   printf OUT "  %5s  %7s  %7s", "Size", "us/call", "us/pt";
 
-   printf OUT "  %5s  %7s  %7s  %7s\n", "Size", "us/call", "us/pt", $x_name;
-   # printf OUT "  %5s  %7s  %7s  %7s\n", "", "(usec)", "(usec)", "";
+   foreach my $m (split(',', $metric)) {
+      my $x_name;
+      $x_name = "MFLOP/s" if ($m eq 'mflop_s');
+      $x_name = "MB/s"    if ($m eq 'r_mb_s');
+      $x_name = "MB/s"    if ($m eq 't_mb_s');
+      $x_name = "Mpt/s"   if ($m eq 'mpts_s');
+      printf OUT "  %8s", $x_name;
+      }
+   printf OUT "\n";
+   # printf OUT "  %5s  %7s  %7s  %8s\n", "", "(usec)", "(usec)", "";
 
    foreach my $size (@sizes) {
       my $mpts_s  = $db->{$k}{data}{$size}{med};	# median Mpts-sec
       my $ops_pt  = $db->{$k}{data}{$size}{ops_pt};
       my $riob_pt = $db->{$k}{data}{$size}{riob_pt};
-      my $us_pt   = 1 / $mpts_s; # sec/M-point aka usec/point
+      my $wiob_pt = $db->{$k}{data}{$size}{wiob_pt};
+      my $us_pt   = ($mpts_s == 0) ? 0 : 1 / $mpts_s; # sec/M-point aka usec/point
       my $s       = $size * $us_pt;
 
       my $mflop_s = $mpts_s * $ops_pt;
       my $r_mb_s  = $mpts_s * $riob_pt;
+      my $t_mb_s  = $mpts_s * ($riob_pt + $wiob_pt);
 
       # For 2D object, users like to think of point as 1,1 element,
       # rather than a column of elements.
       $us_pt /= $rows;
 
-      my $x;
-      $x = $mflop_s if ($metric eq 'mflop_s');
-      $x = $r_mb_s  if ($metric eq 'r_mb_s');
-      $x = $mpts_s  if ($metric eq 'mpts_s');
+      if ($size >= 1048576) {
+	 printf OUT "  %4.2f%s", ($size / 1048576), "M";
+	 }
+      else {
+	 printf OUT "  %5d", $size;
+	 }
 
-      printf OUT "  %5d  %7.1f  %7.5f  %7.2f\n", $size, $s, $us_pt, $x;
+      printf OUT "  %7.1f  %7.5f", $s, $us_pt;
+
+      foreach my $m (split(',', $metric)) {
+	 my $x;
+	 $x = $mflop_s if ($m eq 'mflop_s');
+	 $x = $r_mb_s  if ($m eq 'r_mb_s');
+	 $x = $t_mb_s  if ($m eq 't_mb_s');
+	 $x = $mpts_s  if ($m eq 'mpts_s');
+	 printf OUT "  %8.2f", $x;
+	 }
+      printf OUT "\n";
       }
    print OUT "\n";
    }
 
 
-sub header {
-   print OUT "=" x 73, "\n";
-   }
 
-   
+sub report_func_csv {
+   my ($db, $k, $descr, %opt) = @_;
 
-my $db = {};
+   my $metric = $opt{metric} || "mflop_s";
+   my $rows   = $opt{rows}   || 1;
 
-read_dat($db, "conv-3-1.dat");
-read_dat($db, "conv-6-1.dat");
-read_dat($db, "conv2d-3x3-3-1.dat");
-read_dat($db, "conv2d-5x5-3-1.dat");
+   my $sizes  = $opt{sizes}  || [1024, 8192];
 
-read_dat($db, "copy-1-1.dat");
-read_dat($db, "copy-5-1.dat");
+   my @sizes = @$sizes;
 
-read_dat($db, "maxval-1-1.dat");
+   return if (!defined $db->{$k} && $opt{optional});
 
-read_dat($db, "sumval-1-1.dat");
+   if (!defined $db->{$k}) {
+      foreach my $size (@sizes) {
+	 printf OUT "$descr, $k, $size\n";
+	 }
+      return;
+      }
 
-read_dat($db, "fft-11-1.dat");
-read_dat($db, "fft-12-1.dat");
-read_dat($db, "fft-13-1.dat");
-read_dat($db, "fft-15-1.dat");
-read_dat($db, "fft-16-1.dat");
-read_dat($db, "fft-17-1.dat");
+   foreach my $size (@sizes) {
+      my $mpts_s  = $db->{$k}{data}{$size}{med};	# median Mpts-sec
+      my $ops_pt  = $db->{$k}{data}{$size}{ops_pt};
+      my $riob_pt = $db->{$k}{data}{$size}{riob_pt};
+      my $wiob_pt = $db->{$k}{data}{$size}{wiob_pt};
+      my $us_pt   = ($mpts_s == 0) ? 0 : 1 / $mpts_s; # sec/M-point aka usec/point
+      my $s       = $size * $us_pt;
 
-read_dat($db, "ipp-fft-1-1.dat");
+      my $mflop_s = $mpts_s * $ops_pt;
+      my $r_mb_s  = $mpts_s * $riob_pt;
+      my $t_mb_s  = $mpts_s * ($riob_pt + $wiob_pt);
 
-read_dat($db, "fftw3-fft-11-1.dat");
-read_dat($db, "fftw3-fft-12-1.dat");
-read_dat($db, "fftw3-fft-51-1.dat");
-read_dat($db, "fftw3-fft-52-1.dat");
+      # For 2D object, users like to think of point as 1,1 element,
+      # rather than a column of elements.
+      $us_pt /= $rows;
 
-read_dat($db, "sal-fft-1-1.dat");
-read_dat($db, "sal-fft-2-1.dat");
-read_dat($db, "sal-fft-5-1.dat");
-read_dat($db, "sal-fft-6-1.dat");
-read_dat($db, "sal-fft-11-1.dat");
-read_dat($db, "sal-fft-12-1.dat");
-read_dat($db, "sal-fft-15-1.dat");
-read_dat($db, "sal-fft-16-1.dat");
+      printf OUT "$descr, $k, $size, $s, $us_pt, $mflop_s, $r_mb_s, $t_mb_s, $mpts_s\n";
+      }
+   }
 
-read_dat($db, "vma-1-1.dat");
-read_dat($db, "vma-2-1.dat");
-read_dat($db, "vma-3-1.dat");
-read_dat($db, "vma-11-1.dat");
-read_dat($db, "vma-12-1.dat");
-read_dat($db, "vma-13-1.dat");
 
-read_dat($db, "vmin-1-1.dat");
+sub header {
+   print OUT "=" x 73, "\n";
+   }
 
-read_dat($db, "vmul-1-1.dat");
-read_dat($db, "vmul-2-1.dat");
-read_dat($db, "vmul-31-1.dat");
 
-read_dat($db, "sal-vmul-11-1.dat");
-read_dat($db, "sal-vmul-31-1.dat");
 
-read_dat($db, "svmul-1-1.dat");
+# --------------------------------------------------------------------- #
+sub read_db {
+   my ($db, $macro, $order, $file) = @_;
 
-read_dat($db, "vthresh-1-1.dat");
-read_dat($db, "vthresh-2-1.dat");
-read_dat($db, "vthresh-3-1.dat");
-read_dat($db, "vthresh-5-1.dat");
-read_dat($db, "vthresh-11-1.dat");
 
-read_dat($db, "sal-vthresh-1-1.dat");
-read_dat($db, "sal-vthresh-2-1.dat");
-read_dat($db, "sal-lvgt-1-1.dat");
-read_dat($db, "sal-lvgt-2-1.dat");
+   open(FILE, $file) || die "Can't read '$file': $!\n";
 
-read_dat($db, "vgt_ite-1-1.dat");
-read_dat($db, "vgt_ite-2-1.dat");
-read_dat($db, "vgt_ite-5-1.dat");
+   while (<FILE>) {
+      if (/^set:\s*([\w_\d\-]+)/) {
+	 my $set = $1;
+	 push @$order, $set;
+	 $db->{$set} = {};
+	 while (<FILE>) {
+            last if /^\s*$/;
+	    if (/\s+(\w+):\s*(.+)$/) {
+	       $db->{$set}{$1} = $2;
+	       }
+	    }
+	 }
+      elsif (/^macro:\s*([\w-]+)\s+(.+)$/) {
+	 $macro->{$1} = [split(/\s+/, $2)];
+	 }
+      }
+   close(FILE);
 
-open(OUT, "> report");
+   return $db, $macro;
+}
 
-# Conv
-header();
+my $dsinfo = "/home/jules/ds.info";
+my $fmt    = "text";
+my $ofile  = "report";
 
-report_func($db, "conv-3-1", "conv: 1D min-support convolution (16 point kernel) (float)");
-report_func($db, "conv-6-1", "conv: 1D min-support convolution (16 point kernel) (complex-float)");
+while (@ARGV) {
+   my $arg = shift @ARGV;
+   
+   $dsinfo = shift @ARGV, next if ($arg eq '-db');
+   $fmt    = shift @ARGV, next if ($arg eq '-fmt');
+   $ofile  = shift @ARGV, next if ($arg eq '-o');
+   }
 
-report_func($db, "conv2d-3x3-3-1", "conv: 2D min-support convolution (3x3 kernel, 256 rows) (float)", rows => 256);
-report_func($db, "conv2d-5x5-3-1", "conv: 2D min-support convolution (5x5 kernel, 256 rows) (float)", rows => 256);
+if (!-f $dsinfo) {
+   die "ERROR: Can't find dsinfo '$dsinfo'\n";
+   }
 
-# Copy
-header();
+my $db = {};
+my $descr = {};
+my $macro = {};
+my $order = [];
+print "read_db: $dsinfo\n";
+read_db($descr, $macro, $order, $dsinfo);
 
-report_func($db, "copy-1-1", "copy: vector copy (Z = A) (float)", metric => "r_mb_s");
-report_func($db, "copy-5-1", "copy (vendor): vector copy (memcpy) (float)", metric => "r_mb_s");
+foreach my $k (keys %$descr) {
+   read_dat($db, "$k.dat");
+   }
 
-# Fastconv
+open(OUT, "> $ofile");
+if ($fmt eq 'csv') {
+   printf OUT "descr, k, size, time (s), us/pt, MF/s, R MB/s, T MB/s, MPt/s\n";
+   }
 
-# FFT
-header();
-
-report_func($db, "fft-11-1", "fft: Out-of-place CC Fwd FFT (fft(A, Z))");
-report_func($db, "fft-12-1", "fft: In-place CC Fwd FFT (fft(AZ))");
-report_func($db, "fft-13-1", "fft: By-value CC Fwd FFT (Z = fft(A))");
-report_func($db, "fft-15-1", "fft: Out-of-place CC Inv FFT (fft(A, Z))");
-report_func($db, "fft-16-1", "fft: In-place CC Inv FFT (fft(AZ))");
-report_func($db, "fft-17-1", "fft: By-value CC Inv FFT (Z = fft(A))");
-
-# Vendor FFT
-header();
-
-report_func($db, "fftw3-fft-11-1", "fft (vendor-fftw3): Out-of-place CC Fwd FFT (inter complex)", optional => 1);
-report_func($db, "fftw3-fft-12-1", "fft (vendor-fftw3): In-place CC Fwd FFT (inter complex)", optional => 1);
-report_func($db, "fftw3-fft-51-1", "fft (vendor-fftw3): Out-of-place CC Fwd FFT (split complex)", optional => 1);
-report_func($db, "fftw3-fft-51-1", "fft (vendor-fftw3): In-place CC Fwd FFT (split complex)", optional => 1);
-
-report_func($db, "ipp-fft-1-1", "fft (vendor-IPP): Out-of-place CC Fwd FFT (inter complex)", optional => 1);
-
-report_func($db, "sal-fft-1-1", "fft (vendor-SAL): Out-of-place CC Fwd FFT (split complex)", optional => 1);
-report_func($db, "sal-fft-2-1", "fft (vendor-SAL): In-place CC Fwd FFT (split complex)", optional => 1);
-report_func($db, "sal-fft-5-1", "fft (vendor-SAL): Out-of-place CC Inv FFT (split complex)", optional => 1);
-report_func($db, "sal-fft-6-1", "fft (vendor-SAL): In-place CC Inv FFT (split complex)", optional => 1);
-report_func($db, "sal-fft-11-1", "fft (vendor-SAL): Out-of-place CC Fwd FFT (inter complex)", optional => 1);
-report_func($db, "sal-fft-12-1", "fft (vendor-SAL): In-place CC Fwd FFT (inter complex)", optional => 1);
-report_func($db, "sal-fft-15-1", "fft (vendor-SAL): Out-of-place CC Inv FFT (inter complex)", optional => 1);
-report_func($db, "sal-fft-16-1", "fft (vendor-SAL): In-place CC Inv FFT (inter complex)", optional => 1);
-
-# Maxval
-header();
-
-report_func($db, "maxval-1-1", "maxval: vector max (z = maxval(A, idx)) (float)", metric => "mpts_s");
-
-# Sumval
-report_func($db, "sumval-1-1", "sumval: vector sum (z = sumval(A)) (float)");
-
-# VMA
-header();
-
-report_func($db, "vma-1-1", "vma: vector fused multiply-add (Z = A * B + C) (float)");
-report_func($db, "vma-2-1", "vma: vector fused multiply-add (Z = a * B + C) (float)");
-report_func($db, "vma-3-1", "vma: vector fused multiply-add (Z = a * B + c) (float) (aka saxpy)");
-report_func($db, "vma-11-1", "vma: vector fused multiply-add (Z = A * B + C) (complex-float)");
-report_func($db, "vma-12-1", "vma: vector fused multiply-add (Z = a * B + C) (complex)");
-report_func($db, "vma-13-1", "vma: vector fused multiply-add (Z = a * B + c) (complex) (aka caxpy)");
-
-# VMIN
-header();
-
-report_func($db, "vmin-1-1", "vmin: vector minima (Z = min(A, B)) (float)");
-
-# VMUL
-header();
-
-report_func($db, "vmul-1-1", "vmul: vector multiply (Z = A * B) (float)");
-report_func($db, "vmul-2-1", "vmul: vector multiply (Z = A * B) (complex-float)");
-report_func($db, "vmul-31-1", "vmul: vector multiply IP (Z *= A) (float)");
-report_func($db, "svmul-1-1", "svmul: scalar-vector multiply (Z = a * B) (float)");
-
-report_func($db, "sal-vmul-11-1", "vmul (vendor-SAL): scalar-vector multiply (Z = a * B) (float)", optional => 1);
-report_func($db, "sal-vmul-31-1", "vmul (vendor-SAL): vector multiply IP (Z *= A) (float)", optional => 1);
-
-# VTHRESH
-header();
-
-report_func($db, "vthresh-1-1", "vthresh: vector threshold (Z = ite(A >= b, A, b)) (float) vthr");
-report_func($db, "vthresh-2-1", "vthresh: vector threshold (Z = ite(A >= b, A, 0)) (float) vthres");
-report_func($db, "vthresh-3-1", "vthresh: vector threshold (Z = ite(A >= b, A, c)) (float)");
-report_func($db, "vthresh-5-1", "vthresh: vector threshold (Z = ite(A >= b, 1, 0)) (float)");
-report_func($db, "vthresh-11-1", "vthresh: vector threshold (Z = ite(A > B, 1, 0)) (float) lvgt");
-
-
-
-report_func($db, "vgt_ite-1-1", "vthresh: vector threshold (Z = ite(A > B, A, 0)) (float) single-expr");
-report_func($db, "vgt_ite-2-1", "vthresh: vector threshold (Z = ite(A > B, A, 1)) (float)");
-report_func($db, "vgt_ite-5-1", "vthresh: vector threshold (Z = ite(A > B, A, 0)) (float) multi-expr");
-
-header();
-
-report_func($db, "sal-vthresh-1-1", "vthresh (vendor-SAL): vthreshx (Z = ite(A >= b, A, 0)) (float)", optional => 1);
-report_func($db, "sal-vthresh-2-1", "vthresh (vendor-SAL): vthrx (Z = ite(A >= b, A, b)) (float)", optional => 1);
-
-report_func($db, "sal-lvgt-1-1", "vthresh (vendor-SAL): lvgtx (Z = ite(A > B, 1, 0)) (float)", optional => 1);
-report_func($db, "sal-lvgt-2-1", "vthresh (vendor-SAL): lvgtx/vmul (Z = ite(A > B, A, 0)) (float)", optional => 1);
-
+foreach my $k (@$order) {
+   my @opt;
+   if ($descr->{$k}{sizes}) {
+      push @opt, sizes => [split(",", $descr->{$k}{sizes})];
+      }
+   if ($descr->{$k}{metric}) {
+      push @opt, metric => $descr->{$k}{metric};
+      }
+   if ($fmt eq 'csv') {
+      report_func_csv($db, $k, $descr->{$k}{text}, @opt);
+      }
+   else {
+      report_func($db, $k, $descr->{$k}{text} . "  ($k)", @opt);
+      }
+   }
 close(OUT);