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:
@@ -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)
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user