cpu2000.py revision 4116:f6e3dc4655e9
1# Copyright (c) 2006-2007 The Regents of The University of Michigan 2# All rights reserved. 3# 4# Redistribution and use in source and binary forms, with or without 5# modification, are permitted provided that the following conditions are 6# met: redistributions of source code must retain the above copyright 7# notice, this list of conditions and the following disclaimer; 8# redistributions in binary form must reproduce the above copyright 9# notice, this list of conditions and the following disclaimer in the 10# documentation and/or other materials provided with the distribution; 11# neither the name of the copyright holders nor the names of its 12# contributors may be used to endorse or promote products derived from 13# this software without specific prior written permission. 14# 15# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26# 27# Authors: Nathan Binkert 28 29import os 30import sys 31from os.path import basename, exists, join as joinpath, normpath 32from os.path import isdir, isfile, islink 33 34spec_dist = '/dist/m5/cpu2000' 35 36def copyfiles(srcdir, dstdir): 37 from filecmp import cmp as filecmp 38 from shutil import copyfile 39 40 srcdir = normpath(srcdir) 41 dstdir = normpath(dstdir) 42 43 if not isdir(dstdir): 44 os.mkdir(dstdir) 45 46 for root, dirs, files in os.walk(srcdir): 47 root = normpath(root) 48 prefix = os.path.commonprefix([root, srcdir]) 49 50 root = root[len(prefix):] 51 if root.startswith('/'): 52 root = root[1:] 53 54 for entry in dirs: 55 newdir = joinpath(dstdir, root, entry) 56 if not isdir(newdir): 57 os.mkdir(newdir) 58 59 for entry in files: 60 dest = normpath(joinpath(dstdir, root, entry)) 61 src = normpath(joinpath(srcdir, root, entry)) 62 if not isfile(dest) or not filecmp(src, dest): 63 copyfile(src, dest) 64 65 # some of the spec benchmarks expect to be run from one directory up. 66 # just create some symlinks that solve the problem 67 inlink = joinpath(dstdir, 'input') 68 outlink = joinpath(dstdir, 'output') 69 if not exists(inlink): 70 os.symlink('.', inlink) 71 if not exists(outlink): 72 os.symlink('.', outlink) 73 74class Benchmark(object): 75 def __init__(self, isa, os, input_set): 76 if not hasattr(self.__class__, 'name'): 77 self.name = self.__class__.__name__ 78 79 if not hasattr(self.__class__, 'binary'): 80 self.binary = self.name 81 82 if not hasattr(self.__class__, 'args'): 83 self.args = [] 84 85 if not hasattr(self.__class__, 'output'): 86 self.output = '%s.out' % self.name 87 88 try: 89 func = getattr(self.__class__, input_set) 90 except AttributeError: 91 raise AttributeError, \ 92 'The benchmark %s does not have the %s input set' % \ 93 (self.name, input_set) 94 95 executable = joinpath(spec_dist, 'binaries', isa, os, self.binary) 96 if not isfile(executable): 97 raise AttributeError, '%s not found' % executable 98 self.executable = executable 99 100 # root of tree for input & output data files 101 data_dir = joinpath(spec_dist, 'data', self.name) 102 # optional subtree with files shared across input sets 103 all_dir = joinpath(data_dir, 'all') 104 # dirs for input & output files for this input set 105 inputs_dir = joinpath(data_dir, input_set, 'input') 106 outputs_dir = joinpath(data_dir, input_set, 'output') 107 # keep around which input set was specified 108 self.input_set = input_set 109 110 if not isdir(inputs_dir): 111 raise AttributeError, '%s not found' % inputs_dir 112 113 self.inputs_dir = [ inputs_dir ] 114 if isdir(all_dir): 115 self.inputs_dir += [ joinpath(all_dir, 'input') ] 116 if isdir(outputs_dir): 117 self.outputs_dir = outputs_dir 118 119 if not hasattr(self.__class__, 'stdin'): 120 self.stdin = joinpath(inputs_dir, '%s.in' % self.name) 121 if not isfile(self.stdin): 122 self.stdin = None 123 124 if not hasattr(self.__class__, 'stdout'): 125 self.stdout = joinpath(outputs_dir, '%s.out' % self.name) 126 if not isfile(self.stdout): 127 self.stdout = None 128 129 func(self, isa, os) 130 131 def makeLiveProcessArgs(self, **kwargs): 132 # set up default args for LiveProcess object 133 process_args = {} 134 process_args['cmd'] = self.name + ' ' + ' '.join(self.args) 135 process_args['executable'] = self.executable 136 if self.stdin: 137 process_args['input'] = self.stdin 138 if self.stdout: 139 process_args['output'] = self.stdout 140 141 # explicit keywords override defaults 142 process_args.update(kwargs) 143 144 return process_args 145 146 def makeLiveProcess(self, **kwargs): 147 process_args = self.makeLiveProcessArgs(**kwargs) 148 149 # figure out working directory: use m5's outdir unless 150 # overridden by LiveProcess's cwd param 151 cwd = process_args.get('cwd') 152 if not cwd: 153 from m5.main import options 154 cwd = options.outdir 155 process_args['cwd'] = cwd 156 if not isdir(cwd): 157 os.makedirs(cwd) 158 # copy input files to working directory 159 for d in self.inputs_dir: 160 copyfiles(d, cwd) 161 # generate LiveProcess object 162 from m5.objects import LiveProcess 163 return LiveProcess(**process_args) 164 165 def __str__(self): 166 return self.name 167 168class DefaultBenchmark(Benchmark): 169 def ref(self, isa, os): pass 170 def test(self, isa, os): pass 171 def train(self, isa, os): pass 172 173class MinneDefaultBenchmark(DefaultBenchmark): 174 def smred(self, isa, os): pass 175 def mdred(self, isa, os): pass 176 def lgred(self, isa, os): pass 177 178class ammp(MinneDefaultBenchmark): 179 name = 'ammp' 180 number = 188 181 lang = 'C' 182 183class applu(MinneDefaultBenchmark): 184 name = 'applu' 185 number = 173 186 lang = 'F77' 187 188class apsi(MinneDefaultBenchmark): 189 name = 'apsi' 190 number = 301 191 lang = 'F77' 192 193class art(DefaultBenchmark): 194 name = 'art' 195 number = 179 196 lang = 'C' 197 198 def test(self, isa, os): 199 self.args = [ '-scanfile', 'c756hel.in', 200 '-trainfile1', 'a10.img', 201 '-stride', '2', 202 '-startx', '134', 203 '-starty', '220', 204 '-endx', '139', 205 '-endy', '225', 206 '-objects', '1' ] 207 self.output = 'test.out' 208 209 def train(self, isa, os): 210 self.args = [ '-scanfile', 'c756hel.in', 211 '-trainfile1', 'a10.img', 212 '-stride', '2', 213 '-startx', '134', 214 '-starty', '220', 215 '-endx', '184', 216 '-endy', '240', 217 '-objects', '3' ] 218 self.output = 'train.out' 219 220 def lgred(self, isa, os): 221 self.args = ['-scanfile', 'c756hel.in', 222 '-trainfile1', 'a10.img', 223 '-stride', '5', 224 '-startx', '134', 225 '-starty', '220', 226 '-endx', '184', 227 '-endy', '240', 228 '-objects', '1' ] 229 self.output = 'lgred.out' 230 231 232class art110(art): 233 def ref(self, isa, os): 234 self.args = [ '-scanfile', 'c756hel.in', 235 '-trainfile1', 'a10.img', 236 '-trainfile2', 'hc.img', 237 '-stride', '2', 238 '-startx', '110', 239 '-starty', '200', 240 '-endx', '160', 241 '-endy', '240', 242 '-objects', '10' ] 243 self.output = 'ref.1.out' 244 245class art470(art): 246 def ref(self, isa, os): 247 self.args = [ '-scanfile', 'c756hel.in', 248 '-trainfile1', 'a10.img', 249 '-trainfile2', 'hc.img', 250 '-stride', '2', 251 '-startx', '470', 252 '-starty', '140', 253 '-endx', '520', 254 '-endy', '180', 255 '-objects', '10' ] 256 self.output = 'ref.2.out' 257 258class equake(DefaultBenchmark): 259 name = 'equake' 260 number = 183 261 lang = 'C' 262 263 def lgred(self, isa, os): pass 264 265class facerec(MinneDefaultBenchmark): 266 name = 'facerec' 267 number = 187 268 lang = 'F' 269 270class fma3d(MinneDefaultBenchmark): 271 name = 'fma3d' 272 number = 191 273 lang = 'F' 274 275class galgel(MinneDefaultBenchmark): 276 name = 'galgel' 277 number = 178 278 lang = 'F' 279 280class lucas(MinneDefaultBenchmark): 281 name = 'lucas' 282 number = 189 283 lang = 'F' 284 285class mesa(Benchmark): 286 name = 'mesa' 287 number = 177 288 lang = 'C' 289 stdin = None 290 291 def __set_args(self, frames): 292 self.args = [ '-frames', frames, '-meshfile', '%s.in' % self.name, 293 '-ppmfile', '%s.ppm' % self.name ] 294 295 def test(self, isa, os): 296 self.__set_args('10') 297 298 def train(self, isa, os): 299 self.__set_args('500') 300 301 def ref(self, isa, os): 302 self.__set_args('1000') 303 304 def lgred(self, isa, os): 305 self.__set_args('1') 306 307class mgrid(MinneDefaultBenchmark): 308 name = 'mgrid' 309 number = 172 310 lang = 'F77' 311 312class sixtrack(DefaultBenchmark): 313 name = 'sixtrack' 314 number = 200 315 lang = 'F77' 316 317 def lgred(self, isa, os): pass 318 319class swim(MinneDefaultBenchmark): 320 name = 'swim' 321 number = 171 322 lang = 'F77' 323 324class wupwise(DefaultBenchmark): 325 name = 'wupwise' 326 number = 168 327 lang = 'F77' 328 329 def lgred(self, isa, os): pass 330 331class bzip2(DefaultBenchmark): 332 name = 'bzip2' 333 number = 256 334 lang = 'C' 335 336 def test(self, isa, os): 337 self.args = [ 'input.random' ] 338 339 def train(self, isa, os): 340 self.args = [ 'input.compressed' ] 341 342class bzip2_source(bzip2): 343 def ref(self, isa, os): 344 self.args = [ 'input.source', '58' ] 345 346 def lgred(self, isa, os): 347 self.args = [ 'input.source', '1' ] 348 349class bzip2_graphic(bzip2): 350 def ref(self, isa, os): 351 self.args = [ 'input.graphic', '58' ] 352 353 def lgred(self, isa, os): 354 self.args = [ 'input.graphic', '1' ] 355 356class bzip2_program(bzip2): 357 def ref(self, isa, os): 358 self.args = [ 'input.program', '58' ] 359 360 def lgred(self, isa, os): 361 self.args = [ 'input.program', '1' ] 362 363class crafty(MinneDefaultBenchmark): 364 name = 'crafty' 365 number = 186 366 lang = 'C' 367 368class eon(MinneDefaultBenchmark): 369 name = 'eon' 370 number = 252 371 lang = 'CXX' 372 stdin = None 373 374class eon_kajiya(eon): 375 args = [ 'chair.control.kajiya', 'chair.camera', 'chair.surfaces', 376 'chair.kajiya.ppm', 'ppm', 'pixels_out.kajiya'] 377 output = 'kajiya_log.out' 378 379 380class eon_cook(eon): 381 args = [ 'chair.control.cook', 'chair.camera', 'chair.surfaces', 382 'chair.cook.ppm', 'ppm', 'pixels_out.cook' ] 383 output = 'cook_log.out' 384 385class eon_rushmeier(eon): 386 args = [ 'chair.control.rushmeier', 'chair.camera', 'chair.surfaces', 387 'chair.rushmeier.ppm', 'ppm', 'pixels_out.rushmeier' ] 388 output = 'rushmeier_log.out' 389 390class gap(DefaultBenchmark): 391 name = 'gap' 392 number = 254 393 lang = 'C' 394 395 def __set_args(self, size): 396 self.args = [ '-l', './', '-q', '-m', size ] 397 398 def test(self, isa, os): 399 self.__set_args('64M') 400 401 def train(self, isa, os): 402 self.__set_args('128M') 403 404 def ref(self, isa, os): 405 self.__set_args('192M') 406 407 def lgred(self, isa, os): 408 self.__set_args('64M') 409 410 def mdred(self, isa, os): 411 self.__set_args('64M') 412 413 def smred(self, isa, os): 414 self.__set_args('64M') 415 416class gcc(DefaultBenchmark): 417 name = 'gcc' 418 number = 176 419 lang = 'C' 420 421 def test(self, isa, os): 422 self.args = [ 'cccp.i', '-o', 'cccp.s' ] 423 424 def train(self, isa, os): 425 self.args = [ 'cp-decl.i', '-o', 'cp-decl.s' ] 426 427 def smred(self, isa, os): 428 self.args = [ 'c-iterate.i', '-o', 'c-iterate.s' ] 429 430 def mdred(self, isa, os): 431 self.args = [ 'rdlanal.i', '-o', 'rdlanal.s' ] 432 433 def lgred(self, isa, os): 434 self.args = [ 'cp-decl.i', '-o', 'cp-decl.s' ] 435 436class gcc_166(gcc): 437 def ref(self, isa, os): 438 self.args = [ '166.i', '-o', '166.s' ] 439 440class gcc_200(gcc): 441 def ref(self, isa, os): 442 self.args = [ '200.i', '-o', '200.s' ] 443 444class gcc_expr(gcc): 445 def ref(self, isa, os): 446 self.args = [ 'expr.i', '-o', 'expr.s' ] 447 448class gcc_integrate(gcc): 449 def ref(self, isa, os): 450 self.args = [ 'integrate.i', '-o', 'integrate.s' ] 451 452class gcc_scilab(gcc): 453 def ref(self, isa, os): 454 self.args = [ 'scilab.i', '-o', 'scilab.s' ] 455 456class gzip(DefaultBenchmark): 457 name = 'gzip' 458 number = 164 459 lang = 'C' 460 461 def test(self, isa, os): 462 self.args = [ 'input.compressed', '2' ] 463 464 def train(self, isa, os): 465 self.args = [ 'input.combined', '32' ] 466 467class gzip_source(gzip): 468 def ref(self, isa, os): 469 self.args = [ 'input.source', '1' ] 470 def smred(self, isa, os): 471 self.args = [ 'input.source', '1' ] 472 def mdred(self, isa, os): 473 self.args = [ 'input.source', '1' ] 474 def lgred(self, isa, os): 475 self.args = [ 'input.source', '1' ] 476 477class gzip_log(gzip): 478 def ref(self, isa, os): 479 self.args = [ 'input.log', '60' ] 480 def smred(self, isa, os): 481 self.args = [ 'input.log', '1' ] 482 def mdred(self, isa, os): 483 self.args = [ 'input.log', '1' ] 484 def lgred(self, isa, os): 485 self.args = [ 'input.log', '1' ] 486 487class gzip_graphic(gzip): 488 def ref(self, isa, os): 489 self.args = [ 'input.graphic', '60' ] 490 def smred(self, isa, os): 491 self.args = [ 'input.graphic', '1' ] 492 def mdred(self, isa, os): 493 self.args = [ 'input.graphic', '1' ] 494 def lgred(self, isa, os): 495 self.args = [ 'input.graphic', '1' ] 496 497class gzip_random(gzip): 498 def ref(self, isa, os): 499 self.args = [ 'input.random', '60' ] 500 def smred(self, isa, os): 501 self.args = [ 'input.random', '1' ] 502 def mdred(self, isa, os): 503 self.args = [ 'input.random', '1' ] 504 def lgred(self, isa, os): 505 self.args = [ 'input.random', '1' ] 506 507class gzip_program(gzip): 508 def ref(self, isa, os): 509 self.args = [ 'input.program', '60' ] 510 def smred(self, isa, os): 511 self.args = [ 'input.program', '1' ] 512 def mdred(self, isa, os): 513 self.args = [ 'input.program', '1' ] 514 def lgred(self, isa, os): 515 self.args = [ 'input.program', '1' ] 516 517class mcf(MinneDefaultBenchmark): 518 name = 'mcf' 519 number = 181 520 lang = 'C' 521 522class parser(MinneDefaultBenchmark): 523 name = 'parser' 524 number = 197 525 lang = 'C' 526 args = [ '2.1.dict', '-batch' ] 527 528class perlbmk(DefaultBenchmark): 529 name = 'perlbmk' 530 number = 253 531 lang = 'C' 532 533 def test(self, isa, os): 534 self.args = [ '-I.', '-I', 'lib', 'test.pl' ] 535 self.stdin = 'test.in' 536 537class perlbmk_diffmail(perlbmk): 538 def ref(self, isa, os): 539 self.args = [ '-I', 'lib', 'diffmail.pl', '2', '550', '15', '24', 540 '23', '100' ] 541 542 def train(self, isa, os): 543 self.args = [ '-I', 'lib', 'diffmail.pl', '2', '350', '15', '24', 544 '23', '150' ] 545 546class perlbmk_scrabbl(perlbmk): 547 def train(self, isa, os): 548 self.args = [ '-I.', '-I', 'lib', 'scrabbl.pl' ] 549 self.stdin = 'scrabbl.in' 550 551class perlbmk_makerand(perlbmk): 552 def ref(self, isa, os): 553 self.args = [ '-I', 'lib', 'makerand.pl' ] 554 555 def lgred(self, isa, os): 556 self.args = [ '-I.', '-I', 'lib', 'lgred.makerand.pl' ] 557 558 def mdred(self, isa, os): 559 self.args = [ '-I.', '-I', 'lib', 'mdred.makerand.pl' ] 560 561 def smred(self, isa, os): 562 self.args = [ '-I.', '-I', 'lib', 'smred.makerand.pl' ] 563 564class perlbmk_perfect(perlbmk): 565 def ref(self, isa, os): 566 self.args = [ '-I', 'lib', 'perfect.pl', 'b', '3', 'm', '4' ] 567 568 def train(self, isa, os): 569 self.args = [ '-I', 'lib', 'perfect.pl', 'b', '3' ] 570 571class perlbmk_splitmail1(perlbmk): 572 def ref(self, isa, os): 573 self.args = [ '-I', 'lib', 'splitmail.pl', '850', '5', '19', 574 '18', '1500' ] 575 576class perlbmk_splitmail2(perlbmk): 577 def ref(self, isa, os): 578 self.args = [ '-I', 'lib', 'splitmail.pl', '704', '12', '26', 579 '16', '836' ] 580 581class perlbmk_splitmail3(perlbmk): 582 def ref(self, isa, os): 583 self.args = [ '-I', 'lib', 'splitmail.pl', '535', '13', '25', 584 '24', '1091' ] 585 586class perlbmk_splitmail4(perlbmk): 587 def ref(self, isa, os): 588 self.args = [ '-I', 'lib', 'splitmail.pl', '957', '12', '23', 589 '26', '1014' ] 590 591class twolf(Benchmark): 592 name = 'twolf' 593 number = 300 594 lang = 'C' 595 stdin = None 596 597 def test(self, isa, os): 598 self.args = [ 'test' ] 599 600 def train(self, isa, os): 601 self.args = [ 'train' ] 602 603 def ref(self, isa, os): 604 self.args = [ 'ref' ] 605 606 def smred(self, isa, os): 607 self.args = [ 'smred' ] 608 609 def mdred(self, isa, os): 610 self.args = [ 'mdred' ] 611 612 def lgred(self, isa, os): 613 self.args = [ 'lgred' ] 614 615class vortex(Benchmark): 616 name = 'vortex' 617 number = 255 618 lang = 'C' 619 stdin = None 620 621 def __init__(self, isa, os, input_set): 622 if isa == 'alpha': 623 self.endian = 'lendian' 624 elif (isa == 'sparc' or isa == 'sparc32'): 625 self.endian = 'bendian' 626 else: 627 raise AttributeError, "unknown ISA %s" % isa 628 629 super(vortex, self).__init__(isa, os, input_set) 630 631 def test(self, isa, os): 632 self.args = [ '%s.raw' % self.endian ] 633 self.output = 'vortex.out' 634 635 def train(self, isa, os): 636 self.args = [ '%s.raw' % self.endian ] 637 self.output = 'vortex.out' 638 639 def smred(self, isa, os): 640 self.args = [ '%s.raw' % self.endian ] 641 self.output = 'vortex.out' 642 643 def mdred(self, isa, os): 644 self.args = [ '%s.raw' % self.endian ] 645 self.output = 'vortex.out' 646 647 def lgred(self, isa, os): 648 self.args = [ '%s.raw' % self.endian ] 649 self.output = 'vortex.out' 650 651class vortex1(vortex): 652 def ref(self, isa, os): 653 self.args = [ '%s1.raw' % self.endian ] 654 self.output = 'vortex1.out' 655 656 657class vortex2(vortex): 658 def ref(self, isa, os): 659 self.args = [ '%s2.raw' % self.endian ] 660 self.output = 'vortex2.out' 661 662class vortex3(vortex): 663 def ref(self, isa, os): 664 self.args = [ '%s3.raw' % self.endian ] 665 self.output = 'vortex3.out' 666 667class vpr(MinneDefaultBenchmark): 668 name = 'vpr' 669 number = 175 670 lang = 'C' 671 672# not sure about vpr minnespec place.in 673class vpr_place(vpr): 674 args = [ 'net.in', 'arch.in', 'place.out', 'dum.out', '-nodisp', 675 '-place_only', '-init_t', '5', '-exit_t', '0.005', 676 '-alpha_t', '0.9412', '-inner_num', '2' ] 677 output = 'place_log.out' 678 679class vpr_route(vpr): 680 args = [ 'net.in', 'arch.in', 'place.in', 'route.out', '-nodisp', 681 '-route_only', '-route_chan_width', '15', 682 '-pres_fac_mult', '2', '-acc_fac', '1', 683 '-first_iter_pres_fac', '4', '-initial_pres_fac', '8' ] 684 output = 'route_log.out' 685 686all = [ ammp, applu, apsi, art110, art470, equake, facerec, fma3d, galgel, 687 lucas, mesa, mgrid, sixtrack, swim, wupwise, bzip2_source, 688 bzip2_graphic, bzip2_program, crafty, eon_kajiya, eon_cook, 689 eon_rushmeier, gap, gcc_166, gcc_200, gcc_expr, gcc_integrate, 690 gcc_scilab, gzip_source, gzip_log, gzip_graphic, gzip_random, 691 gzip_program, mcf, parser, perlbmk_diffmail, perlbmk_makerand, 692 perlbmk_perfect, perlbmk_splitmail1, perlbmk_splitmail2, 693 perlbmk_splitmail3, perlbmk_splitmail4, twolf, vortex1, vortex2, 694 vortex3, vpr_place, vpr_route ] 695 696__all__ = [ x.__name__ for x in all ] 697 698if __name__ == '__main__': 699 from pprint import pprint 700 for bench in all: 701 for input_set in 'ref', 'test', 'train': 702 print 'class: %s' % bench.__name__ 703 x = bench('alpha', 'tru64', input_set) 704 print '%s: %s' % (x, input_set) 705 pprint(x.makeLiveProcessArgs()) 706 print 707