Пример #1
0
void KNCube::_BuildNet( const Configuration &config )
{
   int left_node;
   int right_node;

   int right_input;
   int left_input;

   int right_output;
   int left_output;

   ostringstream router_name;

   for ( int node = 0; node < _size; ++node ) {

      router_name << "router";

      for ( int dim_offset = _size / _k; dim_offset >= 1; dim_offset /= _k ) {
         router_name << "_" << ( node / dim_offset ) % _k;
      }

      _routers[node] = Router_gpgpu::NewRouter( config, this, router_name.str( ), 
                                          node, 2*_n + 1, 2*_n + 1 );

      router_name.seekp( 0, ios::beg );

      for ( int dim = 0; dim < _n; ++dim ) {

         left_node  = _LeftNode( node, dim );
         right_node = _RightNode( node, dim );

         //
         // Current (N)ode
         // (L)eft node
         // (R)ight node
         //
         //   L--->N<---R
         //   L<---N--->R
         //

         right_input = _LeftChannel( right_node, dim );
         left_input  = _RightChannel( left_node, dim );

         _routers[node]->AddInputChannel( &_chan[right_input], &_chan_cred[right_input] );
         _routers[node]->AddInputChannel( &_chan[left_input], &_chan_cred[left_input] );

         right_output = _RightChannel( node, dim );
         left_output  = _LeftChannel( node, dim );

         _routers[node]->AddOutputChannel( &_chan[right_output], &_chan_cred[right_output] );
         _routers[node]->AddOutputChannel( &_chan[left_output], &_chan_cred[left_output] );
      }

      _routers[node]->AddInputChannel( &_inject[node], &_inject_cred[node] );
      _routers[node]->AddOutputChannel( &_eject[node], &_eject_cred[node] );
   }
}
Пример #2
0
void KNCube::_BuildNet( const Configuration &config )
{
  int left_node;
  int right_node;

  int right_input;
  int left_input;

  int right_output;
  int left_output;

  ostringstream router_name;

  //latency type, noc or conventional network
  bool use_noc_latency;
  use_noc_latency = (config.GetInt("use_noc_latency")==1);
  
  for ( int node = 0; node < _size; ++node ) {

    router_name << "router";
    
    for ( int dim_offset = _size / _k; dim_offset >= 1; dim_offset /= _k ) {
      router_name << "_" << ( node / dim_offset ) % _k;
    }

    _routers[node] = Router::NewRouter( config, this, router_name.str( ), 
					node, 2*_n + 1, 2*_n + 1 );
    _timed_modules.push_back(_routers[node]);

    router_name.str("");

    for ( int dim = 0; dim < _n; ++dim ) {

      //find the neighbor 
      left_node  = _LeftNode( node, dim );
      right_node = _RightNode( node, dim );

      //
      // Current (N)ode
      // (L)eft node
      // (R)ight node
      //
      //   L--->N<---R
      //   L<---N--->R
      //

      // torus channel is longer due to wrap around
      int latency = _mesh ? 1 : 2 ;

      //get the input channel number
      right_input = _LeftChannel( right_node, dim );
      left_input  = _RightChannel( left_node, dim );

      //add the input channel
      _routers[node]->AddInputChannel( _chan[right_input], _chan_cred[right_input] );
      _routers[node]->AddInputChannel( _chan[left_input], _chan_cred[left_input] );

      //set input channel latency
      if(use_noc_latency){
	_chan[right_input]->SetLatency( latency );
	_chan[left_input]->SetLatency( latency );
	_chan_cred[right_input]->SetLatency( latency );
	_chan_cred[left_input]->SetLatency( latency );
      } else {
	_chan[left_input]->SetLatency( 1 );
	_chan_cred[right_input]->SetLatency( 1 );
	_chan_cred[left_input]->SetLatency( 1);
	_chan[right_input]->SetLatency( 1 );
      }
      //get the output channel number
      right_output = _RightChannel( node, dim );
      left_output  = _LeftChannel( node, dim );
      
      //add the output channel
      _routers[node]->AddOutputChannel( _chan[right_output], _chan_cred[right_output] );
      _routers[node]->AddOutputChannel( _chan[left_output], _chan_cred[left_output] );

      //set output channel latency
      if(use_noc_latency){
	_chan[right_output]->SetLatency( latency );
	_chan[left_output]->SetLatency( latency );
	_chan_cred[right_output]->SetLatency( latency );
	_chan_cred[left_output]->SetLatency( latency );
      } else {
	_chan[right_output]->SetLatency(1);
	_chan[left_output]->SetLatency(1 );
	_chan_cred[right_output]->SetLatency(1 );
	_chan_cred[left_output]->SetLatency( 1);

      }
    }
    //injection and ejection channel, always 1 latency
    _routers[node]->AddInputChannel( _inject[node], _inject_cred[node] );
    _routers[node]->AddOutputChannel( _eject[node], _eject_cred[node] );
    _inject[node]->SetLatency( 1 );
    _eject[node]->SetLatency( 1 );
  }
}