llcstack.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #!/usr/bin/env python
  2. import sys, os, getopt, sniper_lib, sniper_stats
  3. def usage():
  4. print 'Usage:', sys.argv[0], '[-h (help)] [--partial <section-start>:<section-end> (default: roi-begin:roi-end)] [-d <resultsdir (default: .)>]'
  5. jobid = 0
  6. resultsdir = '.'
  7. partial = None
  8. try:
  9. opts, args = getopt.getopt(sys.argv[1:], "hj:d:", [ 'partial=' ])
  10. except getopt.GetoptError, e:
  11. print e
  12. usage()
  13. sys.exit()
  14. for o, a in opts:
  15. if o == '-h':
  16. usage()
  17. sys.exit()
  18. if o == '-d':
  19. resultsdir = a
  20. if o == '-j':
  21. jobid = long(a)
  22. if o == '--partial':
  23. if ':' not in a:
  24. sys.stderr.write('--partial=<from>:<to>\n')
  25. usage()
  26. partial = a.split(':')
  27. if args:
  28. usage()
  29. sys.exit(-1)
  30. results = sniper_lib.get_results(jobid, resultsdir, partial = partial)
  31. config = results['config']
  32. stats = results['results']
  33. ncores = int(config['general/total_cores'])
  34. llc_number = int(config['perf_model/cache/levels'])
  35. llc_name = 'L%d' % llc_number
  36. llc_components = [ name.split('.', 1)[1] for name in sorted(stats.keys()) if '.uncore-time-' in name ]
  37. totaltime = stats['%s.uncore-totaltime' % llc_name]
  38. requests = stats['%s.uncore-requests' % llc_name]
  39. sums = [ 0 for core in range(ncores) ]
  40. def format_num(v):
  41. return '%8d' % v
  42. def format_ns(v):
  43. return '%8.2f' % (v * 1e-6)
  44. print ' Average | ' + ' '.join(map(lambda core: '%8s' % ('Core %d' % core), range(ncores)))
  45. print
  46. print 'Requests: ' + format_num(sum(requests)) + ' | ' + ' '.join(map(format_num, requests))
  47. print 'Total time: ' + format_ns(sum(totaltime) / (sum(requests) or 1)) + ' | ' + ' '.join(map(lambda t, n: format_ns(t / (n or 1)), totaltime, requests))
  48. print
  49. for component in llc_components:
  50. statname = '%s.%s' % (llc_name, component)
  51. if sum(stats[statname]):
  52. print '%-22s' % ('%s:' % component[12:]),
  53. print format_ns(sum(stats[statname]) / (sum(requests) or 1)) + ' |',
  54. for core in range(ncores):
  55. print format_ns(stats[statname][core] / (requests[core] or 1)) + ' ',
  56. sums[core] += stats[statname][core]
  57. print
  58. if sum(totaltime) > sum(sums):
  59. print 'unaccounted: ' + format_ns((sum(totaltime) - sum(sums)) / (sum(requests) or 1)) + ' |',
  60. print ' '.join(map(lambda t, s, n: format_ns((t - s) / (n or 1)), totaltime, sums, requests))