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 <bbruce@ucdavis.edu>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Bobby Bruce <bbruce@ucdavis.edu>
This commit is contained in:
Mahyar Samani
2021-11-16 15:51:55 -08:00
parent 998cc8e679
commit 2671c59858
2 changed files with 166 additions and 162 deletions

View File

@@ -36,29 +36,88 @@ import argparse
import importlib
from os.path import join
from m5.objects import Root
from m5.stats import gem5stats
from m5.objects import Root, MemorySize
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,
}
def generator_factory(
generator_class: str, generator_cores: int, mem_size: MemorySize
):
if generator_class == "LinearGenerator":
from gem5.components.processors.linear_generator import LinearGenerator
generator_initializers = dict(rate="20GB/s")
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):
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 (
from gem5.components.cachehierarchies\
.ruby.mesi_two_level_cache_hierarchy import (
MESITwoLevelCacheHierarchy,
)
@@ -84,14 +143,24 @@ parser.add_argument(
"generator_class",
type=str,
help="The class of generator to use.",
choices=["LinearGenerator", "RandomGenerator"],
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", "MESITwoLevel"],
choices=["NoCache", "PrivateL1", "PrivateL1PrivateL2", "MESITwoLevel"],
)
parser.add_argument(
@@ -110,10 +179,8 @@ parser.add_argument(
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)
args = parser.parse_args()
cache_hierarchy = cache_factory(args.cache_class)
@@ -122,6 +189,10 @@ memory_class = getattr(
)
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(
@@ -141,8 +212,3 @@ 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)

View File

@@ -35,34 +35,47 @@ from testlib import *
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 @@ def test_memory(
)
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,
)