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