sim: Create a Workload object for SE mode.
authorGabe Black <gabeblack@google.com>
Sun, 23 Aug 2020 06:33:10 +0000 (23:33 -0700)
committerGabe Black <gabeblack@google.com>
Sun, 20 Sep 2020 07:26:22 +0000 (07:26 +0000)
The workload object is still optional for the sake of compatibility,
even though it probably shouldn't be in the long term. If a simulation
is just a collection of components with nothing in particular running on
it, for instance driven by a traffic generator, should it even have a
System object in the first place?

Change-Id: I8bcda72bdfa3730248226fb62f0bba9a83243d95
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/33278
Reviewed-by: Matthew Poremba <matthew.poremba@amd.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
20 files changed:
configs/dram/low_power_sweep.py
configs/example/apu_se.py
configs/example/arm/starter_se.py
configs/example/hmc_hello.py
configs/example/se.py
configs/learning_gem5/part1/simple.py
configs/learning_gem5/part1/two_level.py
configs/learning_gem5/part2/simple_cache.py
configs/learning_gem5/part2/simple_memobj.py
configs/learning_gem5/part3/simple_ruby.py
configs/splash2/cluster.py
configs/splash2/run.py
src/sim/SConscript
src/sim/System.py
src/sim/Workload.py
src/sim/se_workload.cc [new file with mode: 0644]
src/sim/se_workload.hh [new file with mode: 0644]
tests/configs/gpu-ruby.py
tests/gem5/cpu_tests/run.py
tests/gem5/m5threads_test_atomic/atomic_system.py

index 292b0fa7342f3964c0741899a75aa700f139cd2a..a9f7057b027e1ea44bacd6b72a06a4ef06d5d255 100644 (file)
@@ -93,6 +93,8 @@ system.clk_domain = SrcClockDomain(clock = '2.0GHz',
                                    voltage_domain =
                                    VoltageDomain(voltage = '1V'))
 
+system.workload = SEWorkload()
+
 # We are fine with 256 MB memory for now.
 mem_range = AddrRange('256MB')
 # Start address is 0
index 03418c32833bcce253cda06194879e6b206ae0e4..077ce4c77c35d885a730e8a8fb5d5bbd11f2221b 100644 (file)
@@ -500,7 +500,8 @@ cpu_list = cpu_list + [shader] + cp_list
 system = System(cpu = cpu_list,
                 mem_ranges = [AddrRange(options.mem_size)],
                 cache_line_size = options.cacheline_size,
-                mem_mode = mem_mode)
+                mem_mode = mem_mode,
+                workload = SEWorkload())
 if fast_forward:
     system.future_cpu = future_cpu_list
 system.voltage_domain = VoltageDomain(voltage = options.sys_voltage)
index 0003ce994d24d8beb8d27ca9644e7eaf87f60cae..d342420b57886b22df1c2f10c9693c54aac97d54 100644 (file)
@@ -171,6 +171,8 @@ def create(args):
               (len(processes), args.num_cores))
         sys.exit(1)
 
+    system.workload = SEWorkload()
+
     # Assign one workload to each CPU
     for cpu, workload in zip(system.cpu_cluster.cpus, processes):
         cpu.workload = workload
index a68251981cdeb9da7a422b21de5818f5ec6c9e2f..706fc2b681fd43d021217f44a3e9370b636d69a9 100644 (file)
@@ -50,6 +50,7 @@ HMC.add_options(parser)
 options = parser.parse_args()
 # create the system we are going to simulate
 system = System()
+system.workload = SEWorkload()
 # use timing mode for the interaction between master-slave ports
 system.mem_mode = 'timing'
 # set the clock fequency of the system
index 200a0dee50bff47a4680eafcfdd340314967ca1f..f3fea61bd58a43a87aa2f33559c058bba00bd700 100644 (file)
@@ -173,7 +173,7 @@ system = System(cpu = [CPUClass(cpu_id=i) for i in range(np)],
                 mem_mode = test_mem_mode,
                 mem_ranges = [AddrRange(options.mem_size)],
                 cache_line_size = options.cacheline_size,
-                workload = NULL)
+                workload = SEWorkload())
 
 if numThreads > 1:
     system.multi_thread = True
