115 lines
3.0 KiB
Python
Executable File
115 lines
3.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import matplotlib.pyplot as plt
|
|
|
|
from dataclasses import dataclass
|
|
from simulation import (
|
|
Simulation,
|
|
Configuration,
|
|
get_options_from_args,
|
|
simulation_results,
|
|
)
|
|
|
|
script_directory = os.path.dirname(os.path.abspath(__file__))
|
|
base_config = os.path.join(script_directory, "example_ddr3_simulations.json")
|
|
|
|
simulations: list[Simulation] = []
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class SchedulerBuffer:
|
|
buffer: str
|
|
size: int
|
|
|
|
|
|
refresh_policies = ["NoRefresh", "AllBank"]
|
|
patterns = ["sequential", "random"]
|
|
scheduler_buffers = [
|
|
SchedulerBuffer("Bankwise", 8),
|
|
SchedulerBuffer("Bankwise", 16),
|
|
]
|
|
|
|
for refresh_policy in refresh_policies:
|
|
for scheduler_buffer in scheduler_buffers:
|
|
for pattern in patterns:
|
|
PAGE_POLICY = "Open" if pattern == "sequential" else "Closed"
|
|
|
|
config = Configuration(
|
|
f"{refresh_policy}_{scheduler_buffer.buffer}_{scheduler_buffer.size}_{pattern}",
|
|
{
|
|
"refresh_policy": refresh_policy,
|
|
"pattern": pattern,
|
|
"page_policy": PAGE_POLICY,
|
|
"scheduler_buffer": scheduler_buffer.buffer,
|
|
"scheduler_buffer_size": scheduler_buffer.size,
|
|
},
|
|
)
|
|
|
|
simulations.append(Simulation(config))
|
|
|
|
|
|
options = get_options_from_args()
|
|
|
|
if options.base_config is None:
|
|
options.base_config = base_config
|
|
|
|
dataframe = simulation_results(options, simulations)
|
|
|
|
# Generate interesting plots!
|
|
for refresh_policy in refresh_policies:
|
|
refresh_policy_filter = dataframe["refresh_policy"] == refresh_policy
|
|
|
|
for scheduler_buffer in scheduler_buffers:
|
|
scheduler_buffer_filter = (
|
|
dataframe["scheduler_buffer"] == scheduler_buffer.buffer
|
|
)
|
|
scheduler_buffer_size_filter = (
|
|
dataframe["scheduler_buffer_size"] == scheduler_buffer.size
|
|
)
|
|
|
|
filters = (
|
|
refresh_policy_filter
|
|
& scheduler_buffer_filter
|
|
& scheduler_buffer_size_filter
|
|
)
|
|
|
|
TEMP_DATAFRAME = dataframe[filters]
|
|
|
|
for pattern in patterns:
|
|
pattern_filter = dataframe["pattern"] == pattern
|
|
|
|
plt.figure(figsize=(8.0, 12.0))
|
|
|
|
filters = (
|
|
refresh_policy_filter
|
|
& scheduler_buffer_filter
|
|
& scheduler_buffer_size_filter
|
|
)
|
|
|
|
TEMP_DATAFRAME = dataframe[filters]
|
|
|
|
plt.bar(
|
|
"pattern",
|
|
"bandwidth",
|
|
data=TEMP_DATAFRAME,
|
|
)
|
|
|
|
# Plot MAX line
|
|
plt.bar(
|
|
"MAX",
|
|
"max_bandwidth",
|
|
data=TEMP_DATAFRAME,
|
|
color="darkgray",
|
|
)
|
|
|
|
title = f"{refresh_policy} {scheduler_buffer.buffer} {scheduler_buffer.size}"
|
|
|
|
plt.title(title)
|
|
plt.axis(ymin=0, ymax=120)
|
|
plt.xlabel("Access Pattern")
|
|
plt.ylabel("Bandwidth [Gb/s]")
|
|
|
|
plt.savefig(f"{options.out_dir}/{title}.png")
|
|
plt.close()
|