checkpoint_aggregator.py revision 7443
12889Sbinkertn@umich.edu# Copyright (c) 2009 The Regents of The University of Michigan 22889Sbinkertn@umich.edu# All rights reserved. 32889Sbinkertn@umich.edu# 42889Sbinkertn@umich.edu# Redistribution and use in source and binary forms, with or without 52889Sbinkertn@umich.edu# modification, are permitted provided that the following conditions are 62889Sbinkertn@umich.edu# met: redistributions of source code must retain the above copyright 72889Sbinkertn@umich.edu# notice, this list of conditions and the following disclaimer; 82889Sbinkertn@umich.edu# redistributions in binary form must reproduce the above copyright 92889Sbinkertn@umich.edu# notice, this list of conditions and the following disclaimer in the 102889Sbinkertn@umich.edu# documentation and/or other materials provided with the distribution; 112889Sbinkertn@umich.edu# neither the name of the copyright holders nor the names of its 122889Sbinkertn@umich.edu# contributors may be used to endorse or promote products derived from 132889Sbinkertn@umich.edu# this software without specific prior written permission. 142889Sbinkertn@umich.edu# 152889Sbinkertn@umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162889Sbinkertn@umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172889Sbinkertn@umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 182889Sbinkertn@umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 192889Sbinkertn@umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 202889Sbinkertn@umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 212889Sbinkertn@umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222889Sbinkertn@umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232889Sbinkertn@umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242889Sbinkertn@umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 252889Sbinkertn@umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262889Sbinkertn@umich.edu# 272889Sbinkertn@umich.edu# Authors: Lisa Hsu 282889Sbinkertn@umich.edu 294850Snate@binkert.orgfrom ConfigParser import ConfigParser 304850Snate@binkert.orgimport gzip 314850Snate@binkert.org 324850Snate@binkert.orgimport sys, re, optparse, os 334850Snate@binkert.org 344850Snate@binkert.orgclass myCP(ConfigParser): 355467Snate@binkert.org def __init__(self): 365471Snate@binkert.org ConfigParser.__init__(self) 375470Snate@binkert.org 382889Sbinkertn@umich.edu def optionxform(self, optionstr): 392889Sbinkertn@umich.edu return optionstr 402889Sbinkertn@umich.edu 414053Sbinkertn@umich.edudef aggregate(options, args): 424053Sbinkertn@umich.edu merged = myCP() 434053Sbinkertn@umich.edu page_ptr = 0 444053Sbinkertn@umich.edu 454053Sbinkertn@umich.edu allfiles = os.listdir(os.getcwd()) 464053Sbinkertn@umich.edu cpts = [] 474053Sbinkertn@umich.edu for arg in args: 484053Sbinkertn@umich.edu found = False 494053Sbinkertn@umich.edu for f in allfiles: 504053Sbinkertn@umich.edu if re.compile("cpt." + arg + ".\d+").search(f): 514053Sbinkertn@umich.edu found = True 524053Sbinkertn@umich.edu cpts.append(f) 534053Sbinkertn@umich.edu break 545470Snate@binkert.org if not found: 555470Snate@binkert.org print "missing checkpoint: ", arg 565470Snate@binkert.org sys.exit(1) 575470Snate@binkert.org 585470Snate@binkert.org dirname = "-".join([options.prefix, "cpt"]) 595470Snate@binkert.org agg_name = "-".join(args) 605470Snate@binkert.org print agg_name 612889Sbinkertn@umich.edu fullpath = os.path.join("..", dirname, "cpt." + agg_name + ".10000") 625470Snate@binkert.org if not os.path.isdir(fullpath): 635470Snate@binkert.org os.system("mkdir -p " + fullpath) 645470Snate@binkert.org elif os.path.isfile(fullpath + "/system.physmem.physmem"): 655470Snate@binkert.org if os.path.isfile(fullpath + "/m5.cpt"): 665470Snate@binkert.org print fullpath, " already done" 672889Sbinkertn@umich.edu return 682889Sbinkertn@umich.edu 692889Sbinkertn@umich.edu myfile = open(fullpath + "/system.physmem.physmem", "wb+") 702889Sbinkertn@umich.edu merged_mem = gzip.GzipFile(fileobj=myfile, mode="wb") 714850Snate@binkert.org 724850Snate@binkert.org max_curtick = 0 732889Sbinkertn@umich.edu when = 0 742889Sbinkertn@umich.edu for (i, arg) in enumerate(args): 752889Sbinkertn@umich.edu print arg 762889Sbinkertn@umich.edu config = myCP() 772889Sbinkertn@umich.edu config.readfp(open(cpts[i] + "/m5.cpt")) 782889Sbinkertn@umich.edu 792889Sbinkertn@umich.edu for sec in config.sections(): 802889Sbinkertn@umich.edu if re.compile("cpu").search(sec): 812889Sbinkertn@umich.edu newsec = re.sub("cpu", "cpu" + str(i), sec) 822889Sbinkertn@umich.edu merged.add_section(newsec) 835524Sstever@gmail.com if re.compile("workload$").search(sec): 845524Sstever@gmail.com merged.set(newsec, "M5_pid", i) 855524Sstever@gmail.com 865524Sstever@gmail.com items = config.items(sec) 875524Sstever@gmail.com for item in items: 885524Sstever@gmail.com if item[0] == "ppn": 895524Sstever@gmail.com if config.getint(sec, "tag") != 0: 905524Sstever@gmail.com merged.set(newsec, item[0], int(item[1]) + page_ptr) 912889Sbinkertn@umich.edu continue 922889Sbinkertn@umich.edu elif item[0] == "asn": 932899Sbinkertn@umich.edu tmp = re.compile("(.*).Entry(\d+)").search(sec).groups() 942899Sbinkertn@umich.edu if config.has_option(tmp[0], "nlu"): 952889Sbinkertn@umich.edu size = config.getint(tmp[0], "nlu") 962889Sbinkertn@umich.edu if int(tmp[1]) < size: 972889Sbinkertn@umich.edu merged.set(newsec, item[0], i) 982889Sbinkertn@umich.edu continue 992889Sbinkertn@umich.edu else: 1002889Sbinkertn@umich.edu merged.set(newsec, item[0], i) 1012889Sbinkertn@umich.edu continue 1022889Sbinkertn@umich.edu merged.set(newsec, item[0], item[1]) 1032889Sbinkertn@umich.edu elif sec == "system": 1042889Sbinkertn@umich.edu pass 1052889Sbinkertn@umich.edu elif sec == "Globals": 1062889Sbinkertn@umich.edu tick = config.getint(sec, "curTick") 1072889Sbinkertn@umich.edu if tick > max_curtick: 1082889Sbinkertn@umich.edu max_curtick = tick 1092889Sbinkertn@umich.edu when = config.getint("system.cpu.tickEvent", "_when") 1102889Sbinkertn@umich.edu else: 1115512SMichael.Adler@intel.com if i == 0: 1125512SMichael.Adler@intel.com merged.add_section(sec) 1132889Sbinkertn@umich.edu for item in config.items(sec): 1142889Sbinkertn@umich.edu merged.set(sec, item[0], item[1]) 1152889Sbinkertn@umich.edu if item[0] == "curtick": 1164053Sbinkertn@umich.edu merged.optionxform(str("curTick")) 1174053Sbinkertn@umich.edu elif item[0] == "numevents": 1182889Sbinkertn@umich.edu merged.optionxform(str("numEvents")) 1194053Sbinkertn@umich.edu 1204044Sbinkertn@umich.edu page_ptr = page_ptr + int(config.get("system", "page_ptr")) 1214044Sbinkertn@umich.edu 1222889Sbinkertn@umich.edu ### memory stuff 1232889Sbinkertn@umich.edu f = open(cpts[i] + "/system.physmem.physmem", "rb") 1242889Sbinkertn@umich.edu gf = gzip.GzipFile(fileobj=f, mode="rb") 1252889Sbinkertn@umich.edu pages = int(config.get("system", "page_ptr")) 1262889Sbinkertn@umich.edu print "pages to be read: ", pages 1275473Snate@binkert.org 1285473Snate@binkert.org x = 0 1295473Snate@binkert.org while x < pages: 1305473Snate@binkert.org bytesRead = gf.read(1 << 13) 1315473Snate@binkert.org merged_mem.write(bytesRead) 1322889Sbinkertn@umich.edu x += 1 1334167Sbinkertn@umich.edu 1344042Sbinkertn@umich.edu gf.close() 1353624Sbinkertn@umich.edu f.close() 1362889Sbinkertn@umich.edu 1375472Snate@binkert.org merged.add_section("system") 1385472Snate@binkert.org merged.set("system", "page_ptr", page_ptr) 1395472Snate@binkert.org print "WARNING: " 1405472Snate@binkert.org print "Make sure the simulation using this checkpoint has at least " 1415472Snate@binkert.org if page_ptr > (1<<20): 1425472Snate@binkert.org print "8G ", 1435472Snate@binkert.org elif page_ptr > (1<<19): 1445470Snate@binkert.org print "4G ", 1452889Sbinkertn@umich.edu elif page_ptr > (1<<18): 1465524Sstever@gmail.com print "2G ", 1475524Sstever@gmail.com elif page_ptr > (1<<17): 1485524Sstever@gmail.com print "1G ", 1495524Sstever@gmail.com elif page_ptr > (1<<16): 1505524Sstever@gmail.com print "512KB ", 1515524Sstever@gmail.com else: 1525524Sstever@gmail.com print "this is a small sim, you're probably fine", 1535524Sstever@gmail.com print "of memory." 1545524Sstever@gmail.com 1555524Sstever@gmail.com merged.add_section("Globals") 1565524Sstever@gmail.com merged.set("Globals", "curTick", max_curtick) 1575524Sstever@gmail.com 1585524Sstever@gmail.com for i in xrange(len(args)): 1595524Sstever@gmail.com merged.set("system.cpu" + str(i) + ".tickEvent", "_when", when) 1605524Sstever@gmail.com 1615524Sstever@gmail.com merged.write(file(fullpath + "/m5.cpt", "wb")) 1625524Sstever@gmail.com merged_mem.close() 1635524Sstever@gmail.com myfile.close() 1645524Sstever@gmail.com 1655524Sstever@gmail.comif __name__ == "__main__": 1665524Sstever@gmail.com 1675524Sstever@gmail.com parser = optparse.OptionParser() 1685524Sstever@gmail.com parser.add_option("--prefix", type="string", default="agg") 1695524Sstever@gmail.com 1705524Sstever@gmail.com (options, args) = parser.parse_args() 1715524Sstever@gmail.com 1725524Sstever@gmail.com aggregate(options, args) 1732889Sbinkertn@umich.edu 1744850Snate@binkert.org