index 22b2cf7b4668e05bbc9dbaf5824c710ae5d88805..cb785b6e76d16e63695ea44ff063de72bec54dfa 100644 (file)
@@ -94,6 +94,8 @@ thispath = os.path.dirname(os.path.realpath(__file__))
 binary = os.path.join(thispath, '../../../',
                       'tests/test-progs/hello/bin/', isa, 'linux/hello')
 
+system.workload = SEWorkload()
+
 # Create a process for a simple "Hello World" application
 process = Process()
 # Set the command
index 53e11378b98814b7a7b470ae74c51c42156b971a..50d1d5f9ed5157b7b15360607b3c4aeeb5c931dc 100644 (file)
@@ -137,6 +137,8 @@ system.mem_ctrl.dram = DDR3_1600_8x8()
 system.mem_ctrl.dram.range = system.mem_ranges[0]
 system.mem_ctrl.port = system.membus.master
 
+system.workload = SEWorkload()
+
 # Create a process for a simple "Hello World" application
 process = Process()
 # Set the command
index 533aa23ad9a0e06fc7154951f83c79b510dbd5df..391de8ba709c3ee725facd949852dc8221bfe2a4 100644 (file)
@@ -84,6 +84,8 @@ system.mem_ctrl.port = system.membus.master
 # Connect the system up to the membus
 system.system_port = system.membus.slave
 
+system.workload = SEWorkload()
+
 # Create a process for a simple "Hello World" application
 process = Process()
 # Set the command
index b7d256189689242116c99a9513d73105853fd46e..80f6602213b1556c291e7bf69c1b5a4c895ddd05 100644 (file)
@@ -82,6 +82,8 @@ system.mem_ctrl.port = system.membus.master
 # Connect the system up to the membus
 system.system_port = system.membus.slave
 
+system.workload = SEWorkload()
+
 # Create a process for a simple "Hello World" application
 process = Process()
 # Set the command
index 760a1689251b79488f74958523c881c326e41ad8..f0a9e08c260a2204d328ec2c01dcee059499c0f4 100644 (file)
@@ -89,6 +89,8 @@ thispath = os.path.dirname(os.path.realpath(__file__))
 binary = os.path.join(thispath, '../../../', 'tests/test-progs/threads/bin/',
                       isa, 'linux/threads')
 
+system.workload = SEWorkload()
+
 # Create a process for a simple "multi-threaded" application
 process = Process()
 # Set the command
index 0e92625ceef6ff56fd899986e9f451eba03a839c..2b36c825d835842993447077d45a1599f5ce3174 100644 (file)
@@ -216,6 +216,8 @@ system.clock = '1GHz'
 system.toL2bus = L2XBar(clock = busFrequency)
 system.l2 = L2(size = options.l2size, assoc = 8)
 
+system.workload = SEWorkload()
+
 # ----------------------
 # Connect the L2 cache and memory together
 # ----------------------
index 7ad2dac2ad61521006bdd4076c2b07936df2a6aa..b3b878703d5242f2ddb3d50ed95057a6d58010e9 100644 (file)
@@ -195,7 +195,8 @@ else:
 # Create a system, and add system wide objects
 # ----------------------
 system = System(cpu = cpus, physmem = SimpleMemory(),
-                membus = SystemXBar(clock = busFrequency))
+                membus = SystemXBar(clock = busFrequency),
+                workload = SEWorkload())
 system.clock = '1GHz'
 
 system.toL2bus = L2XBar(clock = busFrequency)
index 0bdf921f419cafb89cee59dbf0b9bd5b4dfd9bb5..6bda82859b026018537c8840445f424d08a1c2f3 100644 (file)
@@ -63,6 +63,7 @@ Source('redirect_path.cc')
 Source('root.cc')
 Source('serialize.cc')
 Source('drain.cc')
+Source('se_workload.cc')
 Source('sim_events.cc')
 Source('sim_object.cc')
 Source('sub_system.cc')
index caf32fb56c11136218436bac2a9c74b3bf2573e4..a2f60560493961444a72cbe7408b271159ee31b0 100644 (file)
@@ -111,7 +111,7 @@ class System(SimObject):
     work_cpus_ckpt_count = Param.Counter(0,
         "create checkpoint when active cpu count value is reached")
 
