[Mesa-dev] [PATCH shader-db 5/5] nv-report: add option to print smallest or most affected programs

Rhys Perry pendingchaos02 at gmail.com
Fri Aug 3 19:53:43 UTC 2018


Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
---
 nv-report.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 51 insertions(+), 2 deletions(-)

diff --git a/nv-report.py b/nv-report.py
index 1c1491af0a..703fcf4571 100644
--- a/nv-report.py
+++ b/nv-report.py
@@ -81,13 +81,16 @@ def read_stats(fname):
 
     return stats
 
-def diff(a, b):
+def get_diff_percentage(a, b):
     percentage = 0.
     if a != 0.:
         percentage = b * 100. / a - 100.
     elif b != 0.:
         percentage = float('inf')
-    return "%d -> %d (%.2f%%)" % (a, b, percentage)
+    return percentage
+
+def diff(a, b):
+    return "%d -> %d (%.2f%%)" % (a, b, get_diff_percentage(a, b))
 
 def print_summary(before, after, keys, only_affected):
     exclude = set()
@@ -133,10 +136,48 @@ def print_helped_hurt(keys, before, after):
         print "%10d " % getattr(hurt, attr),
     print
 
+def print_top(before, after, keys, attr, num):
+    candidates = []
+    for key in keys:
+        a = after.stats[key]
+        b = before.stats[key]
+        aa = getattr(a, attr)
+        ba = getattr(b, attr)
+        if aa - ba == 0:
+            continue
+        candidates.append((key, abs(get_diff_percentage(ba, aa)), ba, aa))
+    candidates.sort(key = lambda a: a[1], reverse=True)
+    candidates = candidates[:num]
+
+    print "top %d affected programs for %s" % (num, attr)
+    for key, _, beforestat, afterstat in candidates:
+        print "    %s : %s " % (key, diff(beforestat, afterstat))
+
+def print_smallest(before, after, keys, attr, num):
+    candidates = []
+    for key in keys:
+        a = after.stats[key]
+        b = before.stats[key]
+        aa = getattr(a, attr)
+        ba = getattr(b, attr)
+        if aa - ba == 0:
+            continue
+        candidates.append((key, after.stats[key].inst))
+    candidates.sort(key = lambda a: a[1])
+    candidates = candidates[:num]
+
+    print "smallest %d affected programs for %s" % (num, attr)
+    for key, size in candidates:
+        print "    %s : %d instructions" % (key, size)
+
 def main(argv):
     parser = argparse.ArgumentParser(description=DESCRIPTION)
     parser.add_argument('before', help="the baseline run")
     parser.add_argument('after', help="the run to compare against the baseline")
+    parser.add_argument('--top', action="append", nargs=2, metavar=("ATTR", "N"),
+        help="also show the top n programs affected for attr")
+    parser.add_argument('--smallest', action="append", nargs=2, metavar=("ATTR", "N"),
+        help="also show the smallest n programs affected for attr")
     args = parser.parse_args(argv[1:])
 
     before = read_stats(args.before)
@@ -155,6 +196,14 @@ def main(argv):
     print
     print_helped_hurt(keys, before, after)
 
+    for attr, num in args.top if args.top else []:
+        print
+        print_top(before, after, keys, attr, int(num))
+
+    for attr, num in args.smallest if args.smallest else []:
+        print
+        print_smallest(before, after, keys, attr, int(num))
+
 
 if __name__ == "__main__":
     main(sys.argv)
-- 
2.14.4



More information about the mesa-dev mailing list