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:
parent
3f0118876f
commit
aca869bf2d
13 changed files with 48 additions and 43 deletions
|
@ -1,3 +1,4 @@
|
|||
TARGET_ISA = 'alpha'
|
||||
SS_COMPATIBLE_FP = 1
|
||||
CPU_MODELS = 'AtomicSimpleCPU,TimingSimpleCPU,O3CPU,MinorCPU'
|
||||
PROTOCOL = 'Network_test'
|
||||
PROTOCOL = 'Garnet_standalone'
|
|
@ -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
|
|
@ -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) {
|
|
@ -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;
|
|
@ -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!");
|
||||
}
|
||||
}
|
5
src/mem/protocol/Garnet_standalone.slicc
Normal file
5
src/mem/protocol/Garnet_standalone.slicc
Normal 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";
|
|
@ -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";
|
|
@ -44,7 +44,7 @@ all_protocols.extend([
|
|||
'MOESI_CMP_directory',
|
||||
'MOESI_CMP_token',
|
||||
'MOESI_hammer',
|
||||
'Network_test',
|
||||
'Garnet_standalone',
|
||||
'None'
|
||||
])
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in a new issue