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