⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trouter.cpp

📁 noxim系统的软件实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	      max_free_slots = free_slots;	      best_dirs.clear();	      best_dirs.push_back(directions[i]);	    }	  else if (free_slots == max_free_slots)	    best_dirs.push_back(directions[i]);	}    }  if (best_dirs.size())    return(best_dirs[rand() % best_dirs.size()]);  else    return(directions[rand() % directions.size()]);  //-------------------------  // TODO: unfair if multiple directions have same buffer level  // TODO: to check when both available//   unsigned int max_free_slots = 0;//   int direction_choosen = NOT_VALID;//   for (unsigned int i=0;i<directions.size();i++)//     {//       int free_slots = free_slots_neighbor[directions[i]].read();//       if ((free_slots >= max_free_slots) &&// 	  (reservation_table.isAvailable(directions[i])))// 	{// 	  direction_choosen = directions[i];// 	  max_free_slots = free_slots;// 	}//     }//   // No available channel //   if (direction_choosen==NOT_VALID)//     direction_choosen = directions[rand() % directions.size()]; //   if(TGlobalParams::verbose_mode>VERBOSE_OFF)//     {//       TChannelStatus tmp;//       cout << sc_time_stamp().to_double()/1000 << ": Router[" << local_id << "] SELECTION between: " << endl;//       for (unsigned int i=0;i<directions.size();i++)// 	{// 	  tmp.free_slots = free_slots_neighbor[directions[i]].read();// 	  tmp.available = (reservation_table.isAvailable(directions[i]));// 	  cout << "    -> direction " << directions[i] << ", channel status: " << tmp << endl;// 	}//       cout << " direction choosen: " << direction_choosen << endl;//     }//   assert(direction_choosen>=0);//   return direction_choosen;}//---------------------------------------------------------------------------int TRouter::selectionRandom(const vector<int>& directions){  return directions[rand() % directions.size()]; }//---------------------------------------------------------------------------int TRouter::selectionFunction(const vector<int>& directions, const TRouteData& route_data){  // not so elegant but fast escape ;)  if (directions.size()==1) return directions[0];    stats.power.Selection();  switch (TGlobalParams::selection_strategy)    {    case SEL_RANDOM:      return selectionRandom(directions);    case SEL_BUFFER_LEVEL:      return selectionBufferLevel(directions);    case SEL_NOP:      return selectionNoP(directions,route_data);    default:      assert(false);    }    return 0;	    }//---------------------------------------------------------------------------vector<int> TRouter::routingXY(const TCoord& current, const TCoord& destination){  vector<int> directions;    if (destination.x > current.x)    directions.push_back(DIRECTION_EAST);  else if (destination.x < current.x)    directions.push_back(DIRECTION_WEST);  else if (destination.y > current.y)    directions.push_back(DIRECTION_SOUTH);  else    directions.push_back(DIRECTION_NORTH);  return directions;}//---------------------------------------------------------------------------vector<int> TRouter::routingWestFirst(const TCoord& current, const TCoord& destination){  vector<int> directions;  if (destination.x <= current.x ||      destination.y == current.y)    return routingXY(current, destination);  if (destination.y < current.y)    {      directions.push_back(DIRECTION_NORTH);      directions.push_back(DIRECTION_EAST);    }  else    {      directions.push_back(DIRECTION_SOUTH);      directions.push_back(DIRECTION_EAST);    }  return directions;}//---------------------------------------------------------------------------vector<int> TRouter::routingNorthLast(const TCoord& current, const TCoord& destination){  vector<int> directions;  if (destination.x == current.x ||      destination.y <= current.y)    return routingXY(current, destination);  if (destination.x < current.x)    {      directions.push_back(DIRECTION_SOUTH);      directions.push_back(DIRECTION_WEST);    }  else    {      directions.push_back(DIRECTION_SOUTH);      directions.push_back(DIRECTION_EAST);    }  return directions;}//---------------------------------------------------------------------------vector<int> TRouter::routingNegativeFirst(const TCoord& current, const TCoord& destination){  vector<int> directions;  if ( (destination.x <= current.x && destination.y <= current.y) ||       (destination.x >= current.x && destination.y >= current.y) )    return routingXY(current, destination);  if (destination.x > current.x &&       destination.y < current.y)    {      directions.push_back(DIRECTION_NORTH);      directions.push_back(DIRECTION_EAST);    }  else    {      directions.push_back(DIRECTION_SOUTH);      directions.push_back(DIRECTION_WEST);    }  return directions;}//---------------------------------------------------------------------------vector<int> TRouter::routingOddEven(const TCoord& current, 				    const TCoord& source, const TCoord& destination){  vector<int> directions;  int c0 = current.x;  int c1 = current.y;  int s0 = source.x;  //  int s1 = source.y;  int d0 = destination.x;  int d1 = destination.y;  int e0, e1;  e0 = d0 - c0;  e1 = -(d1 - c1);  if (e0 == 0)    {      if (e1 > 0)	directions.push_back(DIRECTION_NORTH);      else	directions.push_back(DIRECTION_SOUTH);    }  else    {      if (e0 > 0)	{	  if (e1 == 0)	    directions.push_back(DIRECTION_EAST);	  else	    {	      if ( (c0 % 2 == 1) || (c0 == s0) )		{		  if (e1 > 0)		    directions.push_back(DIRECTION_NORTH);		  else		    directions.push_back(DIRECTION_SOUTH);		}	      if ( (d0 % 2 == 1) || (e0 != 1) )		directions.push_back(DIRECTION_EAST);	    }	}      else	{	  directions.push_back(DIRECTION_WEST);	  if (c0 % 2 == 0)	    {	      if (e1 > 0)		directions.push_back(DIRECTION_NORTH);	      if (e1 < 0) 		directions.push_back(DIRECTION_SOUTH);	    }	}    }    if (!(directions.size() > 0 && directions.size() <= 2))  {      cout << "\n STAMPACCHIO :";      cout << source << endl;      cout << destination << endl;      cout << current << endl;  }  assert(directions.size() > 0 && directions.size() <= 2);    return directions;}//---------------------------------------------------------------------------vector<int> TRouter::routingDyAD(const TCoord& current, 				 const TCoord& source, const TCoord& destination){  vector<int> directions;  directions = routingOddEven(current, source, destination);  if (!inCongestion())    directions.resize(1);    return directions;}//---------------------------------------------------------------------------vector<int> TRouter::routingFullyAdaptive(const TCoord& current, const TCoord& destination){  vector<int> directions;  if (destination.x == current.x ||      destination.y == current.y)    return routingXY(current, destination);  if (destination.x > current.x &&      destination.y < current.y)    {      directions.push_back(DIRECTION_NORTH);      directions.push_back(DIRECTION_EAST);    }  else if (destination.x > current.x &&	   destination.y > current.y)    {      directions.push_back(DIRECTION_SOUTH);      directions.push_back(DIRECTION_EAST);    }  else if (destination.x < current.x &&	   destination.y > current.y)    {      directions.push_back(DIRECTION_SOUTH);      directions.push_back(DIRECTION_WEST);    }  else    {      directions.push_back(DIRECTION_NORTH);      directions.push_back(DIRECTION_WEST);    }    return directions;}//---------------------------------------------------------------------------vector<int> TRouter::routingTableBased(const int dir_in, const TCoord& current, const TCoord& destination){  TAdmissibleOutputs ao = routing_table.getAdmissibleOutputs(dir_in, coord2Id(destination));    if (ao.size() == 0)    {      cout << "dir: " << dir_in << ", (" << current.x << "," << current.y << ") --> "	   << "(" << destination.x << "," << destination.y << ")" << endl	   << coord2Id(current) << "->" << coord2Id(destination) << endl;    }  assert(ao.size() > 0);  //-----  /*  vector<int> aov = admissibleOutputsSet2Vector(ao);  cout << "dir: " << dir_in << ", (" << current.x << "," << current.y << ") --> "       << "(" << destination.x << "," << destination.y << "), outputs: ";  for (int i=0; i<aov.size(); i++)    cout << aov[i] << ", ";  cout << endl;  */  //-----  return admissibleOutputsSet2Vector(ao);}//---------------------------------------------------------------------------void TRouter::configure(const int _id, 			const double _warm_up_time,			const unsigned int _max_buffer_size,			TGlobalRoutingTable& grt){  local_id = _id;  stats.configure(_id, _warm_up_time);  start_from_port = DIRECTION_LOCAL;  if (grt.isValid())    routing_table.configure(grt, _id);  for (int i=0; i<DIRECTIONS+1; i++)    buffer[i].SetMaxBufferSize(_max_buffer_size);}//---------------------------------------------------------------------------unsigned long TRouter::getRoutedFlits(){   return routed_flits; }//---------------------------------------------------------------------------unsigned int TRouter::getFlitsCount(){  unsigned count = 0;  for (int i=0; i<DIRECTIONS+1; i++)    count += buffer[i].Size();  return count;}//---------------------------------------------------------------------------double TRouter::getPower(){  return stats.power.getPower();}//---------------------------------------------------------------------------int TRouter::reflexDirection(int direction) const{    if (direction == DIRECTION_NORTH) return DIRECTION_SOUTH;    if (direction == DIRECTION_EAST) return DIRECTION_WEST;    if (direction == DIRECTION_WEST) return DIRECTION_EAST;    if (direction == DIRECTION_SOUTH) return DIRECTION_NORTH;    // you shouldn't be here    assert(false);    return NOT_VALID;}//---------------------------------------------------------------------------int TRouter::getNeighborId(int _id, int direction) const{    TCoord my_coord = id2Coord(_id);    switch (direction)    {	case DIRECTION_NORTH:	    if (my_coord.y==0) return NOT_VALID;	    my_coord.y--;	    break;	case DIRECTION_SOUTH:	    if (my_coord.y==TGlobalParams::mesh_dim_y-1) return NOT_VALID;	    my_coord.y++;	    break;	case DIRECTION_EAST:	    if (my_coord.x==TGlobalParams::mesh_dim_x-1) return NOT_VALID;	    my_coord.x++;	    break;	case DIRECTION_WEST:	    if (my_coord.x==0) return NOT_VALID;	    my_coord.x--;	    break;	default:	    cout << "direction not valid : " << direction;	    assert(false);    }    int neighbor_id = coord2Id(my_coord);  return neighbor_id;}//---------------------------------------------------------------------------bool TRouter::inCongestion(){  for (int i=0; i<DIRECTIONS; i++)    {      int flits = TGlobalParams::buffer_depth - free_slots_neighbor[i];      if (flits > (int)(TGlobalParams::buffer_depth * TGlobalParams::dyad_threshold))	return true;    }  return false;}//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -