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
|
SS_COMPATIBLE_FP = 1
|
||||||
CPU_MODELS = 'AtomicSimpleCPU,TimingSimpleCPU,O3CPU,MinorCPU'
|
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) 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
|
|
@ -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));
|
||||||
|
|
||||||
|
// 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.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) {
|
|
@ -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;
|
|
@ -42,10 +42,10 @@ structure(RequestMsg, desc="...", interface="Message") {
|
||||||
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!");
|
||||||
}
|
}
|
||||||
}
|
}
|
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_directory',
|
||||||
'MOESI_CMP_token',
|
'MOESI_CMP_token',
|
||||||
'MOESI_hammer',
|
'MOESI_hammer',
|
||||||
'Network_test',
|
'Garnet_standalone',
|
||||||
'None'
|
'None'
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Reference in a new issue