tcp.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. """
  2. tcp.py
  3. Thread Criticality Predictor [bhattacharjee2009tcpfdpparmicm].
  4. Keeps track of memory-related CPI component per core.
  5. Defines a SimUtil command so the application can read TCP values per core.
  6. From application, call SimUtil(SIM_USER_TCP, <coreid>) to get a core's absolute criticality metric (0..1000)
  7. """
  8. import sim
  9. SIM_USER_TCP = 0x0be00001
  10. INTERVAL = 100000 # in ns
  11. ncores = sim.config.ncores
  12. CPI_MEM = (
  13. "cpiDataCacheL2", "cpiDataCacheL2_S", "cpiDataCacheL3", "cpiDataCacheL3_S",
  14. "cpiDataCachecache-remote", "cpiDataCachedram-local", "cpiDataCachedram-remote",
  15. "cpiDataCacheunknown",
  16. )
  17. class Tcp:
  18. def setup(self, args):
  19. self.sd = sim.util.StatsDelta()
  20. self.stats = {
  21. 'time': [ self.sd.getter("performance_model", core, "elapsed_time") for core in range(ncores) ],
  22. 'instrs': [ self.sd.getter("performance_model", core, "instruction_count") for core in range(ncores) ],
  23. 'cpimem': [ [ self.sd.getter("interval_timer", core, cpi) for cpi in CPI_MEM ] for core in range(ncores) ],
  24. }
  25. self.tcp = [ None for core in range(ncores) ]
  26. sim.util.Every(INTERVAL * sim.util.Time.NS, self.periodic, statsdelta = self.sd, roi_only = True)
  27. sim.util.register_command(SIM_USER_TCP, self.get_tcp)
  28. def periodic(self, time, time_delta):
  29. for core in range(ncores):
  30. cycles = self.stats['time'][core].delta * sim.dvfs.get_frequency(core) / 1e9 # convert fs to cycles
  31. instrs = self.stats['instrs'][core].delta
  32. cpimem = sum([ c.delta for c in self.stats['cpimem'][core] ])
  33. self.tcp[core] = int(1000 * cpimem / time_delta)
  34. def get_tcp(self, core_caller, arg):
  35. core = arg
  36. if 0 <= core < ncores:
  37. return self.tcp[core]
  38. else:
  39. return None
  40. sim.util.register(Tcp())