run.py revision 4403:824f7311059c
111308Santhony.gutierrez@amd.com# Copyright (c) 2005-2007 The Regents of The University of Michigan
211308Santhony.gutierrez@amd.com# All rights reserved.
311308Santhony.gutierrez@amd.com#
411308Santhony.gutierrez@amd.com# Redistribution and use in source and binary forms, with or without
511308Santhony.gutierrez@amd.com# modification, are permitted provided that the following conditions are
611308Santhony.gutierrez@amd.com# met: redistributions of source code must retain the above copyright
711308Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer;
811308Santhony.gutierrez@amd.com# redistributions in binary form must reproduce the above copyright
911308Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer in the
1011308Santhony.gutierrez@amd.com# documentation and/or other materials provided with the distribution;
1111308Santhony.gutierrez@amd.com# neither the name of the copyright holders nor the names of its
1211308Santhony.gutierrez@amd.com# contributors may be used to endorse or promote products derived from
1311308Santhony.gutierrez@amd.com# this software without specific prior written permission.
1411308Santhony.gutierrez@amd.com#
1511308Santhony.gutierrez@amd.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1611308Santhony.gutierrez@amd.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1711308Santhony.gutierrez@amd.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1811308Santhony.gutierrez@amd.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1911308Santhony.gutierrez@amd.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2011308Santhony.gutierrez@amd.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2111308Santhony.gutierrez@amd.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2211308Santhony.gutierrez@amd.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2311308Santhony.gutierrez@amd.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2411308Santhony.gutierrez@amd.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2511308Santhony.gutierrez@amd.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2611308Santhony.gutierrez@amd.com#
2711308Santhony.gutierrez@amd.com# Authors: Ron Dreslinski
2811308Santhony.gutierrez@amd.com
2911308Santhony.gutierrez@amd.com# Splash2 Run Script
3011308Santhony.gutierrez@amd.com#
3111308Santhony.gutierrez@amd.com
3211308Santhony.gutierrez@amd.comimport m5
3311308Santhony.gutierrez@amd.comfrom m5.objects import *
3411308Santhony.gutierrez@amd.comimport os, optparse, sys
3511308Santhony.gutierrez@amd.comm5.AddToPath('../common')
3611308Santhony.gutierrez@amd.com
3711308Santhony.gutierrez@amd.com# --------------------
3811308Santhony.gutierrez@amd.com# Define Command Line Options
3911308Santhony.gutierrez@amd.com# ====================
4011308Santhony.gutierrez@amd.com
4111308Santhony.gutierrez@amd.comparser = optparse.OptionParser()
4211308Santhony.gutierrez@amd.com
4311308Santhony.gutierrez@amd.comparser.add_option("-d", "--detailed", action="store_true")
4411308Santhony.gutierrez@amd.comparser.add_option("-t", "--timing", action="store_true")
4511308Santhony.gutierrez@amd.comparser.add_option("-m", "--maxtick", type="int")
4611308Santhony.gutierrez@amd.comparser.add_option("-n", "--numcpus",
4711308Santhony.gutierrez@amd.com                  help="Number of cpus in total", type="int")
4811308Santhony.gutierrez@amd.comparser.add_option("-f", "--frequency",
4911308Santhony.gutierrez@amd.com                  default = "1GHz",
5012334Sgabeblack@google.com                  help="Frequency of each CPU")
5111308Santhony.gutierrez@amd.comparser.add_option("-p", "--protocol",
5211308Santhony.gutierrez@amd.com                  default="moesi",
5311308Santhony.gutierrez@amd.com                  help="The coherence protocol to use for the L1'a (i.e. MOESI, MOSI)")
5411308Santhony.gutierrez@amd.comparser.add_option("--l1size",
5511308Santhony.gutierrez@amd.com                  default = "32kB")
5611308Santhony.gutierrez@amd.comparser.add_option("--l1latency",
5711308Santhony.gutierrez@amd.com                  default = 1)
5811308Santhony.gutierrez@amd.comparser.add_option("--l2size",
5911308Santhony.gutierrez@amd.com                  default = "256kB")
6011308Santhony.gutierrez@amd.comparser.add_option("--l2latency",
6111308Santhony.gutierrez@amd.com                  default = 10)
6211308Santhony.gutierrez@amd.comparser.add_option("--rootdir",
6311308Santhony.gutierrez@amd.com                  help="Root directory of Splash2",
6411308Santhony.gutierrez@amd.com                  default="/dist/splash2/codes")
6511308Santhony.gutierrez@amd.comparser.add_option("-b", "--benchmark",
6611308Santhony.gutierrez@amd.com                  help="Splash 2 benchmark to run")
6711308Santhony.gutierrez@amd.com
6811308Santhony.gutierrez@amd.com(options, args) = parser.parse_args()
6911308Santhony.gutierrez@amd.com
7011308Santhony.gutierrez@amd.comif args:
7111713Santhony.gutierrez@amd.com    print "Error: script doesn't take any positional arguments"
7211308Santhony.gutierrez@amd.com    sys.exit(1)
7311308Santhony.gutierrez@amd.com
7411308Santhony.gutierrez@amd.comif not options.numcpus:
7511308Santhony.gutierrez@amd.com    print "Specify the number of cpus with -n"
7611308Santhony.gutierrez@amd.com    sys.exit(1)
7711308Santhony.gutierrez@amd.com
7811308Santhony.gutierrez@amd.com# --------------------
7911308Santhony.gutierrez@amd.com# Define Splash2 Benchmarks
8011308Santhony.gutierrez@amd.com# ====================
8111308Santhony.gutierrez@amd.comclass Cholesky(LiveProcess):
8211308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/kernels/cholesky'
8311308Santhony.gutierrez@amd.com    executable = options.rootdir + '/kernels/cholesky/CHOLESKY'
8411308Santhony.gutierrez@amd.com    cmd = 'CHOLESKY -p' + str(options.numcpus) + ' '\
8511308Santhony.gutierrez@amd.com          + options.rootdir + '/kernels/cholesky/inputs/tk23.O'
8611308Santhony.gutierrez@amd.com
8711308Santhony.gutierrez@amd.comclass FFT(LiveProcess):
8811308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/kernels/fft'
8911308Santhony.gutierrez@amd.com    executable = options.rootdir + '/kernels/fft/FFT'
9011308Santhony.gutierrez@amd.com    cmd = 'FFT -p' + str(options.numcpus) + ' -m18'
9111308Santhony.gutierrez@amd.com
9211308Santhony.gutierrez@amd.comclass LU_contig(LiveProcess):
9311308Santhony.gutierrez@amd.com    executable = options.rootdir + '/kernels/lu/contiguous_blocks/LU'
9411308Santhony.gutierrez@amd.com    cmd = 'LU -p' + str(options.numcpus)
9511308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/kernels/lu/contiguous_blocks'
9611308Santhony.gutierrez@amd.com
9711308Santhony.gutierrez@amd.comclass LU_noncontig(LiveProcess):
9811308Santhony.gutierrez@amd.com    executable = options.rootdir + '/kernels/lu/non_contiguous_blocks/LU'
9911308Santhony.gutierrez@amd.com    cmd = 'LU -p' + str(options.numcpus)
10011308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/kernels/lu/non_contiguous_blocks'
10111308Santhony.gutierrez@amd.com
10211308Santhony.gutierrez@amd.comclass Radix(LiveProcess):
10311308Santhony.gutierrez@amd.com    executable = options.rootdir + '/kernels/radix/RADIX'
10411308Santhony.gutierrez@amd.com    cmd = 'RADIX -n524288 -p' + str(options.numcpus)
10511308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/kernels/radix'
10611308Santhony.gutierrez@amd.com
10711308Santhony.gutierrez@amd.comclass Barnes(LiveProcess):
10811308Santhony.gutierrez@amd.com    executable = options.rootdir + '/apps/barnes/BARNES'
10911308Santhony.gutierrez@amd.com    cmd = 'BARNES'
11011308Santhony.gutierrez@amd.com    input = options.rootdir + '/apps/barnes/input.p' + str(options.numcpus)
11111308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/apps/barnes'
11211308Santhony.gutierrez@amd.com
11311308Santhony.gutierrez@amd.comclass FMM(LiveProcess):
11411308Santhony.gutierrez@amd.com    executable = options.rootdir + '/apps/fmm/FMM'
11511308Santhony.gutierrez@amd.com    cmd = 'FMM'
11611308Santhony.gutierrez@amd.com    if str(options.numcpus) == '1':
11711308Santhony.gutierrez@amd.com        input = options.rootdir + '/apps/fmm/inputs/input.2048'
11811308Santhony.gutierrez@amd.com    else:
11911308Santhony.gutierrez@amd.com        input = options.rootdir + '/apps/fmm/inputs/input.2048.p' + str(options.numcpus)
12011308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/apps/fmm'
12111308Santhony.gutierrez@amd.com
12211308Santhony.gutierrez@amd.comclass Ocean_contig(LiveProcess):
12311308Santhony.gutierrez@amd.com    executable = options.rootdir + '/apps/ocean/contiguous_partitions/OCEAN'
12411308Santhony.gutierrez@amd.com    cmd = 'OCEAN -p' + str(options.numcpus)
12511308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/apps/ocean/contiguous_partitions'
12611308Santhony.gutierrez@amd.com
12711308Santhony.gutierrez@amd.comclass Ocean_noncontig(LiveProcess):
12811308Santhony.gutierrez@amd.com    executable = options.rootdir + '/apps/ocean/non_contiguous_partitions/OCEAN'
12911308Santhony.gutierrez@amd.com    cmd = 'OCEAN -p' + str(options.numcpus)
13011308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/apps/ocean/non_contiguous_partitions'
13111308Santhony.gutierrez@amd.com
13211308Santhony.gutierrez@amd.comclass Raytrace(LiveProcess):
13311308Santhony.gutierrez@amd.com    executable = options.rootdir + '/apps/raytrace/RAYTRACE'
13411308Santhony.gutierrez@amd.com    cmd = 'RAYTRACE -p' + str(options.numcpus) + ' ' \
13511308Santhony.gutierrez@amd.com          + options.rootdir + '/apps/raytrace/inputs/teapot.env'
13611308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/apps/raytrace'
13711308Santhony.gutierrez@amd.com
13811308Santhony.gutierrez@amd.comclass Water_nsquared(LiveProcess):
13911308Santhony.gutierrez@amd.com    executable = options.rootdir + '/apps/water-nsquared/WATER-NSQUARED'
14011308Santhony.gutierrez@amd.com    cmd = 'WATER-NSQUARED'
14111308Santhony.gutierrez@amd.com    if options.numcpus==1:
14211308Santhony.gutierrez@amd.com        input = options.rootdir + '/apps/water-nsquared/input'
14311308Santhony.gutierrez@amd.com    else:
14411308Santhony.gutierrez@amd.com        input = options.rootdir + '/apps/water-nsquared/input.p' + str(options.numcpus)
14511308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/apps/water-nsquared'
14611308Santhony.gutierrez@amd.com
14711308Santhony.gutierrez@amd.comclass Water_spatial(LiveProcess):
14811308Santhony.gutierrez@amd.com    executable = options.rootdir + '/apps/water-spatial/WATER-SPATIAL'
14911308Santhony.gutierrez@amd.com    cmd = 'WATER-SPATIAL'
15011308Santhony.gutierrez@amd.com    if options.numcpus==1:
15111308Santhony.gutierrez@amd.com        input = options.rootdir + '/apps/water-spatial/input'
15211308Santhony.gutierrez@amd.com    else:
15311308Santhony.gutierrez@amd.com        input = options.rootdir + '/apps/water-spatial/input.p' + str(options.numcpus)
15411308Santhony.gutierrez@amd.com    cwd = options.rootdir + '/apps/water-spatial'
15511308Santhony.gutierrez@amd.com
15611308Santhony.gutierrez@amd.com# --------------------
15711308Santhony.gutierrez@amd.com# Base L1 Cache Definition
15811308Santhony.gutierrez@amd.com# ====================
15911308Santhony.gutierrez@amd.com
16011308Santhony.gutierrez@amd.comclass L1(BaseCache):
16111308Santhony.gutierrez@amd.com    latency = options.l1latency
16211308Santhony.gutierrez@amd.com    block_size = 64
16311308Santhony.gutierrez@amd.com    mshrs = 12
16411308Santhony.gutierrez@amd.com    tgts_per_mshr = 8
16511308Santhony.gutierrez@amd.com    protocol = CoherenceProtocol(protocol=options.protocol)
16611308Santhony.gutierrez@amd.com
16711308Santhony.gutierrez@amd.com# ----------------------
16811308Santhony.gutierrez@amd.com# Base L2 Cache Definition
16911308Santhony.gutierrez@amd.com# ----------------------
17011308Santhony.gutierrez@amd.com
17111308Santhony.gutierrez@amd.comclass L2(BaseCache):
17211308Santhony.gutierrez@amd.com    block_size = 64
17311704Santhony.gutierrez@amd.com    latency = options.l2latency
17411308Santhony.gutierrez@amd.com    mshrs = 92
17511308Santhony.gutierrez@amd.com    tgts_per_mshr = 16
17611308Santhony.gutierrez@amd.com    write_buffers = 8
17711308Santhony.gutierrez@amd.com
17811308Santhony.gutierrez@amd.com# ----------------------
17911308Santhony.gutierrez@amd.com# Define the cpus
18011308Santhony.gutierrez@amd.com# ----------------------
18111308Santhony.gutierrez@amd.com
18211308Santhony.gutierrez@amd.combusFrequency = Frequency(options.frequency)
18311308Santhony.gutierrez@amd.com
18411308Santhony.gutierrez@amd.comif options.timing:
18511308Santhony.gutierrez@amd.com    cpus = [TimingSimpleCPU(cpu_id = i,
18611308Santhony.gutierrez@amd.com                            clock=options.frequency)
18711308Santhony.gutierrez@amd.com            for i in xrange(options.numcpus)]
18811308Santhony.gutierrez@amd.comelif options.detailed:
18911308Santhony.gutierrez@amd.com    cpus = [DerivO3CPU(cpu_id = i,
19011308Santhony.gutierrez@amd.com                       clock=options.frequency)
19111308Santhony.gutierrez@amd.com            for i in xrange(options.numcpus)]
19211308Santhony.gutierrez@amd.comelse:
19311308Santhony.gutierrez@amd.com    cpus = [AtomicSimpleCPU(cpu_id = i,
19411308Santhony.gutierrez@amd.com                            clock=options.frequency)
19511308Santhony.gutierrez@amd.com            for i in xrange(options.numcpus)]
19611308Santhony.gutierrez@amd.com
19711308Santhony.gutierrez@amd.com# ----------------------
19811308Santhony.gutierrez@amd.com# Create a system, and add system wide objects
19911308Santhony.gutierrez@amd.com# ----------------------
20011308Santhony.gutierrez@amd.comsystem = System(cpu = cpus, physmem = PhysicalMemory(),
20111308Santhony.gutierrez@amd.com                membus = Bus(clock = busFrequency))
20211308Santhony.gutierrez@amd.com
20311308Santhony.gutierrez@amd.comsystem.toL2bus = Bus(clock = busFrequency)
20411308Santhony.gutierrez@amd.comsystem.l2 = L2(size = options.l2size, assoc = 8)
20511308Santhony.gutierrez@amd.com
20611308Santhony.gutierrez@amd.com# ----------------------
20711308Santhony.gutierrez@amd.com# Connect the L2 cache and memory together
20811308Santhony.gutierrez@amd.com# ----------------------
20911308Santhony.gutierrez@amd.com
21011308Santhony.gutierrez@amd.comsystem.physmem.port = system.membus.port
21111308Santhony.gutierrez@amd.comsystem.l2.cpu_side = system.toL2bus.port
21211308Santhony.gutierrez@amd.comsystem.l2.mem_side = system.membus.port
21311308Santhony.gutierrez@amd.com
21411308Santhony.gutierrez@amd.com# ----------------------
21511308Santhony.gutierrez@amd.com# Connect the L2 cache and clusters together
21611308Santhony.gutierrez@amd.com# ----------------------
21711308Santhony.gutierrez@amd.comfor cpu in cpus:
21811308Santhony.gutierrez@amd.com    cpu.addPrivateSplitL1Caches(L1(size = options.l1size, assoc = 1),
21911308Santhony.gutierrez@amd.com                                L1(size = options.l1size, assoc = 4))
22011308Santhony.gutierrez@amd.com    cpu.mem = cpu.dcache
22111308Santhony.gutierrez@amd.com    # connect cpu level-1 caches to shared level-2 cache
22211308Santhony.gutierrez@amd.com    cpu.connectMemPorts(system.toL2bus)
22311308Santhony.gutierrez@amd.com
22411308Santhony.gutierrez@amd.com
22511308Santhony.gutierrez@amd.com# ----------------------
22611308Santhony.gutierrez@amd.com# Define the root
22711308Santhony.gutierrez@amd.com# ----------------------
22811308Santhony.gutierrez@amd.com
22911308Santhony.gutierrez@amd.comroot = Root(system = system)
23011308Santhony.gutierrez@amd.com
23111308Santhony.gutierrez@amd.com# --------------------
23211308Santhony.gutierrez@amd.com# Pick the correct Splash2 Benchmarks
23311308Santhony.gutierrez@amd.com# ====================
23411308Santhony.gutierrez@amd.comif options.benchmark == 'Cholesky':
23511308Santhony.gutierrez@amd.com    root.workload = Cholesky()
23611308Santhony.gutierrez@amd.comelif options.benchmark == 'FFT':
23711308Santhony.gutierrez@amd.com    root.workload = FFT()
23811308Santhony.gutierrez@amd.comelif options.benchmark == 'LUContig':
23911308Santhony.gutierrez@amd.com    root.workload = LU_contig()
24011308Santhony.gutierrez@amd.comelif options.benchmark == 'LUNoncontig':
24111308Santhony.gutierrez@amd.com    root.workload = LU_noncontig()
24211308Santhony.gutierrez@amd.comelif options.benchmark == 'Radix':
24311308Santhony.gutierrez@amd.com    root.workload = Radix()
24411308Santhony.gutierrez@amd.comelif options.benchmark == 'Barnes':
24511308Santhony.gutierrez@amd.com    root.workload = Barnes()
24611308Santhony.gutierrez@amd.comelif options.benchmark == 'FMM':
24711308Santhony.gutierrez@amd.com    root.workload = FMM()
24811308Santhony.gutierrez@amd.comelif options.benchmark == 'OceanContig':
24911308Santhony.gutierrez@amd.com    root.workload = Ocean_contig()
25011308Santhony.gutierrez@amd.comelif options.benchmark == 'OceanNoncontig':
25111308Santhony.gutierrez@amd.com    root.workload = Ocean_noncontig()
25211308Santhony.gutierrez@amd.comelif options.benchmark == 'Raytrace':
25311308Santhony.gutierrez@amd.com    root.workload = Raytrace()
25411308Santhony.gutierrez@amd.comelif options.benchmark == 'WaterNSquared':
25511308Santhony.gutierrez@amd.com    root.workload = Water_nsquared()
25611308Santhony.gutierrez@amd.comelif options.benchmark == 'WaterSpatial':
25711308Santhony.gutierrez@amd.com    root.workload = Water_spatial()
25811308Santhony.gutierrez@amd.comelse:
25911308Santhony.gutierrez@amd.com    panic("The --benchmark environment variable was set to something" \
26011308Santhony.gutierrez@amd.com          +" improper.\nUse Cholesky, FFT, LUContig, LUNoncontig, Radix" \
26111308Santhony.gutierrez@amd.com          +", Barnes, FMM, OceanContig,\nOceanNoncontig, Raytrace," \
26211308Santhony.gutierrez@amd.com          +" WaterNSquared, or WaterSpatial\n")
26311308Santhony.gutierrez@amd.com
26411308Santhony.gutierrez@amd.com# --------------------
26511308Santhony.gutierrez@amd.com# Assign the workload to the cpus
26611308Santhony.gutierrez@amd.com# ====================
26711308Santhony.gutierrez@amd.com
26811308Santhony.gutierrez@amd.comfor cpu in cpus:
26911308Santhony.gutierrez@amd.com    cpu.workload = root.workload
27011308Santhony.gutierrez@amd.com
27111308Santhony.gutierrez@amd.com# ----------------------
27211308Santhony.gutierrez@amd.com# Run the simulation
27311308Santhony.gutierrez@amd.com# ----------------------
27411308Santhony.gutierrez@amd.com
27511308Santhony.gutierrez@amd.comif options.timing or options.detailed:
27611308Santhony.gutierrez@amd.com    root.system.mem_mode = 'timing'
27711308Santhony.gutierrez@amd.com
27811308Santhony.gutierrez@amd.com# instantiate configuration
27911308Santhony.gutierrez@amd.comm5.instantiate(root)
28011308Santhony.gutierrez@amd.com
28111308Santhony.gutierrez@amd.com# simulate until program terminates
28211308Santhony.gutierrez@amd.comif options.maxtick:
28311308Santhony.gutierrez@amd.com    exit_event = m5.simulate(options.maxtick)
28411308Santhony.gutierrez@amd.comelse:
28511308Santhony.gutierrez@amd.com    exit_event = m5.simulate(m5.MaxTick)
28611308Santhony.gutierrez@amd.com
28711308Santhony.gutierrez@amd.comprint 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
28811308Santhony.gutierrez@amd.com
28911308Santhony.gutierrez@amd.com