configs: faux-filesystem fix w/ ruby in se mode
authorDavid Hashe <david.hashe@amd.com>
Wed, 18 Apr 2018 20:40:28 +0000 (16:40 -0400)
committerBrandon Potter <Brandon.Potter@amd.com>
Thu, 25 Apr 2019 20:38:57 +0000 (20:38 +0000)
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>
12 files changed:
configs/common/FileSystemConfig.py
configs/ruby/GPU_VIPER.py
configs/ruby/MESI_Three_Level.py
configs/ruby/MOESI_AMD_Base.py
configs/ruby/MOESI_CMP_directory.py
configs/ruby/MOESI_CMP_token.py
configs/ruby/MOESI_hammer.py
configs/ruby/Ruby.py
configs/topologies/BaseTopology.py
configs/topologies/Cluster.py
configs/topologies/MeshDirCorners_XY.py
configs/topologies/Mesh_XY.py

index 561cfe6599c180c2bd70e3aac47466671c7ad28a..8a6da52e64d033793a426b6823d4b0a4713bb8bd 100644 (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'                         + \
index 94dcbefe33cac717cdecd121bb75f34bbdcf6036..e8e781562444d4109788653d926d73178c81576d 100644 (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)
index 95ac342a726bc90519a1633cef539ade91a97f9b..6d6bc89b90cf41ad42a7a5a6c393cc0b5fc8353e 100644 (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)
index aeec3783822eeeea57502ced1590cc9c74e8dfc4..d46508302343f0165518103179dbace63d3e1161 100644 (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)
 
index 40cb7ce67612f5f2700a56ecdcddec8c80384e5d..5ce31dfa176531bbdf3d108c34363b6f2f04be29 100644 (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)
index 817d6f96ce554f08be2b8e666c92bab23aa4790f..6d100bda2024d9b1bc6162cdff09c6d94d1cf01d 100644 (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)
index 763088682c0222769da0f3c99ba040813b567336..ecac17e98a7de92421b42f5257a66f82328a6f3d 100644 (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)
index ffa5a0294c911814a67d6452e5bba275e68db4eb..369a4e355800c32f071039275a4f02ebe6d67a57 100644 (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)
 
index 180d4373aac69660e1a8ff8186e8a6f0f400257d..15c9e88288358421d8c486c24758660afeb86cbd 100644 (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.
index a0e7df638acd9cb197cb7500295629f216d27859..65c568643164ef99a4424d6ce79e4a4f79a08ad6 100644 (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,
index 95cb486ab2a7d698976270710110dce480b261dd..bdeaec14725aae32c9fa45bdb9335fc7f3f97258 100644 (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
+
index 79575b35dd682500e0e4aba7a391e30bbc192bcc..66fbd361878d2e23aaafdf3e550fa07a6e106edf 100644 (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)