diff options
-rw-r--r-- | configs/common/FileSystemConfig.py | 2 | ||||
-rw-r--r-- | configs/ruby/GPU_VIPER.py | 53 | ||||
-rw-r--r-- | configs/ruby/MESI_Three_Level.py | 40 | ||||
-rw-r--r-- | configs/ruby/MOESI_AMD_Base.py | 54 | ||||
-rw-r--r-- | configs/ruby/MOESI_CMP_directory.py | 1 | ||||
-rw-r--r-- | configs/ruby/MOESI_CMP_token.py | 1 | ||||
-rw-r--r-- | configs/ruby/MOESI_hammer.py | 30 | ||||
-rw-r--r-- | configs/ruby/Ruby.py | 9 | ||||
-rw-r--r-- | configs/topologies/BaseTopology.py | 9 | ||||
-rw-r--r-- | configs/topologies/Cluster.py | 3 | ||||
-rw-r--r-- | configs/topologies/MeshDirCorners_XY.py | 33 | ||||
-rw-r--r-- | configs/topologies/Mesh_XY.py | 8 |
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) |