ruby: rename ALPHA_Network_test protocol to Garnet_standalone.

Over the past 6 years, we realized that the protocol is essentially used
to run the garnet network in a standalone manner, and feed standard synthetic
traffic patterns through it.
This commit is contained in:
Tushar Krishna 2016-10-06 14:35:14 -04:00
parent 3f0118876f
commit aca869bf2d
13 changed files with 48 additions and 43 deletions

View file

@ -1,3 +1,4 @@
TARGET_ISA = 'alpha'
SS_COMPATIBLE_FP = 1 SS_COMPATIBLE_FP = 1
CPU_MODELS = 'AtomicSimpleCPU,TimingSimpleCPU,O3CPU,MinorCPU' CPU_MODELS = 'AtomicSimpleCPU,TimingSimpleCPU,O3CPU,MinorCPU'
PROTOCOL = 'Network_test' PROTOCOL = 'Garnet_standalone'

View file

@ -1,5 +1,5 @@
# Copyright (c) 2006-2007 The Regents of The University of Michigan
# Copyright (c) 2009 Advanced Micro Devices, Inc. # Copyright (c) 2009 Advanced Micro Devices, Inc.
# Copyright (c) 2016 Georgia Institute of Technology
# All rights reserved. # All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
@ -26,6 +26,7 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
# Authors: Brad Beckmann # Authors: Brad Beckmann
# Tushar Krishna
import m5 import m5
from m5.objects import * from m5.objects import *
@ -42,22 +43,21 @@ def define_options(parser):
return return
def create_system(options, full_system, system, dma_ports, ruby_system): def create_system(options, full_system, system, dma_ports, ruby_system):
if buildEnv['PROTOCOL'] != 'Garnet_standalone':
if buildEnv['PROTOCOL'] != 'Network_test': panic("This script requires Garnet_standalone protocol to be built.")
panic("This script requires the Network_test protocol to be built.")
cpu_sequencers = [] cpu_sequencers = []
# #
# The Garnet tester protocol does not support fs nor dma # The Garnet_standalone protocol does not support fs nor dma
# #
assert(dma_ports == []) assert(dma_ports == [])
# #
# The ruby network creation expects the list of nodes in the system to be # The ruby network creation expects the list of nodes in the system to be
# consistent with the NetDest list. Therefore the l1 controller nodes must be # consistent with the NetDest list.
# listed before the directory nodes and directory nodes before dma nodes, etc. # Therefore the l1 controller nodes must be listed before
# # the directory nodes and directory nodes before dma nodes, etc.
l1_cntrl_nodes = [] l1_cntrl_nodes = []
dir_cntrl_nodes = [] dir_cntrl_nodes = []
@ -84,7 +84,7 @@ def create_system(options, full_system, system, dma_ports, ruby_system):
cpu_seq = RubySequencer(icache = cache, cpu_seq = RubySequencer(icache = cache,
dcache = cache, dcache = cache,
using_network_tester = True, garnet_standalone = True,
ruby_system = ruby_system) ruby_system = ruby_system)
l1_cntrl.sequencer = cpu_seq l1_cntrl.sequencer = cpu_seq

View file

