[Mesa-dev] [PATCH shader-db 3/3] nv-report: initial checkin for nouveau

Ilia Mirkin imirkin at alum.mit.edu
Sat Nov 7 23:43:02 PST 2015


---
 nv-report.py | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 108 insertions(+)
 create mode 100644 nv-report.py

diff --git a/nv-report.py b/nv-report.py
new file mode 100644
index 0000000..b97f4a1
--- /dev/null
+++ b/nv-report.py
@@ -0,0 +1,108 @@
+#!/usr/bin/python
+
+"""
+We're matching lines like
+
+5.shader_test - type: 1, local: 0, gpr: 4, inst: 7, bytes: 56
+11.shader_test - type: 1, local: 0, gpr: 4, inst: 1, bytes: 8
+"""
+
+import re
+import sys
+
+class Stat(object):
+
+    def __init__(self, m=None):
+        if m:
+            self.local = int(m.group("local"), 10)
+            self.gpr = int(m.group("gpr"), 10)
+            self.inst = int(m.group("inst"), 10)
+            self.bytes = int(m.group("bytes"), 10)
+        else:
+            self.local = 0
+            self.gpr = 0
+            self.inst = 0
+            self.bytes = 0
+
+    def __eq__(self, other):
+        return (self.local == other.local and
+                self.gpr == other.gpr and
+                self.inst == other.inst and
+                self.bytes == other.bytes)
+
+class Stats(object):
+
+    def __init__(self):
+        self.stats = {}
+        self.local = 0
+        self.gpr = 0
+        self.inst = 0
+        self.bytes = 0
+
+    def record(self, name, stat):
+        assert name not in self.stats, name
+        self.stats[name] = stat
+        for attr in ("local", "gpr", "inst", "bytes"):
+            setattr(self, attr, getattr(self, attr) + getattr(stat, attr))
+
+RE = re.compile(r"^(?P<name>.*) - type: (?P<type>\d+), local: (?P<local>\d+), "
+                r"gpr: (?P<gpr>\d+), inst: (?P<inst>\d+), "
+                r"bytes: (?P<bytes>\d+)$")
+
+def analyze(fname):
+    stats = Stats()
+    with open(fname, "r") as f:
+        for line in f.xreadlines():
+            if line.startswith("Thread "):
+                continue
+            m = RE.match(line)
+            assert m, line
+            stats.record(m.group("name") + " - " + m.group("type"), Stat(m))
+
+    return stats
+
+def diff(a, b):
+    return "%d -> %d (%.2f%%)" % (a, b, b * 100. / a - 100.)
+
+def main(argv):
+    # Count up each of the metrics in the before and after, and
+    # produce hurt/helped comparisons.
+    before = analyze(argv[1])
+    after = analyze(argv[2])
+    keys = before.stats.keys()
+    assert after.stats.keys() == keys
+
+    helped = Stat()
+    hurt = Stat()
+    for key in keys:
+        a = after.stats[key]
+        b = before.stats[key]
+        if a != b:
+            for attr in ("local", "gpr", "inst", "bytes"):
+                aa = getattr(a, attr)
+                ba = getattr(b, attr)
+                if aa == ba:
+                    continue
+                if aa < ba:
+                    setattr(helped, attr,
+                            getattr(helped, attr) + 1)
+                else:
+                    setattr(hurt, attr,
+                            getattr(hurt, attr) + 1)
+
+    print "total instructions in shared programs :", diff(before.inst, after.inst)
+    print "total gprs used in shared programs    :", diff(before.gpr, after.gpr)
+    print "total local used in shared programs   :", diff(before.local, after.local)
+    print
+    print "%10s %10s %10s %10s %10s " % ("", "local", "gpr", "inst", "bytes")
+    print "%10s " % "helped",
+    for attr in ("local", "gpr", "inst", "bytes"):
+        print "%10d " % getattr(helped, attr),
+    print
+    print "%10s " % "hurt",
+    for attr in ("local", "gpr", "inst", "bytes"):
+        print "%10d " % getattr(hurt, attr),
+
+
+if __name__ == "__main__":
+    main(sys.argv)
-- 
2.4.10



More information about the mesa-dev mailing list