configs: faux-filesystem fix w/ ruby in se mode

These changes are needed so that the config scripts
can report cache hierarchy information to the faux
filesystem.

This is useful for the ROCm runtime when it reads
psuedofiles from the host filesytem from "/proc".

Change-Id: Iad3e6c088d47c9b93979f584de748367eae8259b
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/12121
Reviewed-by: Brandon Potter <Brandon.Potter@amd.com>
Maintainer: Brandon Potter <Brandon.Potter@amd.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
David Hashe
2018-04-18 16:40:28 -04:00
committed by Brandon Potter
parent 26e888965d
commit ae3a00cd1f
12 changed files with 239 additions and 4 deletions

View File

@@ -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' + \

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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.

View File

@@ -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,

View File

@@ -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

View File

@@ -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)