📄 trouter.cpp
字号:
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 + -