scripts: Add throttle.py
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 8 Jun 2011 11:13:46 +0000 (12:13 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 8 Jun 2011 11:16:23 +0000 (12:16 +0100)
Parses a trace.dat and works out how long each throttle was and how many
batches retired within that period (and their average duration).

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Makefile.am
configure.ac
scripts/Makefile.am [new file with mode: 0644]
scripts/throttle.py [new file with mode: 0755]

index d098ed5..78f63a4 100644 (file)
@@ -21,4 +21,4 @@
 
 ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
 
-SUBDIRS = lib man tests tools benchmarks
+SUBDIRS = lib man tools scripts tests benchmarks
index b2b6395..4eb1c48 100644 (file)
@@ -95,6 +95,7 @@ AC_CONFIG_FILES([
        benchmarks/Makefile
        lib/Makefile
        man/Makefile
+       scripts/Makefile
        tests/Makefile
        tools/Makefile
 ])
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
new file mode 100644 (file)
index 0000000..8a1daca
--- /dev/null
@@ -0,0 +1,3 @@
+noinst_SCRIPTS = \
+       throttle.py\
+       $(NULL)
diff --git a/scripts/throttle.py b/scripts/throttle.py
new file mode 100755 (executable)
index 0000000..126175c
--- /dev/null
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+#
+# Usage:
+#  scripts/throttle.py trace-dat
+#
+# Shows how often the trace throttles and for how long.
+
+import getopt
+from tracecmd import *
+import sys
+
+requests = {}
+throttle = {}
+prev_throttle = 0;
+
+def read_events(t):
+       for cpu in range(0, t.cpus):
+               e = t.read_event(cpu)
+               while e:
+                       if e.name == 'i915_gem_request_complete':
+                               seqno = e.num_field('seqno')
+                               requests[seqno] = e.ts;
+
+                       if e.name == 'i915_gem_request_throttle_begin':
+                               seqno = e.num_field('seqno')
+                               throttle[seqno] = e.ts
+
+                       if e.name == 'i915_gem_request_throttle_end':
+                               global prev_throttle
+
+                               ts = 0
+                               sum_dispatch = 0
+                               num_dispatch = 0
+                               max_dispatch = 0
+
+                               seqno = e.num_field('seqno')
+                               s = prev_throttle
+                               if s == 0:
+                                       s = seqno
+                               while s <= seqno:
+                                       if requests.has_key(s):
+                                               if ts:
+                                                       delta = requests[s] - ts
+                                                       num_dispatch += 1
+                                                       sum_dispatch += delta
+                                                       if delta > max_dispatch:                                                                max_dispatch = delta
+                                               ts = requests[s]
+                                       s += 1
+                                       
+                               if throttle.has_key(seqno) and throttle.has_key(prev_throttle) and num_dispatch:
+                                       print "throttle +%d: %dms -- %d dispatch, avg %.3fms, max %dus" % ((throttle[seqno]-throttle[prev_throttle])/1000000, (e.ts - throttle[seqno]) / 1000000, num_dispatch, sum_dispatch / (1000000. * num_dispatch), max_dispatch / 1000)
+                                       throttle[seqno] = e.ts
+
+                               prev_throttle = seqno
+
+                       e = t.read_event(cpu)
+
+if __name__ == "__main__":
+       if len(sys.argv) >=2:
+                       filename = sys.argv[1]
+       else:
+               filename = "trace.dat"
+
+       print "Initializing trace '%s'..." % (filename)
+       trace = Trace(filename)
+       read_events(trace)
+