-    workload = Param.Workload(NULL, "Operating system kernel")
+    workload = Param.Workload(NULL, "Workload to run on this system")
     init_param = Param.UInt64(0, "numerical value to pass into simulator")
     readfile = Param.String("", "file to read startup script from")
     symbolfile = Param.String("", "file to get the symbols from")
index 1e35abec10430f1c76eecb01f2a545df3f8604df..f1974bbe90dca60fae24a8cb1d6d2c702dab2a15 100644 (file)
@@ -50,3 +50,7 @@ class KernelWorkload(Workload):
     load_addr_offset = Param.UInt64(0, "Address to offset the kernel with")
 
     command_line = Param.String("a", "boot flags to pass to the kernel")
+
+class SEWorkload(Workload):
+    type = 'SEWorkload'
+    cxx_header = "sim/se_workload.hh"
diff --git a/src/sim/se_workload.cc b/src/sim/se_workload.cc
new file mode 100644 (file)
index 0000000..f2a01d5
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "sim/se_workload.hh"
+
+#include "params/SEWorkload.hh"
+
+SEWorkload::SEWorkload(const Params &p) : Workload(&p), _params(p)
+{
+}
+
+SEWorkload *
+SEWorkloadParams::create()
+{
+    return new SEWorkload(*this);
+}
diff --git a/src/sim/se_workload.hh b/src/sim/se_workload.hh
new file mode 100644 (file)
index 0000000..b72e824
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __SIM_SE_WORKLOAD_HH__
+#define __SIM_SE_WORKLOAD_HH__
+
+#include "params/SEWorkload.hh"
+#include "sim/workload.hh"
+
+class SEWorkload : public Workload
+{
+  public:
+    using Params = SEWorkloadParams;
+
+  protected:
+    const Params &_params;
+
+  public:
+    const Params &params() const { return _params; }
+
+    SEWorkload(const Params &p);
+
+    Addr
+    getEntry() const override
+    {
+        // This object represents the OS, not the individual processes running
+        // within it.
+        panic("No workload entry point for syscall emulation mode.");
+    }
+
+    Loader::Arch
+    getArch() const override
+    {
+        // ISA specific subclasses should implement this method.
+        // This implemenetation is just to avoid having to implement those for
+        // now, and will be removed in the future.
+        panic("SEWorkload::getArch() not implemented.");
+    }
+
+    const Loader::SymbolTable &
+    symtab(ThreadContext *) override
+    {
+        // This object represents the OS, not the individual processes running
+        // within it.
+        panic("No workload symbol table for syscall emulation mode.");
+    }
+
+    bool
+    insertSymbol(const Loader::Symbol &symbol) override
+    {
+        // This object represents the OS, not the individual processes running
+        // within it.
+        panic("No workload symbol table for syscall emulation mode.");
+    }
+};
+
+#endif // __SIM_SE_WORKLOAD_HH__
index 155775a0bbf2627e45997e28329421522e845a7d..a463fe3b45cd1807244c02092c965b72f56e231a 100644 (file)
@@ -261,7 +261,8 @@ cpu_list = [cpu] + [shader] + [dispatcher]
 
 system = System(cpu = cpu_list,
                 mem_ranges = [AddrRange(options.mem_size)],
-                mem_mode = 'timing')
+                mem_mode = 'timing',
+                workload = SEWorkload())
 
 # Dummy voltage domain for all our clock domains
 system.voltage_domain = VoltageDomain(voltage = options.sys_voltage)
index 4d2daf1362d0c8dc3c0040e347b30fd19b9d3ffa..b893b80ad8f2af87598997e61b85080d622c6d78 100644 (file)
@@ -119,6 +119,8 @@ args = parser.parse_args()
 
 system = System()
 
+system.workload = SEWorkload()
+
 system.clk_domain = SrcClockDomain()
 system.clk_domain.clock = '1GHz'
 system.clk_domain.voltage_domain = VoltageDomain()
index 2d9b129373cc9a1967a98745570369ce23366a0c..a08be5c5fed2cf6427fb846f59b73e18f9fac00f 100644 (file)
@@ -40,6 +40,8 @@ args = parser.parse_args()
 root = Root(full_system = False)
 root.system = System()
 
+root.system.workload = SEWorkload()
+
 root.system.clk_domain = SrcClockDomain()
 root.system.clk_domain.clock = '3GHz'
 root.system.clk_domain.voltage_domain = VoltageDomain()