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
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) 2016 Georgia Institute of Technology
# All rights reserved.
#
# 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.
#
# Authors: Brad Beckmann
# Tushar Krishna
import m5
from m5.objects import *
@ -42,22 +43,21 @@ def define_options(parser):
return
def create_system(options, full_system, system, dma_ports, ruby_system):
if buildEnv['PROTOCOL'] != 'Network_test':
panic("This script requires the Network_test protocol to be built.")
if buildEnv['PROTOCOL'] != 'Garnet_standalone':
panic("This script requires Garnet_standalone protocol to be built.")
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 == [])
#
# 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
# listed before the directory nodes and directory nodes before dma nodes, etc.
#
# consistent with the NetDest list.
# Therefore the l1 controller nodes must be listed before
# the directory nodes and directory nodes before dma nodes, etc.
l1_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,
dcache = cache,
using_network_tester = True,
garnet_standalone = True,
ruby_system = ruby_system)
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;
Cycles issue_latency := 2;
@ -53,9 +53,9 @@ machine(MachineType:L1Cache, "Network_test L1 Cache")
// EVENTS
enumeration(Event, desc="Cache events") {
// From processor
Request, desc="Request from Network_test";
Forward, desc="Forward from Network_test";
Response, desc="Response from Network_test";
Request, desc="Request from Garnet_standalone";
Forward, desc="Forward from Garnet_standalone";
Response, desc="Response from Garnet_standalone";
}
// STRUCTURE DEFINITIONS
@ -74,7 +74,7 @@ machine(MachineType:L1Cache, "Network_test L1 Cache")
// ReadReq, INST_FETCH, and WriteReq.
// 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.
// 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
// virtual networks 0, 1 and 2 respectively.
// 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) {
error("Network test does not support functional read.");
error("Garnet_standalone does not support functional read.");
}
int functionalWrite(Addr addr, Packet *pkt) {
error("Network test does not support functional write.");
error("Garnet_standalone does not support functional write.");
}
// NETWORK PORTS
@ -149,7 +149,11 @@ machine(MachineType:L1Cache, "Network_test L1 Cache")
out_msg.Type := CoherenceRequestType:MSG;
out_msg.Requestor := machineID;
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;
}
}
@ -190,7 +194,7 @@ machine(MachineType:L1Cache, "Network_test L1 Cache")
// TRANSITIONS
// 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.
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",
vnet_type = "request";
MessageBuffer * forwardToDir, network="From", virtual_network="1",
@ -79,11 +79,11 @@ machine(MachineType:Directory, "Network_test Directory")
}
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) {
error("Network test does not support functional write.");
error("Garnet_standalone does not support functional write.");
}
// ** IN_PORTS **
@ -139,7 +139,7 @@ machine(MachineType:Directory, "Network_test Directory")
// TRANSITIONS
// 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) {
i_popIncomingRequestQueue;

View File

@ -34,18 +34,18 @@ enumeration(CoherenceRequestType, desc="...") {
// RequestMsg (and also forwarded requests)
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)";
MachineID Requestor, desc="Node who initiated the request";
NetDest Destination, desc="Multicast destination mask";
MachineID Requestor, desc="Node who initiated the request";
NetDest Destination, desc="Multicast destination mask";
DataBlock DataBlk, desc="data for the cache line";
MessageSizeType MessageSize, desc="size category of the message";
bool functionalRead(Packet *pkt) {
error("Network test does not support functional accesses!");
error("Garnet_standalone does not support functional accesses!");
}
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_token',
'MOESI_hammer',
'Network_test',
'Garnet_standalone',
'None'
])

View File

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

View File

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

View File

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

View File

@ -73,7 +73,7 @@ class RubySequencer(RubyPort):
"max requests (incl. prefetches) outstanding")
deadlock_threshold = Param.Cycles(500000,
"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
# 99 is the dummy default value
coreid = Param.Int(99, "CorePair core id")