Mahyar Samani has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/52905 )

 (

13 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted one.
 )Change subject: tests: Adding new test for traffic_gen
......................................................................

tests: Adding new test for traffic_gen

This change adds new tests for MultiChannelMemory,
PrivateL1CacheHierarchy, PrivateL1PrivateL2CacheHierachy,
GUPSGenerator, GUPSGeneratorEP, GUPSGeneratorPAR.

Change-Id: I1db1281cdd4ade65d9abf2d979ef45342b63496a
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/52905
Maintainer: Bobby Bruce <bbr...@ucdavis.edu>
Tested-by: kokoro <noreply+kok...@google.com>
Reviewed-by: Bobby Bruce <bbr...@ucdavis.edu>
---
A tests/gem5/traffic_gen/simple_traffic_run.py
M tests/gem5/traffic_gen/test_memory_traffic_gen.py
D tests/gem5/configs/simple_traffic_run.py
3 files changed, 309 insertions(+), 288 deletions(-)

Approvals:
  Bobby Bruce: Looks good to me, approved; Looks good to me, approved
  kokoro: Regressions pass




diff --git a/tests/gem5/configs/simple_traffic_run.py b/tests/gem5/configs/simple_traffic_run.py
deleted file mode 100644
index 33e4419..0000000
--- a/tests/gem5/configs/simple_traffic_run.py
+++ /dev/null
@@ -1,148 +0,0 @@
-# Copyright (c) 2021 The Regents of the University of California
-# All rights reserved.
-#
-# 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.
-
-"""
-This scripts is used for checking the correctness of statistics reported
-by the gem5 simulator. It can excercise certain components in the memory
-subsystem. The reported values could be used to compare against a validated
-set of statistics.
-"""
-
-import m5
-import argparse
-import importlib
-
-from os.path import join
-from m5.objects import Root
-from m5.stats import gem5stats
-from gem5.components.boards.test_board import TestBoard
-from gem5.components.processors.linear_generator import LinearGenerator
-from gem5.components.processors.random_generator import RandomGenerator
-
-
-generator_class_map = {
-    "LinearGenerator": LinearGenerator,
-    "RandomGenerator": RandomGenerator,
-}
-
-generator_initializers = dict(rate="20GB/s")
-
-
-def cache_factory(cache_class):
-    if cache_class == "NoCache":
- from gem5.components.cachehierarchies.classic.no_cache import NoCache
-
-        return NoCache()
-    elif cache_class == "MESITwoLevel":
-        from gem5.components.cachehierarchies.ruby\
-            .mesi_two_level_cache_hierarchy import (
-            MESITwoLevelCacheHierarchy,
-        )
-
-        return MESITwoLevelCacheHierarchy(
-            l1i_size="32KiB",
-            l1i_assoc="8",
-            l1d_size="32KiB",
-            l1d_assoc="8",
-            l2_size="256KiB",
-            l2_assoc="4",
-            num_l2_banks=1,
-        )
-    else:
- raise ValueError(f"The cache class {cache_class} is not supported.")
-
-
-parser = argparse.ArgumentParser(
-    description="A traffic generator that can be used to test a gem5 "
-    "memory component."
-)
-
-parser.add_argument(
-    "generator_class",
-    type=str,
-    help="The class of generator to use.",
-    choices=["LinearGenerator", "RandomGenerator"],
-)
-
-parser.add_argument(
-    "cache_class",
-    type=str,
-    help="The cache class to import and instantiate.",
-    choices=["NoCache", "MESITwoLevel"],
-)
-
-parser.add_argument(
-    "mem_module",
-    type=str,
-    help="The python module to import for memory.",
-)
-
-parser.add_argument(
- "mem_class", type=str, help="The memory class to import and instantiate."
-)
-
-parser.add_argument(
-    "mem_args",
-    nargs="*",
-    help="The arguments needed to instantiate the memory class.",
-)
-
-args = parser.parse_args()
-
-generator_class = generator_class_map[args.generator_class]
-generator = generator_class(**generator_initializers)
-
-cache_hierarchy = cache_factory(args.cache_class)
-
-memory_class = getattr(
-    importlib.import_module(args.mem_module), args.mem_class
-)
-memory = memory_class(*args.mem_args)
-
-# We use the Test Board. This is a special board to run traffic generation
-# tasks
-motherboard = TestBoard(
-    clk_freq="3GHz",
-    processor=generator,  # We pass the traffic generator as the processor.
-    memory=memory,
-    cache_hierarchy=cache_hierarchy,
-)
-
-root = Root(full_system=False, system=motherboard)
-
-m5.instantiate()
-
-generator.start_traffic()
-print("Beginning simulation!")
-exit_event = m5.simulate()
-print(
- "Exiting @ tick {} because {}.".format(m5.curTick(), exit_event.getCause())
-)
-
-stats = gem5stats.get_simstat(root)
-json_out = join(m5.options.outdir, "stats.json")
-with open(json_out, "w") as json_stats:
-    stats.dump(json_stats, indent=2)
diff --git a/tests/gem5/traffic_gen/simple_traffic_run.py b/tests/gem5/traffic_gen/simple_traffic_run.py
new file mode 100644
index 0000000..5230045
--- /dev/null
+++ b/tests/gem5/traffic_gen/simple_traffic_run.py
@@ -0,0 +1,214 @@
+# Copyright (c) 2021 The Regents of the University of California
+# All rights reserved.
+#
+# 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.
+
+"""
+This scripts is used for checking the correctness of statistics reported
+by the gem5 simulator. It can excercise certain components in the memory
+subsystem. The reported values could be used to compare against a validated
+set of statistics.
+"""
+
+import m5
+import argparse
+import importlib
+
+from os.path import join
+from m5.objects import Root, MemorySize
+from gem5.components.boards.test_board import TestBoard
+
+
+def generator_factory(
+    generator_class: str, generator_cores: int, mem_size: MemorySize
+):
+    if generator_class == "LinearGenerator":
+ from gem5.components.processors.linear_generator import LinearGenerator
+
+        return LinearGenerator(
+            duration="250us",
+            rate="40GB/s",
+            num_cores=generator_cores,
+            max_addr=mem_size,
+        )
+    elif generator_class == "RandomGenerator":
+ from gem5.components.processors.random_generator import RandomGenerator
+
+        return RandomGenerator(
+            duration="250us",
+            rate="40GB/s",
+            num_cores=generator_cores,
+            max_addr=mem_size,
+        )
+    elif generator_class == "GUPSGenerator":
+        if generator_cores != 1:
+            raise ValueError(
+                "Only one core should be used with GUPSGenerator. "
+ "In order to use multiple cores of GUPS generator, use either "
+                "GUPSGeneratorEP or GUPSGeneratorPAR."
+            )
+        from gem5.components.processors.gups_generator import GUPSGenerator
+
+        table_size = f"{int(mem_size / 2)}B"
+        return GUPSGenerator(0, table_size, update_limit=1000)
+    elif generator_class == "GUPSGeneratorEP":
+        from gem5.components.processors.gups_generator_ep import (
+            GUPSGeneratorEP,
+        )
+
+        table_size = f"{int(mem_size / 2)}B"
+        return GUPSGeneratorEP(
+            generator_cores, 0, table_size, update_limit=1000
+        )
+    elif generator_class == "GUPSGeneratorPAR":
+        from gem5.components.processors.gups_generator_par import (
+            GUPSGeneratorPAR,
+        )
+
+        table_size = f"{int(mem_size / 2)}B"
+        return GUPSGeneratorPAR(
+            generator_cores, 0, table_size, update_limit=1000
+        )
+    else:
+        raise ValueError(f"Unknown generator class {generator_class}")
+
+
+def cache_factory(cache_class: str):
+    if cache_class == "NoCache":
+ from gem5.components.cachehierarchies.classic.no_cache import NoCache
+
+        return NoCache()
+    elif cache_class == "PrivateL1":
+        from gem5.components.cachehierarchies\
+            .classic.private_l1_cache_hierarchy import (
+            PrivateL1CacheHierarchy,
+        )
+
+        return PrivateL1CacheHierarchy(l1d_size="32KiB", l1i_size="32KiB")
+    elif cache_class == "PrivateL1PrivateL2":
+        from gem5.components.cachehierarchies\
+            .classic.private_l1_private_l2_cache_hierarchy import (
+            PrivateL1PrivateL2CacheHierarchy,
+        )
+
+        return PrivateL1PrivateL2CacheHierarchy(
+            l1d_size="32KiB", l1i_size="32KiB", l2_size="256KiB"
+        )
+    elif cache_class == "MESITwoLevel":
+        from gem5.components.cachehierarchies\
+            .ruby.mesi_two_level_cache_hierarchy import (
+            MESITwoLevelCacheHierarchy,
+        )
+
+        return MESITwoLevelCacheHierarchy(
+            l1i_size="32KiB",
+            l1i_assoc="8",
+            l1d_size="32KiB",
+            l1d_assoc="8",
+            l2_size="256KiB",
+            l2_assoc="4",
+            num_l2_banks=1,
+        )
+    else:
+ raise ValueError(f"The cache class {cache_class} is not supported.")
+
+
+parser = argparse.ArgumentParser(
+    description="A traffic generator that can be used to test a gem5 "
+    "memory component."
+)
+
+parser.add_argument(
+    "generator_class",
+    type=str,
+    help="The class of generator to use.",
+    choices=[
+        "LinearGenerator",
+        "RandomGenerator",
+        "GUPSGenerator",
+        "GUPSGeneratorEP",
+        "GUPSGeneratorPAR",
+    ],
+)
+
+parser.add_argument(
+ "generator_cores", type=int, help="The number of generator cores to use."
+)
+
+parser.add_argument(
+    "cache_class",
+    type=str,
+    help="The cache class to import and instantiate.",
+    choices=["NoCache", "PrivateL1", "PrivateL1PrivateL2", "MESITwoLevel"],
+)
+
+parser.add_argument(
+    "mem_module",
+    type=str,
+    help="The python module to import for memory.",
+)
+
+parser.add_argument(
+ "mem_class", type=str, help="The memory class to import and instantiate."
+)
+
+parser.add_argument(
+    "mem_args",
+    nargs="*",
+    help="The arguments needed to instantiate the memory class.",
+)
+
+
+args = parser.parse_args()
+
+cache_hierarchy = cache_factory(args.cache_class)
+
+memory_class = getattr(
+    importlib.import_module(args.mem_module), args.mem_class
+)
+memory = memory_class(*args.mem_args)
+
+generator = generator_factory(
+    args.generator_class, args.generator_cores, memory.get_size()
+)
+
+# We use the Test Board. This is a special board to run traffic generation
+# tasks
+motherboard = TestBoard(
+    clk_freq="3GHz",
+    processor=generator,  # We pass the traffic generator as the processor.
+    memory=memory,
+    cache_hierarchy=cache_hierarchy,
+)
+
+root = Root(full_system=False, system=motherboard)
+
+m5.instantiate()
+
+generator.start_traffic()
+print("Beginning simulation!")
+exit_event = m5.simulate()
+print(
+ "Exiting @ tick {} because {}.".format(m5.curTick(), exit_event.getCause())
+)
diff --git a/tests/gem5/traffic_gen/test_memory_traffic_gen.py b/tests/gem5/traffic_gen/test_memory_traffic_gen.py
index ff08f3d..e5126ba 100644
--- a/tests/gem5/traffic_gen/test_memory_traffic_gen.py
+++ b/tests/gem5/traffic_gen/test_memory_traffic_gen.py
@@ -35,34 +35,47 @@


 def test_memory(
-    generator: str, cache: str, module: str, memory: str, *args
+    generator: str,
+    generator_cores: str,
+    cache: str,
+    module: str,
+    memory: str,
+    *args,
 ) -> None:
