[Mesa-dev] [PATCH shader-db 3/3] si-report.py: report private memory usage

Marek Olšák maraeo at gmail.com
Mon Nov 28 11:25:17 UTC 2016


From: Marek Olšák <marek.olsak at amd.com>

---
 si-report.py | 43 ++++++++++++++++++++++++++++++-------------
 1 file changed, 30 insertions(+), 13 deletions(-)

diff --git a/si-report.py b/si-report.py
index 17b7c66..093fb39 100755
--- a/si-report.py
+++ b/si-report.py
@@ -75,20 +75,21 @@ def cmp_max_per(current, comp):
 
 def cmp_min_per(current, comp):
     return calculate_percent_change(comp[1], comp[2]) < calculate_percent_change(current[1], current[2])
 
 class si_stats:
     metrics = [
         ('sgprs', 'SGPRS', ''),
         ('vgprs', 'VGPRS', ''),
         ('spilled_sgprs', 'Spilled SGPRs', ''),
         ('spilled_vgprs', 'Spilled VGPRs', ''),
+        ('privmem_vgprs', 'Private memory VGPRs', ''),
         ('scratch_size', 'Scratch size', 'dwords per thread'),
         ('code_size', 'Code Size', 'bytes'),
         ('lds', 'LDS', 'blocks'),
         ('maxwaves', 'Max Waves', ''),
         ('waitstates', 'Wait states', ''),
     ]
 
     def __init__(self):
         self.error = False
 
@@ -181,49 +182,61 @@ class si_stats:
         for name in self.get_metrics():
             x = self.__dict__[name]
             if type(x) == tuple and x[0] is not 0:
                 return False
             if type(x) != tuple and x is not 0:
                 return False
         return True
 
 
 class si_parser(object):
-    re_stats = re.compile(
-        r"^Shader Stats: SGPRS: ([0-9]+) VGPRS: ([0-9]+) Code Size: ([0-9]+) "+
-        r"LDS: ([0-9]+) Scratch: ([0-9]+) Max Waves: ([0-9]+) Spilled SGPRs: "+
-        r"([0-9]+) Spilled VGPRs: ([0-9]+)")
+    re_stats = [
+        re.compile(
+            r"^Shader Stats: SGPRS: ([0-9]+) VGPRS: ([0-9]+) Code Size: ([0-9]+) "+
+            r"LDS: ([0-9]+) Scratch: ([0-9]+) Max Waves: ([0-9]+) Spilled SGPRs: "+
+            r"([0-9]+) Spilled VGPRs: ([0-9]+) PrivMem VGPRs: ([0-9]+)"),
+        re.compile(
+            r"^Shader Stats: SGPRS: ([0-9]+) VGPRS: ([0-9]+) Code Size: ([0-9]+) "+
+            r"LDS: ([0-9]+) Scratch: ([0-9]+) Max Waves: ([0-9]+) Spilled SGPRs: "+
+            r"([0-9]+) Spilled VGPRs: ([0-9]+)"),
+    ]
+
     re_nop = re.compile("^\ts_nop ([0-9]+)")
 
     def __init__(self):
         self._stats = None
         self._in_disasm = False
 
     def finish(self):
         return self._stats
 
     def parse(self, msg):
         if not self._in_disasm:
             if msg == "Shader Disassembly Begin":
                 old_stats = self._stats
                 self._stats = si_stats()
                 self._in_disasm = True
                 return old_stats
 
-            match = si_parser.re_stats.match(msg)
+            for re in si_parser.re_stats:
+                match = re.match(msg)
+                if match is not None:
+                    break
+
             if match is not None:
                 if self._stats == None:
                     self._stats = si_stats()
                 self._stats.sgprs = int(match.group(1))
                 self._stats.vgprs = int(match.group(2))
                 self._stats.spilled_sgprs = int(match.group(7))
                 self._stats.spilled_vgprs = int(match.group(8))
+                self._stats.privmem_vgprs = int(match.group(9)) if match.lastindex >= 9 else 0
                 self._stats.code_size = int(match.group(3))
                 self._stats.lds = int(match.group(4))
                 self._stats.scratch_size = int(match.group(5)) / (64 * 4)
                 self._stats.maxwaves = int(match.group(6))
                 old_stats = self._stats
                 self._stats = None
                 return old_stats
 
             if msg == "LLVM compile failed":
                 old_stats = self._stats