@ -31,7 +31,7 @@
*/ */
machine(MachineType:L1Cache, "Network_test L1 Cache") machine(MachineType:L1Cache, "Garnet_standalone L1 Cache")
: Sequencer * sequencer; : Sequencer * sequencer;
Cycles issue_latency := 2; Cycles issue_latency := 2;
@ -53,9 +53,9 @@ machine(MachineType:L1Cache, "Network_test L1 Cache")
// EVENTS // EVENTS
enumeration(Event, desc="Cache events") { enumeration(Event, desc="Cache events") {
// From processor // From processor
Request, desc="Request from Network_test"; Request, desc="Request from Garnet_standalone";
Forward, desc="Forward from Network_test"; Forward, desc="Forward from Garnet_standalone";
Response, desc="Response from Network_test"; Response, desc="Response from Garnet_standalone";
} }
// STRUCTURE DEFINITIONS // STRUCTURE DEFINITIONS
@ -74,7 +74,7 @@ machine(MachineType:L1Cache, "Network_test L1 Cache")
// ReadReq, INST_FETCH, and WriteReq. // ReadReq, INST_FETCH, and WriteReq.
// These are converted to LD, IFETCH and ST by mem/ruby/system/RubyPort.cc. // These are converted to LD, IFETCH and ST by mem/ruby/system/RubyPort.cc.
// These are then sent to the sequencer, which sends them here. // These are then sent to the sequencer, which sends them here.
// Network_test-cache.sm tags LD, IFETCH and ST as Request, Forward, // Garnet_standalone-cache.sm tags LD, IFETCH and ST as Request, Forward,
// and Response Events respectively, which are then injected into // and Response Events respectively, which are then injected into
// virtual networks 0, 1 and 2 respectively. // virtual networks 0, 1 and 2 respectively.
// This models traffic of different types within the network. // This models traffic of different types within the network.
@ -115,11 +115,11 @@ machine(MachineType:L1Cache, "Network_test L1 Cache")
} }
void functionalRead(Addr addr, Packet *pkt) { void functionalRead(Addr addr, Packet *pkt) {
error("Network test does not support functional read."); error("Garnet_standalone does not support functional read.");
} }
int functionalWrite(Addr addr, Packet *pkt) { int functionalWrite(Addr addr, Packet *pkt) {
error("Network test does not support functional write."); error("Garnet_standalone does not support functional write.");
} }
// NETWORK PORTS // NETWORK PORTS
@ -149,7 +149,11 @@ machine(MachineType:L1Cache, "Network_test L1 Cache")
out_msg.Type := CoherenceRequestType:MSG; out_msg.Type := CoherenceRequestType:MSG;
out_msg.Requestor := machineID; out_msg.Requestor := machineID;
out_msg.Destination.add(map_Address_to_Directory(address)); out_msg.Destination.add(map_Address_to_Directory(address));
//out_msg.Destination := broadcast(MachineType:Directory);
// To send broadcasts in vnet0 (to emulate broadcast-based protocols),
// replace the above line by the following:
// out_msg.Destination := broadcast(MachineType:Directory);
out_msg.MessageSize := MessageSizeType:Control; out_msg.MessageSize := MessageSizeType:Control;
} }
} }
@ -190,7 +194,7 @@ machine(MachineType:L1Cache, "Network_test L1 Cache")
// TRANSITIONS // TRANSITIONS
// sequencer hit call back is performed after injecting the packets. // sequencer hit call back is performed after injecting the packets.
// The goal of the Network_test protocol is only to inject packets into // The goal of the Garnet_standalone protocol is only to inject packets into
// the network, not to keep track of them via TBEs. // the network, not to keep track of them via TBEs.
transition(I, Response) { transition(I, Response) {

View file

@ -31,7 +31,7 @@
*/ */
machine(MachineType:Directory, "Network_test Directory") machine(MachineType:Directory, "Garnet_standalone Directory")
: MessageBuffer * requestToDir, network="From", virtual_network="0", : MessageBuffer * requestToDir, network="From", virtual_network="0",
vnet_type = "request"; vnet_type = "request";
MessageBuffer * forwardToDir, network="From", virtual_network="1", MessageBuffer * forwardToDir, network="From", virtual_network="1",
@ -79,11 +79,11 @@ machine(MachineType:Directory, "Network_test Directory")
} }
void functionalRead(Addr addr, Packet *pkt) { void functionalRead(Addr addr, Packet *pkt) {
error("Network test does not support functional read."); error("Garnet_standalone does not support functional read.");
} }
int functionalWrite(Addr addr, Packet *pkt) { int functionalWrite(Addr addr, Packet *pkt) {
error("Network test does not support functional write."); error("Garnet_standalone does not support functional write.");
} }
// ** IN_PORTS ** // ** IN_PORTS **
@ -139,7 +139,7 @@ machine(MachineType:Directory, "Network_test Directory")
// TRANSITIONS // TRANSITIONS
// The directory simply drops the received packets. // The directory simply drops the received packets.
// The goal of Network_test is only to track network stats. // The goal of Garnet_standalone is only to track network stats.
transition(I, Receive_Request) { transition(I, Receive_Request) {
i_popIncomingRequestQueue; i_popIncomingRequestQueue;

View file

@ -34,18 +34,18 @@ enumeration(CoherenceRequestType, desc="...") {
// RequestMsg (and also forwarded requests) // RequestMsg (and also forwarded requests)
structure(RequestMsg, desc="...", interface="Message") { structure(RequestMsg, desc="...", interface="Message") {
Addr addr, desc="Physical address for this request"; Addr addr, desc="Physical address for this request";
CoherenceRequestType Type, desc="Type of request (GetS, GetX, PutX, etc)"; CoherenceRequestType Type, desc="Type of request (GetS, GetX, PutX, etc)";
MachineID Requestor, desc="Node who initiated the request"; MachineID Requestor, desc="Node who initiated the request";
NetDest Destination, desc="Multicast destination mask"; NetDest Destination, desc="Multicast destination mask";
DataBlock DataBlk, desc="data for the cache line"; DataBlock DataBlk, desc="data for the cache line";
MessageSizeType MessageSize, desc="size category of the message"; MessageSizeType MessageSize, desc="size category of the message";
bool functionalRead(Packet *pkt) { bool functionalRead(Packet *pkt) {
error("Network test does not support functional accesses!"); error("Garnet_standalone does not support functional accesses!");
} }
bool functionalWrite(Packet *pkt) { bool functionalWrite(Packet *pkt) {
error("Network test does not support functional accesses!"); error("Garnet_standalone does not support functional accesses!");
} }
} }

View file

@ -0,0 +1,5 @@
protocol "Garnet_standalone";
include "RubySlicc_interfaces.slicc";
include "Garnet_standalone-msg.sm";
include "Garnet_standalone-cache.sm";
include "Garnet_standalone-dir.sm";

View file

@ -1,5 +0,0 @@
protocol "Network_test";
include "RubySlicc_interfaces.slicc";
include "Network_test-msg.sm";
include "Network_test-cache.sm";
include "Network_test-dir.sm";

View file

@ -44,7 +44,7 @@ all_protocols.extend([
'MOESI_CMP_directory', 'MOESI_CMP_directory',
'MOESI_CMP_token', 'MOESI_CMP_token',
'MOESI_hammer', 'MOESI_hammer',
'Network_test', 'Garnet_standalone',
'None' 'None'
]) ])

View file

@ -142,7 +142,7 @@ GPUCoalescer::GPUCoalescer(const Params *p)
m_data_cache_hit_latency = p->dcache_hit_latency; m_data_cache_hit_latency = p->dcache_hit_latency;
m_usingNetworkTester = p->using_network_tester; m_runningGarnetStandalone = p->garnet_standalone;
assumingRfOCoherence = p->assume_rfo; assumingRfOCoherence = p->assume_rfo;
} }
@ -516,10 +516,10 @@ GPUCoalescer::writeCallback(Addr address,
// For Alpha, properly handle LL, SC, and write requests with respect to // For Alpha, properly handle LL, SC, and write requests with respect to
// locked cache blocks. // locked cache blocks.
// //
// Not valid for Network_test protocl // Not valid for Garnet_standalone protocl
// //
bool success = true; bool success = true;
if (!m_usingNetworkTester) if (!m_runningGarnetStandalone)
success = handleLlsc(address, request); success = handleLlsc(address, request);
if (request->m_type == RubyRequestType_Locked_RMW_Read) { if (request->m_type == RubyRequestType_Locked_RMW_Read) {

View file

@ -291,7 +291,7 @@ class GPUCoalescer : public RubyPort
int m_load_waiting_on_store_cycles; int m_load_waiting_on_store_cycles;
int m_load_waiting_on_load_cycles; int m_load_waiting_on_load_cycles;
bool m_usingNetworkTester; bool m_runningGarnetStandalone;
class GPUCoalescerWakeupEvent : public Event class GPUCoalescerWakeupEvent : public Event
{ {

View file

@ -71,7 +71,7 @@ Sequencer::Sequencer(const Params *p)
assert(m_data_cache_hit_latency > 0); assert(m_data_cache_hit_latency > 0);
assert(m_inst_cache_hit_latency > 0); assert(m_inst_cache_hit_latency > 0);
m_usingNetworkTester = p->using_network_tester; m_runningGarnetStandalone = p->garnet_standalone;
} }
Sequencer::~Sequencer() Sequencer::~Sequencer()
@ -386,10 +386,10 @@ Sequencer::writeCallback(Addr address, DataBlock& data,
// For Alpha, properly handle LL, SC, and write requests with respect to // For Alpha, properly handle LL, SC, and write requests with respect to
// locked cache blocks. // locked cache blocks.
// //
// Not valid for Network_test protocl // Not valid for Garnet_standalone protocl
// //
bool success = true; bool success = true;
if (!m_usingNetworkTester) if (!m_runningGarnetStandalone)
success = handleLlsc(address, request); success = handleLlsc(address, request);
// Handle SLICC block_on behavior for Locked_RMW accesses. NOTE: the // Handle SLICC block_on behavior for Locked_RMW accesses. NOTE: the

View file

@ -201,7 +201,7 @@ class Sequencer : public RubyPort
int m_coreId; int m_coreId;
bool m_usingNetworkTester; bool m_runningGarnetStandalone;
//! Histogram for number of outstanding requests per cycle. //! Histogram for number of outstanding requests per cycle.
Stats::Histogram m_outstandReqHist; Stats::Histogram m_outstandReqHist;

View file

@ -73,7 +73,7 @@ class RubySequencer(RubyPort):
"max requests (incl. prefetches) outstanding") "max requests (incl. prefetches) outstanding")
deadlock_threshold = Param.Cycles(500000, deadlock_threshold = Param.Cycles(500000,
"max outstanding cycles for a request before deadlock/livelock declared") "max outstanding cycles for a request before deadlock/livelock declared")
using_network_tester = Param.Bool(False, "") garnet_standalone = Param.Bool(False, "")
# id used by protocols that support multiple sequencers per controller # id used by protocols that support multiple sequencers per controller
# 99 is the dummy default value # 99 is the dummy default value
coreid = Param.Int(99, "CorePair core id") coreid = Param.Int(99, "CorePair core id")