cluster.py revision 3646
13646Srdreslin@umich.edu# Copyright (c) 2006 The Regents of The University of Michigan
23646Srdreslin@umich.edu# All rights reserved.
33646Srdreslin@umich.edu#
43646Srdreslin@umich.edu# Redistribution and use in source and binary forms, with or without
53646Srdreslin@umich.edu# modification, are permitted provided that the following conditions are
63646Srdreslin@umich.edu# met: redistributions of source code must retain the above copyright
73646Srdreslin@umich.edu# notice, this list of conditions and the following disclaimer;
83646Srdreslin@umich.edu# redistributions in binary form must reproduce the above copyright
93646Srdreslin@umich.edu# notice, this list of conditions and the following disclaimer in the
103646Srdreslin@umich.edu# documentation and/or other materials provided with the distribution;
113646Srdreslin@umich.edu# neither the name of the copyright holders nor the names of its
123646Srdreslin@umich.edu# contributors may be used to endorse or promote products derived from
133646Srdreslin@umich.edu# this software without specific prior written permission.
143646Srdreslin@umich.edu#
153646Srdreslin@umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
163646Srdreslin@umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
173646Srdreslin@umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
183646Srdreslin@umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
193646Srdreslin@umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
203646Srdreslin@umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
213646Srdreslin@umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
223646Srdreslin@umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
233646Srdreslin@umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
243646Srdreslin@umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
253646Srdreslin@umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
263646Srdreslin@umich.edu#
273646Srdreslin@umich.edu# Authors: Ron Dreslinski
283646Srdreslin@umich.edu
293646Srdreslin@umich.edu# Simple test script
303646Srdreslin@umich.edu#
313646Srdreslin@umich.edu# "m5 test.py"
323646Srdreslin@umich.edu
333646Srdreslin@umich.eduimport m5
343646Srdreslin@umich.edufrom m5.objects import *
353646Srdreslin@umich.eduimport os, optparse, sys
363646Srdreslin@umich.edum5.AddToPath('../common')
373646Srdreslin@umich.edu
383646Srdreslin@umich.edu# --------------------
393646Srdreslin@umich.edu# Define Command Line Options
403646Srdreslin@umich.edu# ====================
413646Srdreslin@umich.edu
423646Srdreslin@umich.eduparser = optparse.OptionParser()
433646Srdreslin@umich.edu
443646Srdreslin@umich.eduparser.add_option("-d", "--detailed", action="store_true")
453646Srdreslin@umich.eduparser.add_option("-t", "--timing", action="store_true")
463646Srdreslin@umich.eduparser.add_option("-m", "--maxtick", type="int")
473646Srdreslin@umich.eduparser.add_option("-c", "--numclusters",
483646Srdreslin@umich.edu                  help="Number of clusters", type="int")
493646Srdreslin@umich.eduparser.add_option("-n", "--numcpus",
503646Srdreslin@umich.edu                  help="Number of cpus in total", type="int")
513646Srdreslin@umich.eduparser.add_option("-f", "--frequency",
523646Srdreslin@umich.edu                  default = "1GHz",
533646Srdreslin@umich.edu                  help="Frequency of each CPU")
543646Srdreslin@umich.eduparser.add_option("-p", "--protocol",
553646Srdreslin@umich.edu                  default="moesi",
563646Srdreslin@umich.edu                  help="The coherence protocol to use for the L1'a (i.e. MOESI, MOSI)")
573646Srdreslin@umich.eduparser.add_option("--l1size",
583646Srdreslin@umich.edu                  default = "32kB")
593646Srdreslin@umich.eduparser.add_option("--l1latency",
603646Srdreslin@umich.edu                  default = 1)
613646Srdreslin@umich.eduparser.add_option("--l2size",
623646Srdreslin@umich.edu                  default = "256kB")
633646Srdreslin@umich.eduparser.add_option("--l2latency",
643646Srdreslin@umich.edu                  default = 10)
653646Srdreslin@umich.eduparser.add_option("--rootdir",
663646Srdreslin@umich.edu                  help="ROot directory of Splash2",
673646Srdreslin@umich.edu                  default="/dist/splash2/codes/")
683646Srdreslin@umich.eduparser.add_option("-b", "--benchmark",
693646Srdreslin@umich.edu                  help="Splash 2 benchmark to run")
703646Srdreslin@umich.edu
713646Srdreslin@umich.edu(options, args) = parser.parse_args()
723646Srdreslin@umich.edu
733646Srdreslin@umich.eduif args:
743646Srdreslin@umich.edu    print "Error: script doesn't take any positional arguments"
753646Srdreslin@umich.edu    sys.exit(1)
763646Srdreslin@umich.edu
773646Srdreslin@umich.edu# --------------------
783646Srdreslin@umich.edu# Define Splash2 Benchmarks
793646Srdreslin@umich.edu# ====================
803646Srdreslin@umich.educlass Cholesky(LiveProcess):
813646Srdreslin@umich.edu        executable = options.rootdir + '/kernels/cholesky/CHOLESKY'
823646Srdreslin@umich.edu        cmd = 'CHOLESKY -p' + str(options.numcpus) + ' '\
833646Srdreslin@umich.edu             + options.rootdir + '/kernels/cholesky/inputs/tk23.O'
843646Srdreslin@umich.edu
853646Srdreslin@umich.educlass FFT(LiveProcess):
863646Srdreslin@umich.edu        executable = options.rootdir + 'kernels/fft/FFT'
873646Srdreslin@umich.edu        cmd = 'FFT -p' + str(options.numcpus) + ' -m18'
883646Srdreslin@umich.edu
893646Srdreslin@umich.educlass LU_contig(LiveProcess):
903646Srdreslin@umich.edu        executable = options.rootdir + 'kernels/lu/contiguous_blocks/LU'
913646Srdreslin@umich.edu        cmd = 'LU -p' + str(options.numcpus)
923646Srdreslin@umich.edu
933646Srdreslin@umich.educlass LU_noncontig(LiveProcess):
943646Srdreslin@umich.edu        executable = options.rootdir + 'kernels/lu/non_contiguous_blocks/LU'
953646Srdreslin@umich.edu        cmd = 'LU -p' + str(options.numcpus)
963646Srdreslin@umich.edu
973646Srdreslin@umich.educlass Radix(LiveProcess):
983646Srdreslin@umich.edu        executable = options.rootdir + 'kernels/radix/RADIX'
993646Srdreslin@umich.edu        cmd = 'RADIX -n524288 -p' + str(options.numcpus)
1003646Srdreslin@umich.edu
1013646Srdreslin@umich.educlass Barnes(LiveProcess):
1023646Srdreslin@umich.edu        executable = options.rootdir + 'apps/barnes/BARNES'
1033646Srdreslin@umich.edu        cmd = 'BARNES'
1043646Srdreslin@umich.edu        input = options.rootdir + 'apps/barnes/input.p' + str(options.numcpus)
1053646Srdreslin@umich.edu
1063646Srdreslin@umich.educlass FMM(LiveProcess):
1073646Srdreslin@umich.edu        executable = options.rootdir + 'apps/fmm/FMM'
1083646Srdreslin@umich.edu        cmd = 'FMM'
1093646Srdreslin@umich.edu        input = options.rootdir + 'apps/fmm/inputs/input.2048.p' + str(options.numcpus)
1103646Srdreslin@umich.edu
1113646Srdreslin@umich.educlass Ocean_contig(LiveProcess):
1123646Srdreslin@umich.edu        executable = options.rootdir + 'apps/ocean/contiguous_partitions/OCEAN'
1133646Srdreslin@umich.edu        cmd = 'OCEAN -p' + str(options.numcpus)
1143646Srdreslin@umich.edu
1153646Srdreslin@umich.educlass Ocean_noncontig(LiveProcess):
1163646Srdreslin@umich.edu        executable = options.rootdir + 'apps/ocean/non_contiguous_partitions/OCEAN'
1173646Srdreslin@umich.edu        cmd = 'OCEAN -p' + str(options.numcpus)
1183646Srdreslin@umich.edu
1193646Srdreslin@umich.educlass Raytrace(LiveProcess):
1203646Srdreslin@umich.edu        executable = options.rootdir + 'apps/raytrace/RAYTRACE'
1213646Srdreslin@umich.edu        cmd = 'RAYTRACE -p' + str(options.numcpus) + ' ' \
1223646Srdreslin@umich.edu             + options.rootdir + 'apps/raytrace/inputs/teapot.env'
1233646Srdreslin@umich.edu
1243646Srdreslin@umich.educlass Water_nsquared(LiveProcess):
1253646Srdreslin@umich.edu        executable = options.rootdir + 'apps/water-nsquared/WATER-NSQUARED'
1263646Srdreslin@umich.edu        cmd = 'WATER-NSQUARED'
1273646Srdreslin@umich.edu        input = options.rootdir + 'apps/water-nsquared/input.p' + str(options.numcpus)
1283646Srdreslin@umich.edu
1293646Srdreslin@umich.educlass Water_spatial(LiveProcess):
1303646Srdreslin@umich.edu        executable = options.rootdir + 'apps/water-spatial/WATER-SPATIAL'
1313646Srdreslin@umich.edu        cmd = 'WATER-SPATIAL'
1323646Srdreslin@umich.edu        input = options.rootdir + 'apps/water-spatial/input.p' + str(options.numcpus)
1333646Srdreslin@umich.edu
1343646Srdreslin@umich.edu
1353646Srdreslin@umich.edu# --------------------
1363646Srdreslin@umich.edu# Base L1 Cache Definition
1373646Srdreslin@umich.edu# ====================
1383646Srdreslin@umich.edu
1393646Srdreslin@umich.educlass L1(BaseCache):
1403646Srdreslin@umich.edu    latency = options.l1latency
1413646Srdreslin@umich.edu    block_size = 64
1423646Srdreslin@umich.edu    mshrs = 12
1433646Srdreslin@umich.edu    tgts_per_mshr = 8
1443646Srdreslin@umich.edu    protocol = CoherenceProtocol(protocol=options.protocol)
1453646Srdreslin@umich.edu
1463646Srdreslin@umich.edu# ----------------------
1473646Srdreslin@umich.edu# Base L2 Cache Definition
1483646Srdreslin@umich.edu# ----------------------
1493646Srdreslin@umich.edu
1503646Srdreslin@umich.educlass L2(BaseCache):
1513646Srdreslin@umich.edu    block_size = 64
1523646Srdreslin@umich.edu    latency = options.l2latency
1533646Srdreslin@umich.edu    mshrs = 92
1543646Srdreslin@umich.edu    tgts_per_mshr = 16
1553646Srdreslin@umich.edu    write_buffers = 8
1563646Srdreslin@umich.edu
1573646Srdreslin@umich.edu# ----------------------
1583646Srdreslin@umich.edu# Define the clusters with their cpus
1593646Srdreslin@umich.edu# ----------------------
1603646Srdreslin@umich.educlass Cluster:
1613646Srdreslin@umich.edu    pass
1623646Srdreslin@umich.edu
1633646Srdreslin@umich.educpusPerCluster = options.numcpus/options.numclusters
1643646Srdreslin@umich.edu
1653646Srdreslin@umich.edubusFrequency = Frequency(options.frequency)
1663646Srdreslin@umich.edubusFrequency *= cpusPerCluster
1673646Srdreslin@umich.edu
1683646Srdreslin@umich.eduall_cpus = []
1693646Srdreslin@umich.eduall_l1s = []
1703646Srdreslin@umich.eduall_l1buses = []
1713646Srdreslin@umich.eduif options.timing:
1723646Srdreslin@umich.edu    clusters = [ Cluster() for i in xrange(options.numclusters)]
1733646Srdreslin@umich.edu    for j in xrange(options.numclusters):
1743646Srdreslin@umich.edu        clusters[j].id = j
1753646Srdreslin@umich.edu    for cluster in clusters:
1763646Srdreslin@umich.edu        cluster.clusterbus = Bus(clock=busFrequency)
1773646Srdreslin@umich.edu        all_l1buses += [cluster.clusterbus]
1783646Srdreslin@umich.edu        cluster.cpus = [TimingSimpleCPU(cpu_id = i + cluster.id,
1793646Srdreslin@umich.edu                                        clock=options.frequency)
1803646Srdreslin@umich.edu                        for i in xrange(cpusPerCluster)]
1813646Srdreslin@umich.edu        all_cpus += cluster.cpus
1823646Srdreslin@umich.edu        cluster.l1 = L1(size=options.l1size, assoc = 4)
1833646Srdreslin@umich.edu        all_l1s += [cluster.l1]
1843646Srdreslin@umich.eduelif options.detailed:
1853646Srdreslin@umich.edu    clusters = [ Cluster() for i in xrange(options.numclusters)]
1863646Srdreslin@umich.edu    for j in xrange(options.numclusters):
1873646Srdreslin@umich.edu        clusters[j].id = j
1883646Srdreslin@umich.edu    for cluster in clusters:
1893646Srdreslin@umich.edu        cluster.clusterbus = Bus(clock=busFrequency)
1903646Srdreslin@umich.edu        all_l1buses += [cluster.clusterbus]
1913646Srdreslin@umich.edu        cluster.cpus = [DerivO3CPU(cpu_id = i + cluster.id,
1923646Srdreslin@umich.edu                                   clock=options.frequency)
1933646Srdreslin@umich.edu                        for i in xrange(cpusPerCluster)]
1943646Srdreslin@umich.edu        all_cpus += cluster.cpus
1953646Srdreslin@umich.edu        cluster.l1 = L1(size=options.l1size, assoc = 4)
1963646Srdreslin@umich.edu        all_l1s += [cluster.l1]
1973646Srdreslin@umich.eduelse:
1983646Srdreslin@umich.edu    clusters = [ Cluster() for i in xrange(options.numclusters)]
1993646Srdreslin@umich.edu    for j in xrange(options.numclusters):
2003646Srdreslin@umich.edu        clusters[j].id = j
2013646Srdreslin@umich.edu    for cluster in clusters:
2023646Srdreslin@umich.edu        cluster.clusterbus = Bus(clock=busFrequency)
2033646Srdreslin@umich.edu        all_l1buses += [cluster.clusterbus]
2043646Srdreslin@umich.edu        cluster.cpus = [AtomicSimpleCPU(cpu_id = i + cluster.id,
2053646Srdreslin@umich.edu                                        clock=options.frequency)
2063646Srdreslin@umich.edu                        for i in xrange(cpusPerCluster)]
2073646Srdreslin@umich.edu        all_cpus += cluster.cpus
2083646Srdreslin@umich.edu        cluster.l1 = L1(size=options.l1size, assoc = 4)
2093646Srdreslin@umich.edu        all_l1s += [cluster.l1]
2103646Srdreslin@umich.edu
2113646Srdreslin@umich.edu# ----------------------
2123646Srdreslin@umich.edu# Create a system, and add system wide objects
2133646Srdreslin@umich.edu# ----------------------
2143646Srdreslin@umich.edusystem = System(cpu = all_cpus, l1_ = all_l1s, l1bus_ = all_l1buses, physmem = PhysicalMemory(),
2153646Srdreslin@umich.edu                membus = Bus(clock = busFrequency))
2163646Srdreslin@umich.edu
2173646Srdreslin@umich.edusystem.toL2bus = Bus(clock = busFrequency)
2183646Srdreslin@umich.edusystem.l2 = L2(size = options.l2size, assoc = 8)
2193646Srdreslin@umich.edu
2203646Srdreslin@umich.edu# ----------------------
2213646Srdreslin@umich.edu# Connect the L2 cache and memory together
2223646Srdreslin@umich.edu# ----------------------
2233646Srdreslin@umich.edu
2243646Srdreslin@umich.edusystem.physmem.port = system.membus.port
2253646Srdreslin@umich.edusystem.l2.cpu_side = system.toL2bus.port
2263646Srdreslin@umich.edusystem.l2.mem_side = system.membus.port
2273646Srdreslin@umich.edu
2283646Srdreslin@umich.edu# ----------------------
2293646Srdreslin@umich.edu# Connect the L2 cache and clusters together
2303646Srdreslin@umich.edu# ----------------------
2313646Srdreslin@umich.edufor cluster in clusters:
2323646Srdreslin@umich.edu    cluster.l1.cpu_side = cluster.clusterbus.port
2333646Srdreslin@umich.edu    cluster.l1.mem_side = system.toL2bus.port
2343646Srdreslin@umich.edu    for cpu in cluster.cpus:
2353646Srdreslin@umich.edu        cpu.icache_port = cluster.clusterbus.port
2363646Srdreslin@umich.edu        cpu.dcache_port = cluster.clusterbus.port
2373646Srdreslin@umich.edu        cpu.mem = cluster.l1
2383646Srdreslin@umich.edu
2393646Srdreslin@umich.edu# ----------------------
2403646Srdreslin@umich.edu# Define the root
2413646Srdreslin@umich.edu# ----------------------
2423646Srdreslin@umich.edu
2433646Srdreslin@umich.eduroot = Root(system = system)
2443646Srdreslin@umich.edu
2453646Srdreslin@umich.edu# --------------------
2463646Srdreslin@umich.edu# Pick the correct Splash2 Benchmarks
2473646Srdreslin@umich.edu# ====================
2483646Srdreslin@umich.eduif options.benchmark == 'Cholesky':
2493646Srdreslin@umich.edu    root.workload = Cholesky()
2503646Srdreslin@umich.eduelif options.benchmark == 'FFT':
2513646Srdreslin@umich.edu    root.workload = FFT()
2523646Srdreslin@umich.eduelif options.benchmark == 'LUContig':
2533646Srdreslin@umich.edu    root.workload = LU_contig()
2543646Srdreslin@umich.eduelif options.benchmark == 'LUNoncontig':
2553646Srdreslin@umich.edu    root.workload = LU_noncontig()
2563646Srdreslin@umich.eduelif options.benchmark == 'Radix':
2573646Srdreslin@umich.edu    root.workload = Radix()
2583646Srdreslin@umich.eduelif options.benchmark == 'Barnes':
2593646Srdreslin@umich.edu    root.workload = Barnes()
2603646Srdreslin@umich.eduelif options.benchmark == 'FMM':
2613646Srdreslin@umich.edu    root.workload = FMM()
2623646Srdreslin@umich.eduelif options.benchmark == 'OceanContig':
2633646Srdreslin@umich.edu    root.workload = Ocean_contig()
2643646Srdreslin@umich.eduelif options.benchmark == 'OceanNoncontig':
2653646Srdreslin@umich.edu    root.workload = Ocean_noncontig()
2663646Srdreslin@umich.eduelif options.benchmark == 'Raytrace':
2673646Srdreslin@umich.edu    root.workload = Raytrace()
2683646Srdreslin@umich.eduelif options.benchmark == 'WaterNSquared':
2693646Srdreslin@umich.edu    root.workload = Water_nsquared()
2703646Srdreslin@umich.eduelif options.benchmark == 'WaterSpatial':
2713646Srdreslin@umich.edu    root.workload = Water_spatial()
2723646Srdreslin@umich.eduelse:
2733646Srdreslin@umich.edu    panic("The --benchmark environment variable was set to something" \
2743646Srdreslin@umich.edu          +" improper.\nUse Cholesky, FFT, LUContig, LUNoncontig, Radix" \
2753646Srdreslin@umich.edu          +", Barnes, FMM, OceanContig,\nOceanNoncontig, Raytrace," \
2763646Srdreslin@umich.edu          +" WaterNSquared, or WaterSpatial\n")
2773646Srdreslin@umich.edu
2783646Srdreslin@umich.edu# --------------------
2793646Srdreslin@umich.edu# Assign the workload to the cpus
2803646Srdreslin@umich.edu# ====================
2813646Srdreslin@umich.edu
2823646Srdreslin@umich.edufor cluster in clusters:
2833646Srdreslin@umich.edu    for cpu in cluster.cpus:
2843646Srdreslin@umich.edu        cpu.workload = root.workload
2853646Srdreslin@umich.edu
2863646Srdreslin@umich.edu# ----------------------
2873646Srdreslin@umich.edu# Run the simulation
2883646Srdreslin@umich.edu# ----------------------
2893646Srdreslin@umich.edu
2903646Srdreslin@umich.eduif options.timing or options.detailed:
2913646Srdreslin@umich.edu    root.system.mem_mode = 'timing'
2923646Srdreslin@umich.edu
2933646Srdreslin@umich.edu# instantiate configuration
2943646Srdreslin@umich.edum5.instantiate(root)
2953646Srdreslin@umich.edu
2963646Srdreslin@umich.edu# simulate until program terminates
2973646Srdreslin@umich.eduif options.maxtick:
2983646Srdreslin@umich.edu    exit_event = m5.simulate(options.maxtick)
2993646Srdreslin@umich.eduelse:
3003646Srdreslin@umich.edu    exit_event = m5.simulate(m5.MaxTick)
3013646Srdreslin@umich.edu
3023646Srdreslin@umich.eduprint 'Exiting @ tick', m5.curTick(), 'because', exit_event.getCause()
3033646Srdreslin@umich.edu
304