@@ -470,59 +483,62 @@ class grouped_stats:
         self.before.add(before)
         self.after.add(after)
 
     def set_one_shader(self, before, after):
         self.before = before
         self.after = after
         self.diff = subtract_stats(after, before)
 
     def print_vgpr_spilling_app(self, name):
         if (self.after.spilled_vgprs > 0 or
-            self.after.scratch_size > 0):
-            print " {:22}{:6}{:10}{:10}".format(
+            self.after.privmem_vgprs > 0):
+            print " {:22}{:6}{:10}{:10}{:10}".format(
                 name,
                 self.num_shaders,
                 self.after.spilled_vgprs,
+                self.after.privmem_vgprs,
                 self.after.scratch_size)
 
     def print_one_shader_vgpr_spill(self, name):
         if (self.after.spilled_vgprs > 0 or
-            self.after.scratch_size > 0):
-            print " {:65}{:10}{:10}{:10}".format(
+            self.after.privmem_vgprs > 0):
+            print " {:65}{:10}{:10}{:10}{:10}".format(
                 name,
                 self.after.vgprs,
                 self.after.spilled_vgprs,
+                self.after.privmem_vgprs,
                 self.after.scratch_size)
 
     def print_sgpr_spilling_app(self, name):
         if self.after.spilled_sgprs > 0:
             print " {:22}{:6}{:10}{:>9.1f}".format(
                 name,
                 self.num_shaders,
                 self.after.spilled_sgprs,
                 float(self.after.spilled_sgprs) / float(self.num_shaders))
 
     def print_one_shader_sgpr_spill(self, name):
         if self.after.spilled_sgprs > 0:
             print " {:65}{:10}{:10}".format(
                 name,
                 self.after.sgprs,
                 self.after.spilled_sgprs)
 
     def print_percentages(self, name):
-        print " {:22}{:6}{}{}{}{}{}{}{}{}".format(
+        print " {:22}{:6}{}{}{}{}{}{}{}{}{}".format(
             name,
             self.num_shaders,
             format_percent_change(self.before.sgprs, self.after.sgprs),
             format_percent_change(self.before.vgprs, self.after.vgprs),
             format_percent_change(self.before.spilled_sgprs, self.after.spilled_sgprs),
             format_percent_change(self.before.spilled_vgprs, self.after.spilled_vgprs),
+            format_percent_change(self.before.privmem_vgprs, self.after.privmem_vgprs),
             format_percent_change(self.before.scratch_size, self.after.scratch_size),
             format_percent_change(self.before.code_size, self.after.code_size),
             format_percent_change(self.before.maxwaves, self.after.maxwaves, more_is_better = True),
             format_percent_change(self.before.waitstates, self.after.waitstates))
 
     def print_regression(self, name, field):
         more_is_better = field == "maxwaves"
         print " {:65}{:10}{:10}{}{}".format(
             name,
             self.before.__dict__[field],
@@ -584,40 +600,41 @@ def print_tables(before_all_results, after_all_results):
             total.add(before, after)
 
             if not subtract_stats(before, after).is_empty():
                 total_affected.add(before, after)
 
             # we don't have to add all shaders, just those that we may need
             # to display
             if (is_regression(before, after) or
                 after.scratch_size > 0 or
                 after.spilled_vgprs > 0 or
+                after.privmem_vgprs > 0 or
                 after.spilled_sgprs > 0):
                 name = get_shader_name(shaders, file)
                 shaders[name].set_one_shader(before, after)
 
     # worst VGPR spills
     num = 0
     sort_key = lambda v: -v[1].after.scratch_size
     for name, stats in sorted(shaders.items(), key = sort_key):
         if num == 0:
             print_yellow(" WORST VGPR SPILLS (not deltas)" + (" " * 40) +
-                         "VGPRs SpillVGPR ScratchSize")
+                         "VGPRs SpillVGPR  PrivVGPR ScratchSize")
         stats.print_one_shader_vgpr_spill(name)
         num += 1
         if num == num_listed:
             break
     if num > 0:
         print
 
     # VGPR spilling apps
-    print_yellow(" VGPR SPILLING APPS   Shaders SpillVGPR ScratchSize")
+    print_yellow(" VGPR SPILLING APPS   Shaders SpillVGPR  PrivVGPR ScratchSize")
     for name, stats in sorted(apps.items()):
         stats.print_vgpr_spilling_app(name)
     print
 
     # worst SGPR spills
     num = 0
     sort_key = lambda v: -v[1].after.spilled_sgprs
     for name, stats in sorted(shaders.items(), key = sort_key):
         if num == 0:
             print_yellow(" WORST SGPR SPILLS (not deltas)" + (" " * 40) +
@@ -659,21 +676,21 @@ def print_tables(before_all_results, after_all_results):
                 print_yellow(" WORST REGRESSIONS - {:49}".format(metrics[i][1]) +
                              "Before     After     Delta Percentage")
             stats.print_regression(name, field)
             num += 1
             if num == num_listed:
                 break
         if num > 0:
             print
 
     # percentages
-    legend = "Shaders     SGPRs     VGPRs SpillSGPR SpillVGPR   Scratch  CodeSize  MaxWaves     Waits"
+    legend = "Shaders     SGPRs     VGPRs SpillSGPR SpillVGPR  PrivVGPR   Scratch  CodeSize  MaxWaves     Waits"
     print_yellow(" PERCENTAGE DELTAS    " + legend)
     for name, stats in sorted(apps.items()):
         stats.print_percentages(name)
     print " " + ("-" * (21 + len(legend)))
     total_affected.print_percentages("All affected")
     print " " + ("-" * (21 + len(legend)))
     total.print_percentages("Total")
     print
 
 def main():
-- 
2.7.4



More information about the mesa-dev mailing list