powertrace.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. """
  2. Write out all statistics every 1M cycles and run a partial McPAT
  3. """
  4. import sys, os, sim
  5. class PowerTrace:
  6. def setup(self, args):
  7. args = dict(enumerate((args or '').split(':')))
  8. interval_ns = long(args.get(0, '') or 1000000)
  9. sim.util.Every(interval_ns * sim.util.Time.NS, self.periodic, roi_only = True)
  10. self.t_last = 0
  11. def periodic(self, time, time_delta):
  12. time = long(time/1e6) # fs to ns
  13. if time <= 100:
  14. # ignore first callback which is at 100ns
  15. return
  16. sim.stats.write(str(time)) # write to sim.stats with prefix 'time'
  17. self.do_power(self.t_last, time)
  18. self.t_last = time
  19. def hook_roi_end(self):
  20. self.t_roi_end = long(long(sim.stats.get('performance_model', 0, 'elapsed_time'))/1e6)
  21. def hook_sim_end(self):
  22. self.do_power(self.t_last, None)
  23. def do_power(self, t0, t1):
  24. _t0 = t0 or 'roi-begin'
  25. _t1 = t1 or 'roi-end'
  26. if not t1: t1 = self.t_roi_end
  27. os.system('unset PYTHONHOME; %s -d %s -o %s --partial=%s:%s --no-graph' % (
  28. os.path.join(os.getenv('SNIPER_ROOT'), 'tools/mcpat.py'),
  29. sim.config.output_dir,
  30. os.path.join(sim.config.output_dir, 'power-%s-%s-%s' % (t0, t1, t1 - t0)),
  31. _t0, _t1
  32. ))
  33. sim.util.register(PowerTrace())