From 09c3a97a4c9aace6e2c52823679b31323cab42f6 Mon Sep 17 00:00:00 2001 From: Tushar Krishna Date: Mon, 21 Mar 2011 22:51:58 -0400 Subject: This patch adds the network tester for simple and garnet networks. The tester code is in testers/networktest. The tester can be invoked by configs/example/ruby_network_test.py. A dummy coherence protocol called Network_test is also addded for network-only simulations and testing. The protocol takes in messages from the tester and just pushes them into the network in the appropriate vnet, without storing any state. --- src/mem/ruby/network/garnet/BaseGarnetNetwork.cc | 1 - src/mem/ruby/network/garnet/BaseGarnetNetwork.hh | 3 +-- src/mem/ruby/network/garnet/BaseGarnetNetwork.py | 1 - .../ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc | 14 +++++++------- .../network/garnet/fixed-pipeline/NetworkInterface_d.cc | 9 +++------ .../network/garnet/flexible-pipeline/NetworkInterface.cc | 8 ++------ src/mem/ruby/system/Sequencer.cc | 8 +++++++- src/mem/ruby/system/Sequencer.hh | 2 ++ src/mem/ruby/system/Sequencer.py | 1 + 9 files changed, 23 insertions(+), 24 deletions(-) (limited to 'src/mem/ruby') diff --git a/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc b/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc index 3e5e1cbe8..19b4c3d04 100644 --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc +++ b/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc @@ -38,7 +38,6 @@ BaseGarnetNetwork::BaseGarnetNetwork(const Params *p) m_vcs_per_class = p->vcs_per_class; m_buffers_per_data_vc = p->buffers_per_data_vc; m_buffers_per_ctrl_vc = p->buffers_per_ctrl_vc; - m_using_network_testing = p->using_network_testing; } void diff --git a/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh b/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh index 4a1856e43..d01225232 100644 --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh +++ b/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh @@ -36,6 +36,7 @@ #ifndef __MEM_RUBY_NETWORK_GARNET_BASEGARNETNETWORK_HH__ #define __MEM_RUBY_NETWORK_GARNET_BASEGARNETNETWORK_HH__ +#include "math.h" #include "mem/ruby/network/garnet/NetworkHeader.hh" #include "mem/ruby/network/Network.hh" #include "params/BaseGarnetNetwork.hh" @@ -47,7 +48,6 @@ class BaseGarnetNetwork : public Network BaseGarnetNetwork(const Params *p); void init(); - bool isNetworkTesting() {return m_using_network_testing; } int getFlitSize() {return m_flit_size; } int getNumPipeStages() {return m_number_of_pipe_stages; } int getVCsPerClass() {return m_vcs_per_class; } @@ -60,7 +60,6 @@ class BaseGarnetNetwork : public Network int m_vcs_per_class; int m_buffers_per_data_vc; int m_buffers_per_ctrl_vc; - bool m_using_network_testing; }; #endif // __MEM_RUBY_NETWORK_GARNET_BASEGARNETNETWORK_HH__ diff --git a/src/mem/ruby/network/garnet/BaseGarnetNetwork.py b/src/mem/ruby/network/garnet/BaseGarnetNetwork.py index 44b6bd149..3594e93b6 100644 --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.py +++ b/src/mem/ruby/network/garnet/BaseGarnetNetwork.py @@ -39,4 +39,3 @@ class BaseGarnetNetwork(RubyNetwork): vcs_per_class = Param.Int(4, "virtual channels per message class"); buffers_per_data_vc = Param.Int(4, "buffers per data virtual channel"); buffers_per_ctrl_vc = Param.Int(1, "buffers per ctrl virtual channel"); - using_network_testing = Param.Bool(False, "network testing enable"); diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc index dbfabc8f1..f0b8ccce7 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc @@ -307,15 +307,15 @@ GarnetNetwork_d::printStats(ostream& out) const } out << "-------------" << endl; - // out << "Total flits injected = " << m_flits_injected << endl; - // out << "Total flits received = " << m_flits_received << endl; + out << "Total flits injected = " << m_flits_injected << endl; + out << "Total flits received = " << m_flits_received << endl; out << "Average network latency = " << ((double) m_network_latency/ (double) m_flits_received)<< endl; - // out << "Average queueing latency = " - // << ((double) m_queueing_latency/ (double) m_flits_received)<< endl; - // out << "Average latency = " - // << ((double) (m_queueing_latency + m_network_latency) / - // (double) m_flits_received)<< endl; + out << "Average queueing (at source NI) latency = " + << ((double) m_queueing_latency/ (double) m_flits_received)<< endl; + out << "Average latency = " + << ((double) (m_queueing_latency + m_network_latency) / + (double) m_flits_received)<< endl; out << "-------------" << endl; double m_total_link_power = 0.0; diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc index 8299a294f..14105a38c 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc @@ -241,12 +241,9 @@ NetworkInterface_d::wakeup() bool free_signal = false; if (t_flit->get_type() == TAIL_ || t_flit->get_type() == HEAD_TAIL_) { free_signal = true; - // When we are doing network only testing, the messages do not - // have to be buffered into the protocol buffers - if (!m_net_ptr->isNetworkTesting()) { - outNode_ptr[t_flit->get_vnet()]-> - enqueue(t_flit->get_msg_ptr(), 1); - } + + outNode_ptr[t_flit->get_vnet()]->enqueue( + t_flit->get_msg_ptr(), 1); } // Simply send a credit back since we are not buffering // this flit in the NI diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc index afc841a1b..60ec09e58 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc @@ -262,12 +262,8 @@ NetworkInterface::wakeup() DPRINTF(RubyNetwork, "m_id: %d, Message delivered at time: %lld\n", m_id, g_eventQueue_ptr->getTime()); - // When we are doing network only testing, the messages do not - // have to be buffered into the message buffers of the protocol - if (!m_net_ptr->isNetworkTesting()) { - outNode_ptr[t_flit->get_vnet()]->enqueue( - t_flit->get_msg_ptr(), 1); - } + outNode_ptr[t_flit->get_vnet()]->enqueue( + t_flit->get_msg_ptr(), 1); // signal the upstream router that this vc can be freed now inNetLink->release_vc_link(t_flit->get_vc(), diff --git a/src/mem/ruby/system/Sequencer.cc b/src/mem/ruby/system/Sequencer.cc index 6b0f6e49f..a5f1a06fa 100644 --- a/src/mem/ruby/system/Sequencer.cc +++ b/src/mem/ruby/system/Sequencer.cc @@ -77,6 +77,8 @@ Sequencer::Sequencer(const Params *p) assert(m_deadlock_threshold > 0); assert(m_instCache_ptr != NULL); assert(m_dataCache_ptr != NULL); + + m_usingNetworkTester = p->using_network_tester; } Sequencer::~Sequencer() @@ -390,7 +392,11 @@ Sequencer::writeCallback(const Address& address, // For Alpha, properly handle LL, SC, and write requests with respect to // locked cache blocks. // - bool success = handleLlsc(address, request); + // Not valid for Network_test protocl + // + bool success = true; + if(!m_usingNetworkTester) + success = handleLlsc(address, request); if (request->ruby_request.type == RubyRequestType_Locked_RMW_Read) { m_controller->blockOnQueue(address, m_mandatory_q_ptr); diff --git a/src/mem/ruby/system/Sequencer.hh b/src/mem/ruby/system/Sequencer.hh index 14b6997e8..ff3a0d5b1 100644 --- a/src/mem/ruby/system/Sequencer.hh +++ b/src/mem/ruby/system/Sequencer.hh @@ -152,6 +152,8 @@ class Sequencer : public RubyPort, public Consumer int m_load_waiting_on_store_cycles; int m_load_waiting_on_load_cycles; + bool m_usingNetworkTester; + class SequencerWakeupEvent : public Event { private: diff --git a/src/mem/ruby/system/Sequencer.py b/src/mem/ruby/system/Sequencer.py index f6d847e10..16fb795f8 100644 --- a/src/mem/ruby/system/Sequencer.py +++ b/src/mem/ruby/system/Sequencer.py @@ -40,6 +40,7 @@ class RubyPort(MemObject): physmem = Param.PhysicalMemory("") physMemPort = Port("port to physical memory") using_ruby_tester = Param.Bool(False, "") + using_network_tester = Param.Bool(False, "") access_phys_mem = Param.Bool(True, "should the rubyport atomically update phys_mem") -- cgit v1.2.3