-    protocol_map = {"NoCache": None, "MESITwoLevel": "MESI_Two_Level"}
+    protocol_map = {
+        "NoCache": None,
+        "PrivateL1": None,
+        "PrivateL1PrivateL2": None,
+        "MESITwoLevel": "MESI_Two_Level",
+    }
     tag_map = {
         "NoCache": constants.quick_tag,
+        "PrivateL1": constants.quick_tag,
+        "PrivateL1PrivateL2": constants.quick_tag,
         "MESITwoLevel": constants.long_tag,
     }

+    name = (
+        "test-memory-"
+        + f"{generator}-{generator_cores}-{cache}-{module}-{memory}"
+    )
+    for arg in args:
+        name += "-" + arg
+
     gem5_verify_config(
-        name="test-memory-"
-        + generator
-        + "."
-        + cache
-        + "."
-        + module
-        + "."
-        + memory,
+        name=name,
         fixtures=(),
         verifiers=(),
         config=joinpath(
             config.base_dir,
             "tests",
             "gem5",
-            "configs",
+            "traffic_gen",
             "simple_traffic_run.py",
         ),
         config_args=[
             generator,
+            generator_cores,
             cache,
             module,
             memory,
@@ -75,143 +88,68 @@
     )


-test_memory(
-    "LinearGenerator",
-    "NoCache",
-    "gem5.components.memory.single_channel",
+cache_classes = ["NoCache", "PrivateL1", "PrivateL1PrivateL2", "MESITwoLevel"]
+common_memory_classes = [
     "SingleChannelDDR3_1600",
-    "512MiB",
-)
-test_memory(
-    "LinearGenerator",
-    "NoCache",
-    "gem5.components.memory.single_channel",
     "SingleChannelDDR3_2133",
-    "512MiB",
-)
-test_memory(
-    "LinearGenerator",
-    "NoCache",
-    "gem5.components.memory.single_channel",
     "SingleChannelDDR4_2400",
-    "512MiB",
-)
-test_memory(
-    "LinearGenerator",
-    "NoCache",
-    "gem5.components.memory.single_channel",
     "SingleChannelLPDDR3_1600",
-    "512MiB",
-)
-test_memory(
-    "LinearGenerator",
-    "NoCache",
-    "gem5.components.memory.single_channel",
     "SingleChannelHBM",
-    "512MiB",
-)
-test_memory(
-    "RandomGenerator",
-    "NoCache",
+]
+multi_memory_classes = [
+    "DualChannelDDR3_1600",
+    "DualChannelDDR3_2133",
+    "DualChannelDDR4_2400",
+    "DualChannelLPDDR3_1600",
+    "HBM2Stack",
+]
+
+
+def create_single_core_tests(module, memory_classes):
+    # TODO: Add GUPSGenerator to these tests after adding ClockDomain as
+    # an input parameter.
+    generator_classes = ["LinearGenerator", "RandomGenerator"]
+    for generator_class in generator_classes:
+        for cache_class in cache_classes:
+            for memory_class in memory_classes:
+                test_memory(
+                    generator_class,
+                    "1",
+                    cache_class,
+                    module,
+                    memory_class,
+                    "512MiB",
+                )
+
+
+def create_dual_core_tests(module, memory_classes):
+    generator_classes = ["GUPSGeneratorEP", "GUPSGeneratorPAR"]
+    for generator_class in generator_classes:
+        for cache_class in cache_classes:
+            for memory_class in memory_classes:
+                test_memory(
+                    generator_class,
+                    "2",
+                    cache_class,
+                    module,
+                    memory_class,
+                    "512MiB",
+                )
+
+create_single_core_tests(
     "gem5.components.memory.single_channel",
-    "SingleChannelDDR3_1600",
-    "512MiB",
+    common_memory_classes,
 )
-test_memory(
-    "RandomGenerator",
-    "NoCache",
+create_dual_core_tests(
     "gem5.components.memory.single_channel",
-    "SingleChannelDDR3_2133",
-    "512MiB",
+    common_memory_classes,
 )
-test_memory(
-    "RandomGenerator",
-    "NoCache",
-    "gem5.components.memory.single_channel",
-    "SingleChannelDDR4_2400",
-    "512MiB",
+
+create_single_core_tests(
+    "gem5.components.memory.multi_channel",
+    common_memory_classes + multi_memory_classes,
 )
-test_memory(
-    "RandomGenerator",
-    "NoCache",
-    "gem5.components.memory.single_channel",
-    "SingleChannelLPDDR3_1600",
-    "512MiB",
-)
-test_memory(
-    "RandomGenerator",
-    "NoCache",
-    "gem5.components.memory.single_channel",
-    "SingleChannelHBM",
-    "512MiB",
-)
-test_memory(
-    "LinearGenerator",
-    "MESITwoLevel",
-    "gem5.components.memory.single_channel",
-    "SingleChannelDDR3_1600",
-    "512MiB",
-)
-test_memory(
-    "LinearGenerator",
-    "MESITwoLevel",
-    "gem5.components.memory.single_channel",
-    "SingleChannelDDR3_2133",
-    "512MiB",
-)
-test_memory(
-    "LinearGenerator",
-    "MESITwoLevel",
-    "gem5.components.memory.single_channel",
-    "SingleChannelDDR4_2400",
-    "512MiB",
-)
-test_memory(
-    "LinearGenerator",
-    "MESITwoLevel",
-    "gem5.components.memory.single_channel",
-    "SingleChannelLPDDR3_1600",
-    "512MiB",
-)
-test_memory(
-    "LinearGenerator",
-    "MESITwoLevel",
-    "gem5.components.memory.single_channel",
-    "SingleChannelHBM",
-    "512MiB",
-)
-test_memory(
-    "RandomGenerator",
-    "MESITwoLevel",
-    "gem5.components.memory.single_channel",
-    "SingleChannelDDR3_1600",
-    "512MiB",
-)
-test_memory(
-    "RandomGenerator",
-    "MESITwoLevel",
-    "gem5.components.memory.single_channel",
-    "SingleChannelDDR3_2133",
-    "512MiB",
-)
-test_memory(
-    "RandomGenerator",
-    "MESITwoLevel",
-    "gem5.components.memory.single_channel",
-    "SingleChannelDDR4_2400",
-    "512MiB",
-)
-test_memory(
-    "RandomGenerator",
-    "MESITwoLevel",
-    "gem5.components.memory.single_channel",
-    "SingleChannelLPDDR3_1600",
-    "512MiB",
-)
-test_memory(
-    "RandomGenerator",
-    "MESITwoLevel",
-    "gem5.components.memory.single_channel",
-    "SingleChannelHBM",
-    "512MiB",
+create_dual_core_tests(
+    "gem5.components.memory.multi_channel",
+    common_memory_classes + multi_memory_classes,
 )

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/52905
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I1db1281cdd4ade65d9abf2d979ef45342b63496a
Gerrit-Change-Number: 52905
Gerrit-PatchSet: 15
Gerrit-Owner: Mahyar Samani <msam...@ucdavis.edu>
Gerrit-Reviewer: Bobby Bruce <bbr...@ucdavis.edu>
Gerrit-Reviewer: Jason Lowe-Power <power...@gmail.com>
Gerrit-Reviewer: Mahyar Samani <msam...@ucdavis.edu>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to