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