summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configs/common/FileSystemConfig.py2
-rw-r--r--configs/ruby/GPU_VIPER.py53
-rw-r--r--configs/ruby/MESI_Three_Level.py40
-rw-r--r--configs/ruby/MOESI_AMD_Base.py54
-rw-r--r--configs/ruby/MOESI_CMP_directory.py1
-rw-r--r--configs/ruby/MOESI_CMP_token.py1
-rw-r--r--configs/ruby/MOESI_hammer.py30
-rw-r--r--configs/ruby/Ruby.py9
-rw-r--r--configs/topologies/BaseTopology.py9
-rw-r--r--configs/topologies/Cluster.py3
-rw-r--r--configs/topologies/MeshDirCorners_XY.py33
-rw-r--r--configs/topologies/Mesh_XY.py8
12 files changed, 239 insertions, 4 deletions
diff --git a/configs/common/FileSystemConfig.py b/configs/common/FileSystemConfig.py
index 561cfe659..8a6da52e6 100644
--- a/configs/common/FileSystemConfig.py
+++ b/configs/common/FileSystemConfig.py
@@ -61,7 +61,7 @@ def config_filesystem(options):
mkdir(procdir)
for i in xrange(options.num_cpus):
- one_cpu = 'processor : 0\n' + \
+ one_cpu = 'processor : %d\n' % (i) + \
'vendor_id : Generic\n' + \
'cpu family : 0\n' + \
'model : 0\n' + \
diff --git a/configs/ruby/GPU_VIPER.py b/configs/ruby/GPU_VIPER.py
index 94dcbefe3..e8e781562 100644
--- a/configs/ruby/GPU_VIPER.py
+++ b/configs/ruby/GPU_VIPER.py
@@ -499,6 +499,59 @@ def create_system(options, full_system, system, dma_devices, bootmem,
cpuCluster.add(cp_cntrl)
+ # Register CPUs and caches for each CorePair and directory (SE mode only)
+ if not full_system:
+ FileSystemConfig.config_filesystem(options)
+ for i in xrange((options.num_cpus + 1) // 2):
+ FileSystemConfig.register_cpu(physical_package_id = 0,
+ core_siblings = \
+ xrange(options.num_cpus),
+ core_id = i*2,
+ thread_siblings = [])
+
+ FileSystemConfig.register_cpu(physical_package_id = 0,
+ core_siblings = \
+ xrange(options.num_cpus),
+ core_id = i*2+1,
+ thread_siblings = [])
+
+ FileSystemConfig.register_cache(level = 0,
+ idu_type = 'Instruction',
+ size = options.l1i_size,
+ line_size = options.cacheline_size,
+ assoc = options.l1i_assoc,
+ cpus = [i*2, i*2+1])
+
+ FileSystemConfig.register_cache(level = 0,
+ idu_type = 'Data',
+ size = options.l1d_size,
+ line_size = options.cacheline_size,
+ assoc = options.l1d_assoc,
+ cpus = [i*2])
+
+ FileSystemConfig.register_cache(level = 0,
+ idu_type = 'Data',
+ size = options.l1d_size,
+ line_size = options.cacheline_size,
+ assoc = options.l1d_assoc,
+ cpus = [i*2+1])
+
+ FileSystemConfig.register_cache(level = 1,
+ idu_type = 'Unified',
+ size = options.l2_size,
+ line_size = options.cacheline_size,
+ assoc = options.l2_assoc,
+ cpus = [i*2, i*2+1])
+
+ for i in range(options.num_dirs):
+ FileSystemConfig.register_cache(level = 2,
+ idu_type = 'Unified',
+ size = options.l3_size,
+ line_size = options.cacheline_size,
+ assoc = options.l3_assoc,
+ cpus = [n for n in
+ xrange(options.num_cpus)])
+
gpuCluster = None
if hasattr(options, 'bw_scalor') and options.bw_scalor > 0:
gpuCluster = Cluster(extBW = crossbar_bw, intBW = crossbar_bw)
diff --git a/configs/ruby/MESI_Three_Level.py b/configs/ruby/MESI_Three_Level.py
index 95ac342a7..6d6bc89b9 100644
--- a/configs/ruby/MESI_Three_Level.py
+++ b/configs/ruby/MESI_Three_Level.py
@@ -35,6 +35,7 @@ from m5.objects import *
from m5.defines import buildEnv
from Ruby import create_topology, create_directories
from Ruby import send_evicts
+import FileSystemConfig
#
# Declare caches used by the protocol
@@ -260,6 +261,45 @@ def create_system(options, full_system, system, dma_ports, bootmem,
io_controller.requestToDir.master = ruby_system.network.slave
all_cntrls = all_cntrls + [io_controller]
+ # Register configuration with filesystem
+ else:
+ FileSystemConfig.config_filesystem(options)
+
+ for i in xrange(options.num_clusters):
+ for j in xrange(num_cpus_per_cluster):
+ FileSystemConfig.register_cpu(physical_package_id = 0,
+ core_siblings = xrange(options.num_cpus),
+ core_id = i*num_cpus_per_cluster+j,
+ thread_siblings = [])
+
+ FileSystemConfig.register_cache(level = 0,
+ idu_type = 'Instruction',
+ size = '4096B',
+ line_size = options.cacheline_size,
+ assoc = 1,
+ cpus = [i*num_cpus_per_cluster+j])
+ FileSystemConfig.register_cache(level = 0,
+ idu_type = 'Data',
+ size = '4096B',
+ line_size = options.cacheline_size,
+ assoc = 1,
+ cpus = [i*num_cpus_per_cluster+j])
+
+ FileSystemConfig.register_cache(level = 1,
+ idu_type = 'Unified',
+ size = options.l1d_size,
+ line_size = options.cacheline_size,
+ assoc = options.l1d_assoc,
+ cpus = [i*num_cpus_per_cluster+j])
+
+ FileSystemConfig.register_cache(level = 2,
+ idu_type = 'Unified',
+ size = str(MemorySize(options.l2_size) * \
+ num_l2caches_per_cluster)+'B',
+ line_size = options.cacheline_size,
+ assoc = options.l2_assoc,
+ cpus = [n for n in xrange(i*num_cpus_per_cluster, \
+ (i+1)*num_cpus_per_cluster)])
ruby_system.network.number_of_virtual_networks = 3
topology = create_topology(all_cntrls, options)
diff --git a/configs/ruby/MOESI_AMD_Base.py b/configs/ruby/MOESI_AMD_Base.py
index aeec37838..d46508302 100644
--- a/configs/ruby/MOESI_AMD_Base.py
+++ b/configs/ruby/MOESI_AMD_Base.py
@@ -38,6 +38,7 @@ from m5.defines import buildEnv
from m5.util import addToPath
from Ruby import create_topology
from Ruby import send_evicts
+import FileSystemConfig
addToPath('../')
@@ -326,6 +327,59 @@ def create_system(options, full_system, system, dma_devices, bootmem,
cpuCluster.add(cp_cntrl)
+ # Register CPUs and caches for each CorePair and directory (SE mode only)
+ if not full_system:
+ FileSystemConfig.config_filesystem(options)
+ for i in xrange((options.num_cpus + 1) // 2):
+ FileSystemConfig.register_cpu(physical_package_id = 0,
+ core_siblings =
+ xrange(options.num_cpus),
+ core_id = i*2,
+ thread_siblings = [])
+
+ FileSystemConfig.register_cpu(physical_package_id = 0,
+ core_siblings =
+ xrange(options.num_cpus),
+ core_id = i*2+1,
+ thread_siblings = [])
+
+ FileSystemConfig.register_cache(level = 0,
+ idu_type = 'Instruction',
+ size = options.l1i_size,
+ line_size = options.cacheline_size,
+ assoc = options.l1i_assoc,
+ cpus = [i*2, i*2+1])
+
+ FileSystemConfig.register_cache(level = 0,
+ idu_type = 'Data',
+ size = options.l1d_size,
+ line_size = options.cacheline_size,
+ assoc = options.l1d_assoc,
+ cpus = [i*2])
+
+ FileSystemConfig.register_cache(level = 0,
+ idu_type = 'Data',
+ size = options.l1d_size,
+ line_size = options.cacheline_size,
+ assoc = options.l1d_assoc,
+ cpus = [i*2+1])
+
+ FileSystemConfig.register_cache(level = 1,
+ idu_type = 'Unified',
+ size = options.l2_size,
+ line_size = options.cacheline_size,
+ assoc = options.l2_assoc,
+ cpus = [i*2, i*2+1])
+
+ for i in range(options.num_dirs):
+ FileSystemConfig.register_cache(level = 2,
+ idu_type = 'Unified',
+ size = options.l3_size,
+ line_size = options.cacheline_size,
+ assoc = options.l3_assoc,
+ cpus = [n for n in
+ xrange(options.num_cpus)])
+
# Assuming no DMA devices
assert(len(dma_devices) == 0)
diff --git a/configs/ruby/MOESI_CMP_directory.py b/configs/ruby/MOESI_CMP_directory.py
index 40cb7ce67..5ce31dfa1 100644
--- a/configs/ruby/MOESI_CMP_directory.py
+++ b/configs/ruby/MOESI_CMP_directory.py
@@ -237,7 +237,6 @@ def create_system(options, full_system, system, dma_ports, bootmem,
all_cntrls = all_cntrls + [io_controller]
-
ruby_system.network.number_of_virtual_networks = 3
topology = create_topology(all_cntrls, options)
return (cpu_sequencers, mem_dir_cntrl_nodes, topology)
diff --git a/configs/ruby/MOESI_CMP_token.py b/configs/ruby/MOESI_CMP_token.py
index 817d6f96c..6d100bda2 100644
--- a/configs/ruby/MOESI_CMP_token.py
+++ b/configs/ruby/MOESI_CMP_token.py
@@ -265,7 +265,6 @@ def create_system(options, full_system, system, dma_ports, bootmem,
all_cntrls = all_cntrls + [io_controller]
-
ruby_system.network.number_of_virtual_networks = 6
topology = create_topology(all_cntrls, options)
return (cpu_sequencers, mem_dir_cntrl_nodes, topology)
diff --git a/configs/ruby/MOESI_hammer.py b/configs/ruby/MOESI_hammer.py
index 763088682..ecac17e98 100644
--- a/configs/ruby/MOESI_hammer.py
+++ b/configs/ruby/MOESI_hammer.py
@@ -33,6 +33,7 @@ from m5.objects import *
from m5.defines import buildEnv
from Ruby import create_topology, create_directories
from Ruby import send_evicts
+import FileSystemConfig
#
# Declare caches used by the protocol
@@ -255,6 +256,35 @@ def create_system(options, full_system, system, dma_ports, bootmem,
io_controller.mandatoryQueue = MessageBuffer()
all_cntrls = all_cntrls + [io_controller]
+ # Register configuration with filesystem
+ else:
+ FileSystemConfig.config_filesystem(options)
+
+ for i in xrange(options.num_cpus):
+ FileSystemConfig.register_cpu(physical_package_id = 0,
+ core_siblings = [],
+ core_id = i,
+ thread_siblings = [])
+
+ FileSystemConfig.register_cache(level = 1,
+ idu_type = 'Instruction',
+ size = options.l1i_size,
+ line_size = options.cacheline_size,
+ assoc = options.l1i_assoc,
+ cpus = [i])
+ FileSystemConfig.register_cache(level = 1,
+ idu_type = 'Data',
+ size = options.l1d_size,
+ line_size = options.cacheline_size,
+ assoc = options.l1d_assoc,
+ cpus = [i])
+
+ FileSystemConfig.register_cache(level = 2,
+ idu_type = 'Unified',
+ size = options.l2_size,
+ line_size = options.cacheline_size,
+ assoc = options.l2_assoc,
+ cpus = [i])
ruby_system.network.number_of_virtual_networks = 6
topology = create_topology(all_cntrls, options)
diff --git a/configs/ruby/Ruby.py b/configs/ruby/Ruby.py
index ffa5a0294..369a4e355 100644
--- a/configs/ruby/Ruby.py
+++ b/configs/ruby/Ruby.py
@@ -50,6 +50,7 @@ from m5.util import addToPath, fatal
addToPath('../')
from common import MemConfig
+from common import FileSystemConfig
from topologies import *
from network import Network
@@ -154,6 +155,9 @@ def create_system(options, full_system, system, piobus = None, dma_ports = [],
system.ruby = RubySystem()
ruby = system.ruby
+ # Generate pseudo filesystem
+ FileSystemConfig.config_filesystem(options)
+
# Create the network object
(network, IntLinkClass, ExtLinkClass, RouterClass, InterfaceClass) = \
Network.create_network(options, ruby)
@@ -174,6 +178,11 @@ def create_system(options, full_system, system, piobus = None, dma_ports = [],
topology.makeTopology(options, network, IntLinkClass, ExtLinkClass,
RouterClass)
+ # Register the topology elements with faux filesystem (SE mode only)
+ if not full_system:
+ topology.registerTopology(options)
+
+
# Initialize network based on topology
Network.init_network(options, network, InterfaceClass)
diff --git a/configs/topologies/BaseTopology.py b/configs/topologies/BaseTopology.py
index 180d4373a..15c9e8828 100644
--- a/configs/topologies/BaseTopology.py
+++ b/configs/topologies/BaseTopology.py
@@ -51,6 +51,15 @@ class BaseTopology(object):
"""
m5.util.fatal("BaseTopology should have been overridden!!")
+ def registerTopology(self, options):
+ """ Called from configs/ruby/Ruby.py
+ There is no return value. This should only be called in
+ SE mode. It is used by some topology objects to populate
+ the faux filesystem with accurate file contents.
+ No need to implement if not using FilesystemRegister
+ functionality.
+ """
+
class SimpleTopology(BaseTopology):
""" Provides methods needed for the topologies included in Ruby before
topology changes.
diff --git a/configs/topologies/Cluster.py b/configs/topologies/Cluster.py
index a0e7df638..65c568643 100644
--- a/configs/topologies/Cluster.py
+++ b/configs/topologies/Cluster.py
@@ -85,7 +85,8 @@ class Cluster(BaseTopology):
for node in self.nodes:
if type(node) == Cluster:
- node.makeTopology(options, network, IntLink, ExtLink, Router)
+ node.makeTopology(options, network, IntLink,
+ ExtLink, Router)
# connect this cluster to the router
link_out = IntLink(link_id=self.num_int_links(), src_node=self.router,
diff --git a/configs/topologies/MeshDirCorners_XY.py b/configs/topologies/MeshDirCorners_XY.py
index 95cb486ab..bdeaec147 100644
--- a/configs/topologies/MeshDirCorners_XY.py
+++ b/configs/topologies/MeshDirCorners_XY.py
@@ -32,6 +32,8 @@ from __future__ import absolute_import
from m5.params import *
from m5.objects import *
+from common import FileSystemConfig
+
from .BaseTopology import SimpleTopology
# Creates a Mesh topology with 4 directories, one at each corner.
@@ -98,6 +100,27 @@ class MeshDirCorners_XY(SimpleTopology):
latency = link_latency))
link_count += 1
+ # NUMA Node for each quadrant
+ # With odd columns or rows, the nodes will be unequal
+ numa_nodes = [ [], [], [], []]
+ for i in xrange(num_routers):
+ if i % num_columns < num_columns / 2 and \
+ i < num_routers / 2:
+ numa_nodes[0].append(i)
+ elif i % num_columns >= num_columns / 2 and \
+ i < num_routers / 2:
+ numa_nodes[1].append(i)
+ elif i % num_columns < num_columns / 2 and \
+ i >= num_routers / 2:
+ numa_nodes[2].append(i)
+ else:
+ numa_nodes[3].append(i)
+
+ num_numa_nodes = 0
+ for n in numa_nodes:
+ if n:
+ num_numa_nodes += 1
+
# Connect the dir nodes to the corners.
ext_links.append(ExtLink(link_id=link_count, ext_node=dir_nodes[0],
int_node=routers[0],
@@ -190,3 +213,13 @@ class MeshDirCorners_XY(SimpleTopology):
network.int_links = int_links
+
+ # Register nodes with filesystem
+ def registerTopology(self, options):
+ i = 0
+ for n in numa_nodes:
+ if n:
+ FileSystemConfig.register_node(n,
+ MemorySize(options.mem_size) / num_numa_nodes, i)
+ i += 1
+
diff --git a/configs/topologies/Mesh_XY.py b/configs/topologies/Mesh_XY.py
index 79575b35d..66fbd3618 100644
--- a/configs/topologies/Mesh_XY.py
+++ b/configs/topologies/Mesh_XY.py
@@ -34,6 +34,8 @@ from __future__ import absolute_import
from m5.params import *
from m5.objects import *
+from common import FileSystemConfig
+
from .BaseTopology import SimpleTopology
# Creates a generic Mesh assuming an equal number of cache
@@ -174,3 +176,9 @@ class Mesh_XY(SimpleTopology):
network.int_links = int_links
+
+ # Register nodes with filesystem
+ def registerTopology(self, options):
+ for i in xrange(options.num_cpus):
+ FileSystemConfig.register_node([i],
+ MemorySize(options.mem_size) / options.num_cpus, i)