memtest.py
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· Python 代码 · 共 161 行
PY
161 行
import m5from m5.objects import *import os, optparse, sysm5.AddToPath('../common')parser = optparse.OptionParser()parser.add_option("-a", "--atomic", action="store_true", help="Use atomic (non-timing) mode")parser.add_option("-b", "--blocking", action="store_true", help="Use blocking caches")parser.add_option("-l", "--maxloads", metavar="N", default=0, help="Stop after N loads")parser.add_option("-m", "--maxtick", type="int", default=m5.MaxTick, metavar="T", help="Stop after T ticks")## The "tree" specification is a colon-separated list of one or more# integers. The first integer is the number of caches/testers# connected directly to main memory. The last integer in the list is# the number of testers associated with the uppermost level of memory# (L1 cache, if there are caches, or main memory if no caches). Thus# if there is only one integer, there are no caches, and the integer# specifies the number of testers connected directly to main memory.# The other integers (if any) specify the number of caches at each# level of the hierarchy between.## Examples:## "2:1" Two caches connected to memory with a single tester behind each# (single-level hierarchy, two testers total)## "2:2:1" Two-level hierarchy, 2 L1s behind each of 2 L2s, 4 testers total#parser.add_option("-t", "--treespec", type="string", default="8:1", help="Colon-separated multilevel tree specification, " "see script comments for details " "[default: %default]")parser.add_option("--force-bus", action="store_true", help="Use bus between levels even with single cache")parser.add_option("-f", "--functional", type="int", default=0, metavar="PCT", help="Target percentage of functional accesses " "[default: %default]")parser.add_option("-u", "--uncacheable", type="int", default=0, metavar="PCT", help="Target percentage of uncacheable accesses " "[default: %default]")parser.add_option("--progress", type="int", default=1000, metavar="NLOADS", help="Progress message interval " "[default: %default]")(options, args) = parser.parse_args()if args: print "Error: script doesn't take any positional arguments" sys.exit(1)block_size = 64try: treespec = [int(x) for x in options.treespec.split(':')] numtesters = reduce(lambda x,y: x*y, treespec)except: print "Error parsing treespec option" sys.exit(1)if numtesters > block_size: print "Error: Number of testers limited to %s because of false sharing" \ % (block_size) sys.exit(1)if len(treespec) < 1: print "Error parsing treespec" sys.exit(1)# define prototype L1 cacheproto_l1 = BaseCache(size = '32kB', assoc = 4, block_size = block_size, latency = '1ns', tgts_per_mshr = 8)if options.blocking: proto_l1.mshrs = 1else: proto_l1.mshrs = 8# build a list of prototypes, one for each level of treespec, starting# at the end (last entry is tester objects)prototypes = [ MemTest(atomic=options.atomic, max_loads=options.maxloads, percent_functional=options.functional, percent_uncacheable=options.uncacheable, progress_interval=options.progress) ]# next comes L1 cache, if anyif len(treespec) > 1: prototypes.insert(0, proto_l1)# now add additional cache levels (if any) by scaling L1 paramswhile len(prototypes) < len(treespec): # clone previous level and update params prev = prototypes[0] next = prev() next.size = prev.size * 4 next.latency = prev.latency * 10 next.assoc = prev.assoc * 2 prototypes.insert(0, next)# system simulatedsystem = System(funcmem = PhysicalMemory(), physmem = PhysicalMemory(latency = "100ns"))def make_level(spec, prototypes, attach_obj, attach_port): fanout = spec[0] parent = attach_obj # use attach obj as config parent too if len(spec) > 1 and (fanout > 1 or options.force_bus): new_bus = Bus(clock="500MHz", width=16) new_bus.port = getattr(attach_obj, attach_port) parent.cpu_side_bus = new_bus attach_obj = new_bus attach_port = "port" objs = [prototypes[0]() for i in xrange(fanout)] if len(spec) > 1: # we just built caches, more levels to go parent.cache = objs for cache in objs: cache.mem_side = getattr(attach_obj, attach_port) make_level(spec[1:], prototypes[1:], cache, "cpu_side") else: # we just built the MemTest objects parent.cpu = objs for t in objs: t.test = getattr(attach_obj, attach_port) t.functional = system.funcmem.portmake_level(treespec, prototypes, system.physmem, "port")# -----------------------# run simulation# -----------------------root = Root( system = system )if options.atomic: root.system.mem_mode = 'atomic'else: root.system.mem_mode = 'timing'# Not much point in this being higher than the L1 latencym5.ticks.setGlobalFrequency('1ns')# instantiate configurationm5.instantiate(root)# simulate until program terminatesexit_event = m5.simulate(options.maxtick)print 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?