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' + \
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)
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
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)
from m5.util import addToPath
from Ruby import create_topology
from Ruby import send_evicts
+import FileSystemConfig
addToPath('../')
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)
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)
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)
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
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)
addToPath('../')
from common import MemConfig
+from common import FileSystemConfig
from topologies import *
from network import Network
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)
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)
"""
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.
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,
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.
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],
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
+
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
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)