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:
committed by
Brandon Potter
parent
26e888965d
commit
ae3a00cd1f
@@ -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' + \
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user