# Copyright (c) 2006-2008 The Regents of The University of Michigan # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer; # redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution; # neither the name of the copyright holders nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import os import sys from os.path import ( basename, exists, isdir, isfile, islink, ) from os.path import join as joinpath from os.path import normpath spec_dist = os.environ.get("M5_CPU2000", "/dist/m5/cpu2000") def copyfiles(srcdir, dstdir): from filecmp import cmp as filecmp from shutil import copyfile srcdir = normpath(srcdir) dstdir = normpath(dstdir) if not isdir(dstdir): os.mkdir(dstdir) for root, dirs, files in os.walk(srcdir): root = normpath(root) prefix = os.path.commonprefix([root, srcdir]) root = root[len(prefix) :] if root.startswith("/"): root = root[1:] for entry in dirs: newdir = joinpath(dstdir, root, entry) if not isdir(newdir): os.mkdir(newdir) for entry in files: dest = normpath(joinpath(dstdir, root, entry)) src = normpath(joinpath(srcdir, root, entry)) if not isfile(dest) or not filecmp(src, dest): copyfile(src, dest) # some of the spec benchmarks expect to be run from one directory up. # just create some symlinks that solve the problem inlink = joinpath(dstdir, "input") outlink = joinpath(dstdir, "output") if not exists(inlink): os.symlink(".", inlink) if not exists(outlink): os.symlink(".", outlink) class Benchmark: def __init__(self, isa, os, input_set): if not hasattr(self.__class__, "name"): self.name = self.__class__.__name__ if not hasattr(self.__class__, "binary"): self.binary = self.name if not hasattr(self.__class__, "args"): self.args = [] if not hasattr(self.__class__, "output"): self.output = f"{self.name}.out" if not hasattr(self.__class__, "simpoint"): self.simpoint = None try: func = getattr(self.__class__, input_set) except AttributeError: raise AttributeError( f"The benchmark {self.name} does not have the {input_set} input set" ) executable = joinpath(spec_dist, "binaries", isa, os, self.binary) if not isfile(executable): raise AttributeError(f"{executable} not found") self.executable = executable # root of tree for input & output data files data_dir = joinpath(spec_dist, "data", self.name) # optional subtree with files shared across input sets all_dir = joinpath(data_dir, "all") # dirs for input & output files for this input set inputs_dir = joinpath(data_dir, input_set, "input") outputs_dir = joinpath(data_dir, input_set, "output") # keep around which input set was specified self.input_set = input_set if not isdir(inputs_dir): raise AttributeError(f"{inputs_dir} not found") self.inputs_dir = [inputs_dir] if isdir(all_dir): self.inputs_dir += [joinpath(all_dir, "input")] if isdir(outputs_dir): self.outputs_dir = outputs_dir if not hasattr(self.__class__, "stdin"): self.stdin = joinpath(inputs_dir, f"{self.name}.in") if not isfile(self.stdin): self.stdin = None if not hasattr(self.__class__, "stdout"): self.stdout = joinpath(outputs_dir, f"{self.name}.out") if not isfile(self.stdout): self.stdout = None func(self, isa, os) def makeProcessArgs(self, **kwargs): # set up default args for Process object process_args = {} process_args["cmd"] = [self.name] + self.args process_args["executable"] = self.executable if self.stdin: process_args["input"] = self.stdin if self.stdout: process_args["output"] = self.stdout if self.simpoint: process_args["simpoint"] = self.simpoint # explicit keywords override defaults process_args.update(kwargs) return process_args def makeProcess(self, **kwargs): process_args = self.makeProcessArgs(**kwargs) # figure out working directory: use m5's outdir unless # overridden by Process's cwd param cwd = process_args.get("cwd") if not cwd: from m5 import options cwd = options.outdir process_args["cwd"] = cwd if not isdir(cwd): os.makedirs(cwd) # copy input files to working directory for d in self.inputs_dir: copyfiles(d, cwd) # generate Process object from m5.objects import Process return Process(**process_args) def __str__(self): return self.name class DefaultBenchmark(Benchmark): def ref(self, isa, os): pass def test(self, isa, os): pass def train(self, isa, os): pass class MinneDefaultBenchmark(DefaultBenchmark): def smred(self, isa, os): pass def mdred(self, isa, os): pass def lgred(self, isa, os): pass class ammp(MinneDefaultBenchmark): name = "ammp" number = 188 lang = "C" simpoint = 108 * 100e6 class applu(MinneDefaultBenchmark): name = "applu" number = 173 lang = "F77" simpoint = 2179 * 100e6 class apsi(MinneDefaultBenchmark): name = "apsi" number = 301 lang = "F77" simpoint = 3408 * 100e6 class art(DefaultBenchmark): name = "art" number = 179 lang = "C" def test(self, isa, os): self.args = [ "-scanfile", "c756hel.in", "-trainfile1", "a10.img", "-stride", "2", "-startx", "134", "-starty", "220", "-endx", "139", "-endy", "225", "-objects", "1", ] self.output = "test.out" def train(self, isa, os): self.args = [ "-scanfile", "c756hel.in", "-trainfile1", "a10.img", "-stride", "2", "-startx", "134", "-starty", "220", "-endx", "184", "-endy", "240", "-objects", "3", ] self.output = "train.out" def lgred(self, isa, os): self.args = [ "-scanfile", "c756hel.in", "-trainfile1", "a10.img", "-stride", "5", "-startx", "134", "-starty", "220", "-endx", "184", "-endy", "240", "-objects", "1", ] self.output = "lgred.out" class art110(art): def ref(self, isa, os): self.args = [ "-scanfile", "c756hel.in", "-trainfile1", "a10.img", "-trainfile2", "hc.img", "-stride", "2", "-startx", "110", "-starty", "200", "-endx", "160", "-endy", "240", "-objects", "10", ] self.output = "ref.1.out" self.simpoint = 340 * 100e6 class art470(art): def ref(self, isa, os): self.args = [ "-scanfile", "c756hel.in", "-trainfile1", "a10.img", "-trainfile2", "hc.img", "-stride", "2", "-startx", "470", "-starty", "140", "-endx", "520", "-endy", "180", "-objects", "10", ] self.output = "ref.2.out" self.simpoint = 365 * 100e6 class equake(DefaultBenchmark): name = "equake" number = 183 lang = "C" simpoint = 812 * 100e6 def lgred(self, isa, os): pass class facerec(MinneDefaultBenchmark): name = "facerec" number = 187 lang = "F" simpoint = 375 * 100e6 class fma3d(MinneDefaultBenchmark): name = "fma3d" number = 191 lang = "F" simpoint = 2541 * 100e6 class galgel(MinneDefaultBenchmark): name = "galgel" number = 178 lang = "F" simpoint = 2491 * 100e6 class lucas(MinneDefaultBenchmark): name = "lucas" number = 189 lang = "F" simpoint = 545 * 100e6 class mesa(Benchmark): name = "mesa" number = 177 lang = "C" stdin = None def __set_args(self, frames): self.args = [ "-frames", frames, "-meshfile", f"{self.name}.in", "-ppmfile", f"{self.name}.ppm", ] def test(self, isa, os): self.__set_args("10") def train(self, isa, os): self.__set_args("500") def ref(self, isa, os): self.__set_args("1000") self.simpoint = 1135 * 100e6 def lgred(self, isa, os): self.__set_args("1") class mgrid(MinneDefaultBenchmark): name = "mgrid" number = 172 lang = "F77" simpoint = 3292 * 100e6 class sixtrack(DefaultBenchmark): name = "sixtrack" number = 200 lang = "F77" simpoint = 3043 * 100e6 def lgred(self, isa, os): pass class swim(MinneDefaultBenchmark): name = "swim" number = 171 lang = "F77" simpoint = 2079 * 100e6 class wupwise(DefaultBenchmark): name = "wupwise" number = 168 lang = "F77" simpoint = 3237 * 100e6 def lgred(self, isa, os): pass class bzip2(DefaultBenchmark): name = "bzip2" number = 256 lang = "C" def test(self, isa, os): self.args = ["input.random"] def train(self, isa, os): self.args = ["input.compressed"] class bzip2_source(bzip2): def ref(self, isa, os): self.simpoint = 977 * 100e6 self.args = ["input.source", "58"] def lgred(self, isa, os): self.args = ["input.source", "1"] class bzip2_graphic(bzip2): def ref(self, isa, os): self.simpoint = 718 * 100e6 self.args = ["input.graphic", "58"] def lgred(self, isa, os): self.args = ["input.graphic", "1"] class bzip2_program(bzip2): def ref(self, isa, os): self.simpoint = 458 * 100e6 self.args = ["input.program", "58"] def lgred(self, isa, os): self.args = ["input.program", "1"] class crafty(MinneDefaultBenchmark): name = "crafty" number = 186 lang = "C" simpoint = 774 * 100e6 class eon(MinneDefaultBenchmark): name = "eon" number = 252 lang = "CXX" stdin = None class eon_kajiya(eon): args = [ "chair.control.kajiya", "chair.camera", "chair.surfaces", "chair.kajiya.ppm", "ppm", "pixels_out.kajiya", ] output = "kajiya_log.out" class eon_cook(eon): args = [ "chair.control.cook", "chair.camera", "chair.surfaces", "chair.cook.ppm", "ppm", "pixels_out.cook", ] output = "cook_log.out" class eon_rushmeier(eon): args = [ "chair.control.rushmeier", "chair.camera", "chair.surfaces", "chair.rushmeier.ppm", "ppm", "pixels_out.rushmeier", ] output = "rushmeier_log.out" simpoint = 403 * 100e6 class gap(DefaultBenchmark): name = "gap" number = 254 lang = "C" def __set_args(self, size): self.args = ["-l", "./", "-q", "-m", size] def test(self, isa, os): self.__set_args("64M") def train(self, isa, os): self.__set_args("128M") def ref(self, isa, os): self.__set_args("192M") self.simpoint = 674 * 100e6 def lgred(self, isa, os): self.__set_args("64M") def mdred(self, isa, os): self.__set_args("64M") def smred(self, isa, os): self.__set_args("64M") class gcc(DefaultBenchmark): name = "gcc" number = 176 lang = "C" def test(self, isa, os): self.args = ["cccp.i", "-o", "cccp.s"] def train(self, isa, os): self.args = ["cp-decl.i", "-o", "cp-decl.s"] def smred(self, isa, os): self.args = ["c-iterate.i", "-o", "c-iterate.s"] def mdred(self, isa, os): self.args = ["rdlanal.i", "-o", "rdlanal.s"] def lgred(self, isa, os): self.args = ["cp-decl.i", "-o", "cp-decl.s"] class gcc_166(gcc): def ref(self, isa, os): self.simpoint = 389 * 100e6 self.args = ["166.i", "-o", "166.s"] class gcc_200(gcc): def ref(self, isa, os): self.simpoint = 736 * 100e6 self.args = ["200.i", "-o", "200.s"] class gcc_expr(gcc): def ref(self, isa, os): self.simpoint = 36 * 100e6 self.args = ["expr.i", "-o", "expr.s"] class gcc_integrate(gcc): def ref(self, isa, os): self.simpoint = 4 * 100e6 self.args = ["integrate.i", "-o", "integrate.s"] class gcc_scilab(gcc): def ref(self, isa, os): self.simpoint = 207 * 100e6 self.args = ["scilab.i", "-o", "scilab.s"] class gzip(DefaultBenchmark): name = "gzip" number = 164 lang = "C" def test(self, isa, os): self.args = ["input.compressed", "2"] def train(self, isa, os): self.args = ["input.combined", "32"] class gzip_source(gzip): def ref(self, isa, os): self.simpoint = 334 * 100e6 self.args = ["input.source", "1"] def smred(self, isa, os): self.args = ["input.source", "1"] def mdred(self, isa, os): self.args = ["input.source", "1"] def lgred(self, isa, os): self.args = ["input.source", "1"] class gzip_log(gzip): def ref(self, isa, os): self.simpoint = 265 * 100e6 self.args = ["input.log", "60"] def smred(self, isa, os): self.args = ["input.log", "1"] def mdred(self, isa, os): self.args = ["input.log", "1"] def lgred(self, isa, os): self.args = ["input.log", "1"] class gzip_graphic(gzip): def ref(self, isa, os): self.simpoint = 653 * 100e6 self.args = ["input.graphic", "60"] def smred(self, isa, os): self.args = ["input.graphic", "1"] def mdred(self, isa, os): self.args = ["input.graphic", "1"] def lgred(self, isa, os): self.args = ["input.graphic", "1"] class gzip_random(gzip): def ref(self, isa, os): self.simpoint = 623 * 100e6 self.args = ["input.random", "60"] def smred(self, isa, os): self.args = ["input.random", "1"] def mdred(self, isa, os): self.args = ["input.random", "1"] def lgred(self, isa, os): self.args = ["input.random", "1"] class gzip_program(gzip): def ref(self, isa, os): self.simpoint = 1189 * 100e6 self.args = ["input.program", "60"] def smred(self, isa, os): self.args = ["input.program", "1"] def mdred(self, isa, os): self.args = ["input.program", "1"] def lgred(self, isa, os): self.args = ["input.program", "1"] class mcf(MinneDefaultBenchmark): name = "mcf" number = 181 lang = "C" args = ["mcf.in"] simpoint = 553 * 100e6 class parser(MinneDefaultBenchmark): name = "parser" number = 197 lang = "C" args = ["2.1.dict", "-batch"] simpoint = 1146 * 100e6 class perlbmk(DefaultBenchmark): name = "perlbmk" number = 253 lang = "C" def test(self, isa, os): self.args = ["-I.", "-I", "lib", "test.pl"] self.stdin = "test.in" class perlbmk_diffmail(perlbmk): def ref(self, isa, os): self.simpoint = 141 * 100e6 self.args = [ "-I", "lib", "diffmail.pl", "2", "550", "15", "24", "23", "100", ] def train(self, isa, os): self.args = [ "-I", "lib", "diffmail.pl", "2", "350", "15", "24", "23", "150", ] class perlbmk_scrabbl(perlbmk): def train(self, isa, os): self.args = ["-I.", "-I", "lib", "scrabbl.pl"] self.stdin = "scrabbl.in" class perlbmk_makerand(perlbmk): def ref(self, isa, os): self.simpoint = 11 * 100e6 self.args = ["-I", "lib", "makerand.pl"] def lgred(self, isa, os): self.args = ["-I.", "-I", "lib", "lgred.makerand.pl"] def mdred(self, isa, os): self.args = ["-I.", "-I", "lib", "mdred.makerand.pl"] def smred(self, isa, os): self.args = ["-I.", "-I", "lib", "smred.makerand.pl"] class perlbmk_perfect(perlbmk): def ref(self, isa, os): self.simpoint = 5 * 100e6 self.args = ["-I", "lib", "perfect.pl", "b", "3", "m", "4"] def train(self, isa, os): self.args = ["-I", "lib", "perfect.pl", "b", "3"] class perlbmk_splitmail1(perlbmk): def ref(self, isa, os): self.simpoint = 405 * 100e6 self.args = [ "-I", "lib", "splitmail.pl", "850", "5", "19", "18", "1500", ] class perlbmk_splitmail2(perlbmk): def ref(self, isa, os): self.args = [ "-I", "lib", "splitmail.pl", "704", "12", "26", "16", "836", ] class perlbmk_splitmail3(perlbmk): def ref(self, isa, os): self.args = [ "-I", "lib", "splitmail.pl", "535", "13", "25", "24", "1091", ] class perlbmk_splitmail4(perlbmk): def ref(self, isa, os): self.args = [ "-I", "lib", "splitmail.pl", "957", "12", "23", "26", "1014", ] class twolf(Benchmark): name = "twolf" number = 300 lang = "C" stdin = None def test(self, isa, os): self.args = ["test"] def train(self, isa, os): self.args = ["train"] def ref(self, isa, os): self.simpoint = 1066 * 100e6 self.args = ["ref"] def smred(self, isa, os): self.args = ["smred"] def mdred(self, isa, os): self.args = ["mdred"] def lgred(self, isa, os): self.args = ["lgred"] class vortex(Benchmark): name = "vortex" number = 255 lang = "C" stdin = None def __init__(self, isa, os, input_set): if isa in ("arm", "thumb", "aarch64"): self.endian = "lendian" elif isa == "sparc" or isa == "sparc32": self.endian = "bendian" else: raise AttributeError(f"unknown ISA {isa}") super().__init__(isa, os, input_set) def test(self, isa, os): self.args = [f"{self.endian}.raw"] self.output = "vortex.out" def train(self, isa, os): self.args = [f"{self.endian}.raw"] self.output = "vortex.out" def smred(self, isa, os): self.args = [f"{self.endian}.raw"] self.output = "vortex.out" def mdred(self, isa, os): self.args = [f"{self.endian}.raw"] self.output = "vortex.out" def lgred(self, isa, os): self.args = [f"{self.endian}.raw"] self.output = "vortex.out" class vortex1(vortex): def ref(self, isa, os): self.args = [f"{self.endian}1.raw"] self.output = "vortex1.out" self.simpoint = 271 * 100e6 class vortex2(vortex): def ref(self, isa, os): self.simpoint = 1024 * 100e6 self.args = [f"{self.endian}2.raw"] self.output = "vortex2.out" class vortex3(vortex): def ref(self, isa, os): self.simpoint = 564 * 100e6 self.args = [f"{self.endian}3.raw"] self.output = "vortex3.out" class vpr(MinneDefaultBenchmark): name = "vpr" number = 175 lang = "C" # not sure about vpr minnespec place.in class vpr_place(vpr): args = [ "net.in", "arch.in", "place.out", "dum.out", "-nodisp", "-place_only", "-init_t", "5", "-exit_t", "0.005", "-alpha_t", "0.9412", "-inner_num", "2", ] output = "place_log.out" class vpr_route(vpr): simpoint = 476 * 100e6 args = [ "net.in", "arch.in", "place.in", "route.out", "-nodisp", "-route_only", "-route_chan_width", "15", "-pres_fac_mult", "2", "-acc_fac", "1", "-first_iter_pres_fac", "4", "-initial_pres_fac", "8", ] output = "route_log.out" all = [ ammp, applu, apsi, art, art110, art470, equake, facerec, fma3d, galgel, lucas, mesa, mgrid, sixtrack, swim, wupwise, bzip2_source, bzip2_graphic, bzip2_program, crafty, eon_kajiya, eon_cook, eon_rushmeier, gap, gcc_166, gcc_200, gcc_expr, gcc_integrate, gcc_scilab, gzip_source, gzip_log, gzip_graphic, gzip_random, gzip_program, mcf, parser, perlbmk_diffmail, perlbmk_makerand, perlbmk_perfect, perlbmk_splitmail1, perlbmk_splitmail2, perlbmk_splitmail3, perlbmk_splitmail4, twolf, vortex1, vortex2, vortex3, vpr_place, vpr_route, ] __all__ = [x.__name__ for x in all] if __name__ == "__main__": from pprint import pprint for bench in all: for input_set in "ref", "test", "train": print(f"class: {bench.__name__}") x = bench("x86", "linux", input_set) print(f"{x}: {input_set}") pprint(x.makeProcessArgs()) print()