[Mesa-dev] [shader-db PATCH 4/5] si-report.py: reduce code duplication in the definition of metrics

Nicolai Hähnle nhaehnle at gmail.com
Wed Dec 30 18:32:41 PST 2015


---
 si-report.py | 90 +++++++++++++++++++++---------------------------------------
 1 file changed, 32 insertions(+), 58 deletions(-)

diff --git a/si-report.py b/si-report.py
index 9df2012..bb6ea6d 100755
--- a/si-report.py
+++ b/si-report.py
@@ -43,34 +43,6 @@ def get_value_str(value, prefix, suffix):
         space = ''
     return "{}: {}{}{}\n".format(prefix, get_str(value), space, suffix)
 
-def get_sgpr_str(value, suffixes = True):
-    return get_value_str(value, 'SGPRS', '')
-
-def get_vgpr_str(value, suffixes = True):
-    return get_value_str(value, 'VGPRS', '')
-
-def get_code_size_str(value, suffixes = True):
-    suffix = ''
-    if suffixes:
-        suffix = 'bytes'
-    return get_value_str(value, 'Code Size', suffix)
-
-def get_lds_str(value, suffixes = True):
-    suffix = ''
-    if suffixes:
-        suffix = 'blocks'
-    return get_value_str(value, 'LDS', suffix)
-
-def get_scratch_str(value, suffixes = True):
-    suffix = ''
-    if suffixes:
-        suffix = 'bytes per wave'
-    return get_value_str(value, 'Scratch', suffix)
-
-def get_waitstates_str(value, suffixes = True):
-    suffix = ''
-    return get_value_str(value, 'Wait states', suffix)
-
 def calculate_percent_change(b, a):
     if b == 0:
         return 0
@@ -89,39 +61,41 @@ 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', ''),
+        ('code_size', 'Code Size', 'bytes'),
+        ('lds', 'LDS', 'blocks'),
+        ('scratch', 'Scratch', 'bytes per wave'),
+        ('waitstates', 'Wait states', ''),
+    ]
+
     def __init__(self):
         self.error = False
-        self.sgprs = 0
-        self.vgprs = 0
-        self.code_size = 0
-        self.lds = 0
-        self.scratch = 0
-        self.waitstates = 0
 
+        for name in self.get_metrics():
+            self.__dict__[name] = 0
 
     def to_string(self, suffixes = True):
-        return "{}{}{}{}{}{}".format(
-                get_sgpr_str(self.sgprs, suffixes),
-                get_vgpr_str(self.vgprs, suffixes),
-                get_code_size_str(self.code_size, suffixes),
-                get_lds_str(self.lds, suffixes),
-                get_scratch_str(self.scratch, suffixes),
-                get_waitstates_str(self.waitstates, suffixes))
+        strings = []
+        for name, printname, suffix in si_stats.metrics:
+            if not suffixes:
+                suffix = ''
+            strings.append(get_value_str(self.__dict__[name], printname, suffix))
+        return ''.join(strings)
 
+    def get_metrics(self):
+        return [m[0] for m in si_stats.metrics]
 
     def __str__(self):
         return self.to_string()
 
     def add(self, other):
-        self.sgprs += other.sgprs
-        self.vgprs += other.vgprs
-        self.code_size += other.code_size
-        self.lds += other.lds
-        self.scratch += other.scratch
-        self.waitstates += other.waitstates
+        for name in self.get_metrics():
+            self.__dict__[name] += other.__dict__[name]
 
     def update(self, comp, cmp_fn):
-        for name in self.__dict__.keys():
+        for name in self.get_metrics():
             current = self.__dict__[name]
             if type(current) != tuple:
                 current = (0, 0, 0)
@@ -129,7 +103,7 @@ class si_stats:
                 self.__dict__[name] = comp.__dict__[name]
 
     def update_max(self, comp):
-        for name in self.__dict__.keys():
+        for name in self.get_metrics():
             current = self.__dict__[name]
             if type(current) == tuple:
                 current = self.__dict__[name][0]
@@ -137,7 +111,7 @@ class si_stats:
                 self.__dict__[name] = comp.__dict__[name]
 
     def update_min(self, comp):
-        for name in self.__dict__.keys():
+        for name in self.get_metrics():
             current = self.__dict__[name]
             if type(current) == tuple:
                 current = self.__dict__[name][0]
@@ -145,17 +119,17 @@ class si_stats:
                 self.__dict__[name] = comp.__dict__[name]
 
     def update_increase(self, comp):
-        for name in self.__dict__.keys():
+        for name in self.get_metrics():
             if comp.__dict__[name][0] > 0:
                 self.__dict__[name] += 1
 
     def update_decrease(self, comp):
-        for name in self.__dict__.keys():
+        for name in self.get_metrics():
             if comp.__dict__[name][0] < 0:
                 self.__dict__[name] += 1
 
     def is_empty(self):
-        for name in self.__dict__.keys():
+        for name in self.get_metrics():
             x = self.__dict__[name]
             if type(x) == tuple and x[0] is not 0:
                 return False
@@ -248,7 +222,7 @@ def get_results(filename):
 
 def compare_stats(before, after):
     result = si_stats()
-    for name in result.__dict__.keys():
+    for name in result.get_metrics():
         b = before.__dict__[name]
         a = after.__dict__[name]
         result.__dict__[name] = (a - b, b, a)
@@ -256,7 +230,7 @@ def compare_stats(before, after):
 
 def divide_stats(num, div):
     result = si_stats()
-    for name in result.__dict__.keys():
+    for name in result.get_metrics():
         if div.__dict__[name] == 0:
             result.__dict__[name] = num.__dict__[name]
         else:
@@ -265,7 +239,7 @@ def divide_stats(num, div):
 
 def print_before_after_stats(before, after, divisor = 1):
     result = si_stats()
-    for name in result.__dict__.keys():
+    for name in result.get_metrics():
         b = before.__dict__[name] / divisor
         a = after.__dict__[name] / divisor
         if b == 0:
@@ -278,7 +252,7 @@ def print_before_after_stats(before, after, divisor = 1):
 
 def print_cmp_stats(comp):
     result = si_stats()
-    for name in result.__dict__.keys():
+    for name in result.get_metrics():
         if type(comp.__dict__[name]) != tuple:
             a = 0
             b = 0
@@ -296,7 +270,7 @@ def print_cmp_stats(comp):
 
 def print_count(stats, divisor):
     result = si_stats()
-    for name in result.__dict__.keys():
+    for name in result.get_metrics():
         count = stats.__dict__[name]
         percent = float(count) / float(divisor)
         result.__dict__[name] = '{} ({})'.format(get_str(count,''), get_str(percent))
-- 
2.5.0



More information about the mesa-dev mailing list