From 69f2911e04ffb1b19eef1fafb8c040af271f656e Mon Sep 17 00:00:00 2001 From: Tor Aamodt Date: Thu, 15 Jul 2010 18:09:46 -0800 Subject: creating branch for adding support for CUDA 3.x and Fermi [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 6829] --- src/intersim/network.cpp | 156 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/intersim/network.cpp (limited to 'src/intersim/network.cpp') diff --git a/src/intersim/network.cpp b/src/intersim/network.cpp new file mode 100644 index 0000000..48c07b4 --- /dev/null +++ b/src/intersim/network.cpp @@ -0,0 +1,156 @@ +#include "booksim.hpp" +#include "interconnect_interface.h" +#include + +#include "network.hpp" + +int gK = 0; +int gN = 0; +int gNodes = 0; + +Network::Network( const Configuration &config ) : +Module( 0, "network" ) +{ + _size = -1; + _sources = -1; + _dests = -1; + _channels = -1; +} + +Network::~Network( ) +{ + for ( int r = 0; r < _size; ++r ) { + delete _routers[r]; + } + + delete [] _routers; + + delete [] _inject; + delete [] _eject; + delete [] _chan; + + delete [] _chan_use; + + delete [] _inject_cred; + delete [] _eject_cred; + delete [] _chan_cred; +} + +void Network::_Alloc( ) +{ + assert( ( _size != -1 ) && + ( _sources != -1 ) && + ( _dests != -1 ) && + ( _channels != -1 ) ); + + _routers = new Router * [_size]; + gNodes = _sources; + + _inject = new Flit * [_sources]; + _eject = new Flit * [_dests]; + _chan = new Flit * [_channels]; + + _chan_use = new int [_channels]; + + for ( int i = 0; i < _channels; ++i ) { + _chan_use[i] = 0; + } + + _chan_use_cycles = 0; + + _inject_cred = new Credit * [_sources]; + _eject_cred = new Credit * [_dests]; + _chan_cred = new Credit * [_channels]; +} + +int Network::NumSources( ) const +{ + return _sources; +} + +int Network::NumDests( ) const +{ + return _dests; +} + +void Network::ReadInputs( ) +{ + for ( int r = 0; r < _size; ++r ) { + _routers[r]->ReadInputs( ); + } +} + +void Network::InternalStep( ) +{ + for ( int r = 0; r < _size; ++r ) { + _routers[r]->InternalStep( ); + } +} + +void Network::WriteOutputs( ) +{ + for ( int r = 0; r < _size; ++r ) { + _routers[r]->WriteOutputs( ); + } + + for ( int c = 0; c < _channels; ++c ) { + if ( _chan[c] ) { + _chan_use[c]++; + } + } + _chan_use_cycles++; +} + +void Network::WriteFlit( Flit *f, int source ) +{ + assert( ( source >= 0 ) && ( source < _sources ) ); + _inject[source] = f; +} + +Flit *Network::ReadFlit( int dest ) +{ + assert( ( dest >= 0 ) && ( dest < _dests ) ); + return _eject[dest]; +} + +void Network::WriteCredit( Credit *c, int dest ) +{ + assert( ( dest >= 0 ) && ( dest < _dests ) ); + _eject_cred[dest] = c; +} + +Credit *Network::ReadCredit( int source ) +{ + assert( ( source >= 0 ) && ( source < _sources ) ); + return _inject_cred[source]; +} + +void Network::InsertRandomFaults( const Configuration &config ) +{ + Error( "InsertRandomFaults not implemented for this topology!" ); +} + +void Network::OutChannelFault( int r, int c, bool fault ) +{ + assert( ( r >= 0 ) && ( r < _size ) ); + _routers[r]->OutChannelFault( c, fault ); +} + +double Network::Capacity( ) const +{ + return 1.0; +} + +void Network::Display( ) const +{ + for ( int r = 0; r < _size; ++r ) { + _routers[r]->Display( ); + } +// if (icnt_config.GetInt("blah") ) { + for ( int c = 0; c < _channels; ++c ) { + cout << "channel " << c << " used " + << 100.0 * (double)_chan_use[c] / (double)_chan_use_cycles + << "% of the time" << endl; + } + // } +} -- cgit v1.3