cluster.py revision 8801
111308Santhony.gutierrez@amd.com# Copyright (c) 2006-2007 The Regents of The University of Michigan
212697Santhony.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
1712697Santhony.gutierrez@amd.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1812697Santhony.gutierrez@amd.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1912697Santhony.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# Simple test script
3011308Santhony.gutierrez@amd.com#
3111308Santhony.gutierrez@amd.com# "m5 test.py"
3211308Santhony.gutierrez@amd.com
3312697Santhony.gutierrez@amd.comimport os
3412697Santhony.gutierrez@amd.comimport optparse
3512697Santhony.gutierrez@amd.comimport sys
3611308Santhony.gutierrez@amd.com
3711308Santhony.gutierrez@amd.comimport m5
3811308Santhony.gutierrez@amd.comfrom m5.objects import *
3911308Santhony.gutierrez@amd.com
4011308Santhony.gutierrez@amd.comm5.util.addToPath('../common')
4111308Santhony.gutierrez@amd.com
4211308Santhony.gutierrez@amd.com# --------------------
4311308Santhony.gutierrez@amd.com# Define Command Line Options
4411308Santhony.gutierrez@amd.com# ====================
4511308Santhony.gutierrez@amd.com
4611308Santhony.gutierrez@amd.comparser = optparse.OptionParser()
4711308Santhony.gutierrez@amd.com
4811308Santhony.gutierrez@amd.comparser.add_option("-d", "--detailed", action="store_true")
4911308Santhony.gutierrez@amd.comparser.add_option("-t", "--timing", action="store_true")
5011308Santhony.gutierrez@amd.comparser.add_option("-m", "--maxtick", type="int")
5111308Santhony.gutierrez@amd.comparser.add_option("-c", "--numclusters",
5212680Sgiacomo.travaglini@arm.com                  help="Number of clusters", type="int")
5311308Santhony.gutierrez@amd.comparser.add_option("-n", "--numcpus",
5411308Santhony.gutierrez@amd.com                  help="Number of cpus in total", type="int")
5512126Sspwilson2@wisc.eduparser.add_option("-f", "--frequency",
5612126Sspwilson2@wisc.edu                  default = "1GHz",
5712126Sspwilson2@wisc.edu                  help="Frequency of each CPU")
5811308Santhony.gutierrez@amd.comparser.add_option("--l1size",
5911308Santhony.gutierrez@amd.com                  default = "32kB")
6011308Santhony.gutierrez@amd.comparser.add_option("--l1latency",
6111308Santhony.gutierrez@amd.com                  default = 1)
6211308Santhony.gutierrez@amd.comparser.add_option("--l2size",
6311308Santhony.gutierrez@amd.com                  default = "256kB")
6411308Santhony.gutierrez@amd.comparser.add_option("--l2latency",
6511308Santhony.gutierrez@amd.com                  default = 10)
6611308Santhony.gutierrez@amd.comparser.add_option("--rootdir",
6711308Santhony.gutierrez@amd.com                  help="ROot directory of Splash2",
6811308Santhony.gutierrez@amd.com                  default="/dist/splash2/codes/")
6911308Santhony.gutierrez@amd.comparser.add_option("-b", "--benchmark",
7011308Santhony.gutierrez@amd.com                  help="Splash 2 benchmark to run")
7111308Santhony.gutierrez@amd.com
7211308Santhony.gutierrez@amd.com(options, args) = parser.parse_args()
7311308Santhony.gutierrez@amd.com
7411308Santhony.gutierrez@amd.comif args:
7511308Santhony.gutierrez@amd.com    print "Error: script doesn't take any positional arguments"
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        executable = options.rootdir + '/kernels/cholesky/CHOLESKY'
8311308Santhony.gutierrez@amd.com        cmd = 'CHOLESKY -p' + str(options.numcpus) + ' '\
8411308Santhony.gutierrez@amd.com             + options.rootdir + '/kernels/cholesky/inputs/tk23.O'
8511308Santhony.gutierrez@amd.com
8611308Santhony.gutierrez@amd.comclass FFT(LiveProcess):
8711308Santhony.gutierrez@amd.com        executable = options.rootdir + 'kernels/fft/FFT'
8811308Santhony.gutierrez@amd.com        cmd = 'FFT -p' + str(options.numcpus) + ' -m18'
8911308Santhony.gutierrez@amd.com
9011308Santhony.gutierrez@amd.comclass LU_contig(LiveProcess):
9111308Santhony.gutierrez@amd.com        executable = options.rootdir + 'kernels/lu/contiguous_blocks/LU'
9211308Santhony.gutierrez@amd.com        cmd = 'LU -p' + str(options.numcpus)
9311308Santhony.gutierrez@amd.com
9411308Santhony.gutierrez@amd.comclass LU_noncontig(LiveProcess):
9511308Santhony.gutierrez@amd.com        executable = options.rootdir + 'kernels/lu/non_contiguous_blocks/LU'
9611308Santhony.gutierrez@amd.com        cmd = 'LU -p' + str(options.numcpus)
9711308Santhony.gutierrez@amd.com
9811308Santhony.gutierrez@amd.comclass Radix(LiveProcess):
9911308Santhony.gutierrez@amd.com        executable = options.rootdir + 'kernels/radix/RADIX'
10011308Santhony.gutierrez@amd.com        cmd = 'RADIX -n524288 -p' + str(options.numcpus)
10111308Santhony.gutierrez@amd.com
10211308Santhony.gutierrez@amd.comclass Barnes(LiveProcess):
10311308Santhony.gutierrez@amd.com        executable = options.rootdir + 'apps/barnes/BARNES'
10411308Santhony.gutierrez@amd.com        cmd = 'BARNES'
10511308Santhony.gutierrez@amd.com        input = options.rootdir + 'apps/barnes/input.p' + str(options.numcpus)
10611308Santhony.gutierrez@amd.com
10711308Santhony.gutierrez@amd.comclass FMM(LiveProcess):
10811308Santhony.gutierrez@amd.com        executable = options.rootdir + 'apps/fmm/FMM'
10911308Santhony.gutierrez@amd.com        cmd = 'FMM'
11011308Santhony.gutierrez@amd.com        input = options.rootdir + 'apps/fmm/inputs/input.2048.p' + str(options.numcpus)
11111308Santhony.gutierrez@amd.com
11211308Santhony.gutierrez@amd.comclass Ocean_contig(LiveProcess):
11311308Santhony.gutierrez@amd.com        executable = options.rootdir + 'apps/ocean/contiguous_partitions/OCEAN'
11411308Santhony.gutierrez@amd.com        cmd = 'OCEAN -p' + str(options.numcpus)
11511308Santhony.gutierrez@amd.com
11611308Santhony.gutierrez@amd.comclass Ocean_noncontig(LiveProcess):
11711308Santhony.gutierrez@amd.com        executable = options.rootdir + 'apps/ocean/non_contiguous_partitions/OCEAN'
11811308Santhony.gutierrez@amd.com        cmd = 'OCEAN -p' + str(options.numcpus)
11911308Santhony.gutierrez@amd.com
12011308Santhony.gutierrez@amd.comclass Raytrace(LiveProcess):
12111308Santhony.gutierrez@amd.com        executable = options.rootdir + 'apps/raytrace/RAYTRACE'
12211308Santhony.gutierrez@amd.com        cmd = 'RAYTRACE -p' + str(options.numcpus) + ' ' \
12311308Santhony.gutierrez@amd.com             + options.rootdir + 'apps/raytrace/inputs/teapot.env'
12411308Santhony.gutierrez@amd.com
12511308Santhony.gutierrez@amd.comclass Water_nsquared(LiveProcess):
12611308Santhony.gutierrez@amd.com        executable = options.rootdir + 'apps/water-nsquared/WATER-NSQUARED'
12711308Santhony.gutierrez@amd.com        cmd = 'WATER-NSQUARED'
12811308Santhony.gutierrez@amd.com        input = options.rootdir + 'apps/water-nsquared/input.p' + str(options.numcpus)
12911308Santhony.gutierrez@amd.com
13011308Santhony.gutierrez@amd.comclass Water_spatial(LiveProcess):
13111308Santhony.gutierrez@amd.com        executable = options.rootdir + 'apps/water-spatial/WATER-SPATIAL'
13211308Santhony.gutierrez@amd.com        cmd = 'WATER-SPATIAL'
13311308Santhony.gutierrez@amd.com        input = options.rootdir + 'apps/water-spatial/input.p' + str(options.numcpus)
13411308Santhony.gutierrez@amd.com
13511308Santhony.gutierrez@amd.com
13611308Santhony.gutierrez@amd.com# --------------------
13711308Santhony.gutierrez@amd.com# Base L1 Cache Definition
13811308Santhony.gutierrez@amd.com# ====================
13911308Santhony.gutierrez@amd.com
14011308Santhony.gutierrez@amd.comclass L1(BaseCache):
14111308Santhony.gutierrez@amd.com    latency = options.l1latency
14213345Sgabeblack@google.com    block_size = 64
14311308Santhony.gutierrez@amd.com    mshrs = 12
14411308Santhony.gutierrez@amd.com    tgts_per_mshr = 8
14511308Santhony.gutierrez@amd.com
14611308Santhony.gutierrez@amd.com# ----------------------
14711308Santhony.gutierrez@amd.com# Base L2 Cache Definition
14811308Santhony.gutierrez@amd.com# ----------------------
14911308Santhony.gutierrez@amd.com
15011308Santhony.gutierrez@amd.comclass L2(BaseCache):
15111308Santhony.gutierrez@amd.com    block_size = 64
15211308Santhony.gutierrez@amd.com    latency = options.l2latency
15311308Santhony.gutierrez@amd.com    mshrs = 92
15411308Santhony.gutierrez@amd.com    tgts_per_mshr = 16
15511308Santhony.gutierrez@amd.com    write_buffers = 8
15611308Santhony.gutierrez@amd.com
15711308Santhony.gutierrez@amd.com# ----------------------
15811308Santhony.gutierrez@amd.com# Define the clusters with their cpus
15911308Santhony.gutierrez@amd.com# ----------------------
16011308Santhony.gutierrez@amd.comclass Cluster:
16111308Santhony.gutierrez@amd.com    pass
16211308Santhony.gutierrez@amd.com
16311308Santhony.gutierrez@amd.comcpusPerCluster = options.numcpus/options.numclusters
16411308Santhony.gutierrez@amd.com
16511308Santhony.gutierrez@amd.combusFrequency = Frequency(options.frequency)
16611308Santhony.gutierrez@amd.combusFrequency *= cpusPerCluster
16711308Santhony.gutierrez@amd.com
16811308Santhony.gutierrez@amd.comall_cpus = []
16913345Sgabeblack@google.comall_l1s = []
17011308Santhony.gutierrez@amd.comall_l1buses = []
17111308Santhony.gutierrez@amd.comif options.timing:
17213345Sgabeblack@google.com    clusters = [ Cluster() for i in xrange(options.numclusters)]
17311308Santhony.gutierrez@amd.com    for j in xrange(options.numclusters):
17411308Santhony.gutierrez@amd.com        clusters[j].id = j
17513345Sgabeblack@google.com    for cluster in clusters:
17611308Santhony.gutierrez@amd.com        cluster.clusterbus = Bus(clock=busFrequency)
17711308Santhony.gutierrez@amd.com        all_l1buses += [cluster.clusterbus]
17813345Sgabeblack@google.com        cluster.cpus = [TimingSimpleCPU(cpu_id = i + cluster.id,
17911308Santhony.gutierrez@amd.com                                        clock=options.frequency)
18011308Santhony.gutierrez@amd.com                        for i in xrange(cpusPerCluster)]
18111308Santhony.gutierrez@amd.com        all_cpus += cluster.cpus
18211308Santhony.gutierrez@amd.com        cluster.l1 = L1(size=options.l1size, assoc = 4)
18311308Santhony.gutierrez@amd.com        all_l1s += [cluster.l1]
18411308Santhony.gutierrez@amd.comelif options.detailed:
18511308Santhony.gutierrez@amd.com    clusters = [ Cluster() for i in xrange(options.numclusters)]
18611308Santhony.gutierrez@amd.com    for j in xrange(options.numclusters):
18711308Santhony.gutierrez@amd.com        clusters[j].id = j
18811308Santhony.gutierrez@amd.com    for cluster in clusters:
18911308Santhony.gutierrez@amd.com        cluster.clusterbus = Bus(clock=busFrequency)
19011308Santhony.gutierrez@amd.com        all_l1buses += [cluster.clusterbus]
19111308Santhony.gutierrez@amd.com        cluster.cpus = [DerivO3CPU(cpu_id = i + cluster.id,
19211308Santhony.gutierrez@amd.com                                   clock=options.frequency)
19311308Santhony.gutierrez@amd.com                        for i in xrange(cpusPerCluster)]
19411308Santhony.gutierrez@amd.com        all_cpus += cluster.cpus
19511308Santhony.gutierrez@amd.com        cluster.l1 = L1(size=options.l1size, assoc = 4)
19611308Santhony.gutierrez@amd.com        all_l1s += [cluster.l1]
19711308Santhony.gutierrez@amd.comelse:
19811308Santhony.gutierrez@amd.com    clusters = [ Cluster() for i in xrange(options.numclusters)]
19911308Santhony.gutierrez@amd.com    for j in xrange(options.numclusters):
20011308Santhony.gutierrez@amd.com        clusters[j].id = j
20111308Santhony.gutierrez@amd.com    for cluster in clusters:
20211308Santhony.gutierrez@amd.com        cluster.clusterbus = Bus(clock=busFrequency)
20311308Santhony.gutierrez@amd.com        all_l1buses += [cluster.clusterbus]
20411308Santhony.gutierrez@amd.com        cluster.cpus = [AtomicSimpleCPU(cpu_id = i + cluster.id,
20511308Santhony.gutierrez@amd.com                                        clock=options.frequency)
20611308Santhony.gutierrez@amd.com                        for i in xrange(cpusPerCluster)]
20711308Santhony.gutierrez@amd.com        all_cpus += cluster.cpus
20811308Santhony.gutierrez@amd.com        cluster.l1 = L1(size=options.l1size, assoc = 4)
20911308Santhony.gutierrez@amd.com        all_l1s += [cluster.l1]
21011308Santhony.gutierrez@amd.com
21111308Santhony.gutierrez@amd.com# ----------------------
21211308Santhony.gutierrez@amd.com# Create a system, and add system wide objects
21311308Santhony.gutierrez@amd.com# ----------------------
21411308Santhony.gutierrez@amd.comsystem = System(cpu = all_cpus, l1_ = all_l1s, l1bus_ = all_l1buses, physmem = PhysicalMemory(),
21511308Santhony.gutierrez@amd.com                membus = Bus(clock = busFrequency))
21611308Santhony.gutierrez@amd.com
21711308Santhony.gutierrez@amd.comsystem.toL2bus = Bus(clock = busFrequency)
21811308Santhony.gutierrez@amd.comsystem.l2 = L2(size = options.l2size, assoc = 8)
21911308Santhony.gutierrez@amd.com
22011308Santhony.gutierrez@amd.com# ----------------------
22111308Santhony.gutierrez@amd.com# Connect the L2 cache and memory together
22211308Santhony.gutierrez@amd.com# ----------------------
22311308Santhony.gutierrez@amd.com
22411308Santhony.gutierrez@amd.comsystem.physmem.port = system.membus.port
22511308Santhony.gutierrez@amd.comsystem.l2.cpu_side = system.toL2bus.port
22611308Santhony.gutierrez@amd.comsystem.l2.mem_side = system.membus.port
22711308Santhony.gutierrez@amd.com
22811308Santhony.gutierrez@amd.com# ----------------------
22911435Smitch.hayenga@arm.com# Connect the L2 cache and clusters together
23011308Santhony.gutierrez@amd.com# ----------------------
23111308Santhony.gutierrez@amd.comfor cluster in clusters:
23211308Santhony.gutierrez@amd.com    cluster.l1.cpu_side = cluster.clusterbus.port
23311308Santhony.gutierrez@amd.com    cluster.l1.mem_side = system.toL2bus.port
23411308Santhony.gutierrez@amd.com    for cpu in cluster.cpus:
23511308Santhony.gutierrez@amd.com        cpu.icache_port = cluster.clusterbus.port
23611308Santhony.gutierrez@amd.com        cpu.dcache_port = cluster.clusterbus.port
23711308Santhony.gutierrez@amd.com
23811308Santhony.gutierrez@amd.com# ----------------------
23911308Santhony.gutierrez@amd.com# Define the root
24011308Santhony.gutierrez@amd.com# ----------------------
24111308Santhony.gutierrez@amd.com
24211308Santhony.gutierrez@amd.comroot = Root(full_system = False, system = system)
24311308Santhony.gutierrez@amd.com
24411308Santhony.gutierrez@amd.com# --------------------
24511308Santhony.gutierrez@amd.com# Pick the correct Splash2 Benchmarks
24611308Santhony.gutierrez@amd.com# ====================
24711308Santhony.gutierrez@amd.comif options.benchmark == 'Cholesky':
24811308Santhony.gutierrez@amd.com    root.workload = Cholesky()
24911308Santhony.gutierrez@amd.comelif options.benchmark == 'FFT':
25011308Santhony.gutierrez@amd.com    root.workload = FFT()
25111308Santhony.gutierrez@amd.comelif options.benchmark == 'LUContig':
25211308Santhony.gutierrez@amd.com    root.workload = LU_contig()
25311308Santhony.gutierrez@amd.comelif options.benchmark == 'LUNoncontig':
25411308Santhony.gutierrez@amd.com    root.workload = LU_noncontig()
25511308Santhony.gutierrez@amd.comelif options.benchmark == 'Radix':
25611308Santhony.gutierrez@amd.com    root.workload = Radix()
25711308Santhony.gutierrez@amd.comelif options.benchmark == 'Barnes':
25811308Santhony.gutierrez@amd.com    root.workload = Barnes()
25911308Santhony.gutierrez@amd.comelif options.benchmark == 'FMM':
26011308Santhony.gutierrez@amd.com    root.workload = FMM()
26111308Santhony.gutierrez@amd.comelif options.benchmark == 'OceanContig':
26211308Santhony.gutierrez@amd.com    root.workload = Ocean_contig()
26311308Santhony.gutierrez@amd.comelif options.benchmark == 'OceanNoncontig':
26411308Santhony.gutierrez@amd.com    root.workload = Ocean_noncontig()
26511308Santhony.gutierrez@amd.comelif options.benchmark == 'Raytrace':
26611308Santhony.gutierrez@amd.com    root.workload = Raytrace()
26711308Santhony.gutierrez@amd.comelif options.benchmark == 'WaterNSquared':
26811308Santhony.gutierrez@amd.com    root.workload = Water_nsquared()
26911308Santhony.gutierrez@amd.comelif options.benchmark == 'WaterSpatial':
27011308Santhony.gutierrez@amd.com    root.workload = Water_spatial()
27111308Santhony.gutierrez@amd.comelse:
27211308Santhony.gutierrez@amd.com    m5.util.panic("""
27311308Santhony.gutierrez@amd.comThe --benchmark environment variable was set to something improper.
27411308Santhony.gutierrez@amd.comUse Cholesky, FFT, LUContig, LUNoncontig, Radix, Barnes, FMM, OceanContig,
27511308Santhony.gutierrez@amd.comOceanNoncontig, Raytrace, WaterNSquared, or WaterSpatial
27611308Santhony.gutierrez@amd.com""")
27711308Santhony.gutierrez@amd.com
27811308Santhony.gutierrez@amd.com# --------------------
27911435Smitch.hayenga@arm.com# Assign the workload to the cpus
28011308Santhony.gutierrez@amd.com# ====================
28111308Santhony.gutierrez@amd.com
28211308Santhony.gutierrez@amd.comfor cluster in clusters:
28311308Santhony.gutierrez@amd.com    for cpu in cluster.cpus:
28411308Santhony.gutierrez@amd.com        cpu.workload = root.workload
28511308Santhony.gutierrez@amd.com
28611308Santhony.gutierrez@amd.com# ----------------------
28711308Santhony.gutierrez@amd.com# Run the simulation
28811308Santhony.gutierrez@amd.com# ----------------------
28911308Santhony.gutierrez@amd.com
29011308Santhony.gutierrez@amd.comif options.timing or options.detailed:
29111308Santhony.gutierrez@amd.com    root.system.mem_mode = 'timing'
29211308Santhony.gutierrez@amd.com
29311308Santhony.gutierrez@amd.com# instantiate configuration
29411308Santhony.gutierrez@amd.comm5.instantiate()
29511308Santhony.gutierrez@amd.com
29611308Santhony.gutierrez@amd.com# simulate until program terminates
29711308Santhony.gutierrez@amd.comif options.maxtick:
29811308Santhony.gutierrez@amd.com    exit_event = m5.simulate(options.maxtick)
29911308Santhony.gutierrez@amd.comelse:
30011308Santhony.gutierrez@amd.com    exit_event = m5.simulate(m5.MaxTick)
30111308Santhony.gutierrez@amd.com
30211308Santhony.gutierrez@amd.comprint 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
30311308Santhony.gutierrez@amd.com
30411308Santhony.gutierrez@amd.com