Packet ProcessingElement::trafficLocal() { Packet p; p.src_id = local_id; double rnd = rand() / (double) RAND_MAX; vector<int> dst_set; int max_id = (GlobalParams::mesh_dim_x * GlobalParams::mesh_dim_y); for (int i=0;i<max_id;i++) { if (rnd<=GlobalParams::locality) { if (local_id!=i && sameRadioHub(local_id,i)) dst_set.push_back(i); } else if (!sameRadioHub(local_id,i)) dst_set.push_back(i); } int i_rnd = rand()%dst_set.size(); p.dst_id = dst_set[i_rnd]; p.timestamp = sc_time_stamp().to_double() / GlobalParams::clock_period_ps; p.size = p.flit_left = getRandomSize(); return p; }
bool ProcessingElement::canShot(Packet & packet) { bool shot; double threshold; double now = sc_time_stamp().to_double() / GlobalParams::clock_period_ps; if (GlobalParams::traffic_distribution != TRAFFIC_TABLE_BASED) { if (!transmittedAtPreviousCycle) threshold = GlobalParams::packet_injection_rate; else threshold = GlobalParams::probability_of_retransmission; double prob_rand = ((double) rand()) / RAND_MAX; shot = (prob_rand < threshold); if (shot) { if (GlobalParams::traffic_distribution == TRAFFIC_RANDOM) packet = trafficRandom(); else if (GlobalParams::traffic_distribution == TRAFFIC_TRANSPOSE1) packet = trafficTranspose1(); else if (GlobalParams::traffic_distribution == TRAFFIC_TRANSPOSE2) packet = trafficTranspose2(); else if (GlobalParams::traffic_distribution == TRAFFIC_BIT_REVERSAL) packet = trafficBitReversal(); else if (GlobalParams::traffic_distribution == TRAFFIC_SHUFFLE) packet = trafficShuffle(); else if (GlobalParams::traffic_distribution == TRAFFIC_BUTTERFLY) packet = trafficButterfly(); else if (GlobalParams::traffic_distribution == TRAFFIC_LOCAL) packet = trafficLocal(); else assert(false); } } else { // Table based communication traffic if (never_transmit) return false; bool use_pir = (transmittedAtPreviousCycle == false); vector < pair < int, double > > dst_prob; double threshold = traffic_table->getCumulativePirPor(local_id, (int) now, use_pir, dst_prob); double prob = (double) rand() / RAND_MAX; shot = (prob < threshold); if (shot) { for (unsigned int i = 0; i < dst_prob.size(); i++) { if (prob < dst_prob[i].second) { packet.make(local_id, dst_prob[i].first, now, getRandomSize()); break; } } } } return shot; }
// TODO: for testing only Packet ProcessingElement::trafficTest() { Packet p; p.src_id = local_id; p.dst_id = 10; p.timestamp = sc_time_stamp().to_double() / GlobalParams::clock_period_ps; p.size = p.flit_left = getRandomSize(); return p; }
TPacket TProcessingElement::trafficBitReversal() { int nbits = (int)log2ceil((double)(TGlobalParams::mesh_dim_x*TGlobalParams::mesh_dim_y)); int dnode = 0; for (int i=0; i<nbits; i++) setBit(dnode, i, getBit(local_id, nbits-i-1)); TPacket p; p.src_id = local_id; p.dst_id = dnode; p.timestamp = sc_time_stamp().to_double()/1000; p.size = p.flit_left = getRandomSize(); return p; }
Packet ProcessingElement::trafficTranspose2() { Packet p; p.src_id = local_id; Coord src, dst; // Transpose 2 destination distribution src.x = id2Coord(p.src_id).x; src.y = id2Coord(p.src_id).y; dst.x = src.y; dst.y = src.x; fixRanges(src, dst); p.dst_id = coord2Id(dst); p.timestamp = sc_time_stamp().to_double() / GlobalParams::clock_period_ps; p.size = p.flit_left = getRandomSize(); return p; }
TPacket TProcessingElement::trafficTranspose1() { TPacket p; p.src_id = local_id; TCoord src,dst; // Transpose 1 destination distribution src.x = id2Coord(p.src_id).x; src.y = id2Coord(p.src_id).y; dst.x = TGlobalParams::mesh_dim_x-1-src.y; dst.y = TGlobalParams::mesh_dim_y-1-src.x; fixRanges(src, dst); p.dst_id = coord2Id(dst); p.timestamp = sc_time_stamp().to_double()/1000; p.size = p.flit_left = getRandomSize(); return p; }
Packet ProcessingElement::trafficRandom() { Packet p; p.src_id = local_id; double rnd = rand() / (double) RAND_MAX; double range_start = 0.0; int max_id = (GlobalParams::mesh_dim_x * GlobalParams::mesh_dim_y) - 1; // Random destination distribution do { double broadcast_rnd = rand() / (double) RAND_MAX; if (broadcast_rnd < GlobalParams::broadcast_probability) { /* send broadcast packet */ p.dst_id = -1; double path_rnd = rand() / (double) RAND_MAX; if (path_rnd < 0.5) p.path_dir = PATH_HORIZONTAL; else p.path_dir = PATH_VERTICAL; break; } p.dst_id = randInt(0, max_id); // check for hotspot destination for (size_t i = 0; i < GlobalParams::hotspots.size(); i++) { if (rnd >= range_start && rnd < range_start + GlobalParams::hotspots[i].second) { if (local_id != GlobalParams::hotspots[i].first) { p.dst_id = GlobalParams::hotspots[i].first; } break; } else { range_start += GlobalParams::hotspots[i].second; // try next } } } while (p.dst_id == p.src_id); p.timestamp = sc_time_stamp().to_double() / GlobalParams::clock_period_ps; p.size = p.flit_left = getRandomSize(); return p; }
NoximPacket NoximProcessingElement::trafficRandom() { int max_id = (NoximGlobalParams::mesh_dim_x * NoximGlobalParams::mesh_dim_y*NoximGlobalParams::mesh_dim_z) - 1; NoximPacket p; p.src_id = local_id; double rnd = rand() / (double) RAND_MAX; double range_start = 0.0; //cout << "\n " << getCurrentCycleNum() << " PE " << local_id << " rnd = " << rnd << endl; int re_transmit=1; // // Random destination distribution do { p.dst_id = randInt(0, max_id); // check for hotspot destination for (unsigned int i = 0; i < NoximGlobalParams::hotspots.size(); i++) { //cout << getCurrentCycleNum() << " PE " << local_id << " Checking node " << NoximGlobalParams::hotspots[i].first << " with P = " << NoximGlobalParams::hotspots[i].second << endl; if (rnd >= range_start && rnd < range_start + NoximGlobalParams::hotspots[i].second) { if (local_id != NoximGlobalParams::hotspots[i].first) { //cout << getCurrentCycleNum() << " PE " << local_id <<" That is ! " << endl; p.dst_id = NoximGlobalParams::hotspots[i].first; } break; } else range_start += NoximGlobalParams::hotspots[i].second; // try next } if (p.dst_id == p.src_id) re_transmit = 1; else re_transmit = 0; } while ((p.dst_id == p.src_id) || (re_transmit)); p.timestamp = sc_time_stamp().to_double() / 1000; p.size = p.flit_left = getRandomSize(); // if (p.src_id == p.dst_id) // cout << "Traffic generator has generated a packet is sent from a node to itself !!! \n"; return p; }
TPacket TProcessingElement::trafficRandom() { TPacket p; p.src_id = local_id; double rnd = rand()/(double)RAND_MAX; double range_start = 0.0; //cout << "\n " << sc_time_stamp().to_double()/1000 << " PE " << local_id << " rnd = " << rnd << endl; int max_id = (TGlobalParams::mesh_dim_x * TGlobalParams::mesh_dim_y)-1; // Random destination distribution do { p.dst_id = randInt(0, max_id); // check for hotspot destination for (uint i = 0; i<TGlobalParams::hotspots.size(); i++) { //cout << sc_time_stamp().to_double()/1000 << " PE " << local_id << " Checking node " << TGlobalParams::hotspots[i].first << " with P = " << TGlobalParams::hotspots[i].second << endl; if (rnd>=range_start && rnd < range_start + TGlobalParams::hotspots[i].second) { if (local_id != TGlobalParams::hotspots[i].first) { //cout << sc_time_stamp().to_double()/1000 << " PE " << local_id <<" That is ! " << endl; p.dst_id = TGlobalParams::hotspots[i].first; } break; } else range_start+=TGlobalParams::hotspots[i].second; // try next } } while(p.dst_id==p.src_id); p.timestamp = sc_time_stamp().to_double()/1000; p.size = p.flit_left = getRandomSize(); return p; }
Packet ProcessingElement::trafficShuffle() { int nbits = (int) log2ceil((double) (GlobalParams::mesh_dim_x * GlobalParams::mesh_dim_y)); int dnode = 0; for (int i = 0; i < nbits - 1; i++) setBit(dnode, i + 1, getBit(local_id, i)); setBit(dnode, 0, getBit(local_id, nbits - 1)); Packet p; p.src_id = local_id; p.dst_id = dnode; p.timestamp = sc_time_stamp().to_double() / GlobalParams::clock_period_ps; p.size = p.flit_left = getRandomSize(); return p; }
NoximPacket NoximProcessingElement::trafficBitReversal() { int nbits = (int)log2ceil( (double)(NoximGlobalParams::mesh_dim_x * NoximGlobalParams::mesh_dim_y * NoximGlobalParams::mesh_dim_z )); int dnode = 0; for (int i = 0; i < nbits; i++) setBit(dnode, i, getBit(local_id, nbits - i - 1)); NoximPacket p; p.src_id = local_id; p.dst_id = dnode; p.timestamp = sc_time_stamp().to_double() / 1000; p.size = p.flit_left = getRandomSize(); // if (p.src_id == p.dst_id) // cout << "Traffic generator has generated a packet is sent from a node to itself !!! \n"; return p; }
NoximPacket NoximProcessingElement::trafficTranspose2() { NoximPacket p; p.src_id = local_id; NoximCoord src, dst; // Transpose 2 destination distribution src = id2Coord(p.src_id); dst.x = src.y; dst.y = src.x; dst.z = src.z; fixRanges(src, dst); p.dst_id = coord2Id(dst); p.timestamp = sc_time_stamp().to_double() / 1000; p.size = p.flit_left = getRandomSize(); // if (p.src_id == p.dst_id) // cout << "Traffic generator has generated a packet is sent from a node to itself !!! \n"; return p; }
NoximPacket NoximProcessingElement::trafficButterfly() { int nbits = (int) log2ceil((double) (NoximGlobalParams::mesh_dim_x * NoximGlobalParams::mesh_dim_y)); int dnode = 0; for (int i = 1; i < nbits - 1; i++) setBit(dnode, i, getBit(local_id, i)); setBit(dnode, 0, getBit(local_id, nbits - 1)); setBit(dnode, nbits - 1, getBit(local_id, 0)); NoximPacket p; p.src_id = local_id; p.dst_id = dnode; p.timestamp = sc_time_stamp().to_double() / 1000; p.size = p.flit_left = getRandomSize(); return p; }
NoximPacket NoximProcessingElement::trafficOneDest() { NoximPacket p; p.src_id = local_id; // double rnd = rand() / (double) RAND_MAX; // double range_start = 0.0; // Destination Set to id=20 do { p.dst_id = 20; // check for hotspot destination //////// commented the hotspot mehanism /* for (uint i = 0; i < NoximGlobalParams::hotspots.size(); i++) { //cout << sc_time_stamp().to_double()/1000 << " PE " << local_id << " Checking node " << NoximGlobalParams::hotspots[i].first << " with P = " << NoximGlobalParams::hotspots[i].second << endl; if (rnd >= range_start && rnd < range_start + NoximGlobalParams::hotspots[i].second) { if (local_id != NoximGlobalParams::hotspots[i].first) { //cout << sc_time_stamp().to_double()/1000 << " PE " << local_id <<" That is ! " << endl; p.dst_id = NoximGlobalParams::hotspots[i].first; } break; } else range_start += NoximGlobalParams::hotspots[i].second; // try next } */ } while (p.dst_id == p.src_id); p.timestamp = sc_time_stamp().to_double() / 1000; p.size = p.flit_left = getRandomSize(); return p; }
bool NoximProcessingElement::canShot(NoximPacket & packet) { bool shot; double threshold; if (NoximGlobalParams::traffic_distribution != TRAFFIC_TABLE_BASED) { if (!transmittedAtPreviousCycle) threshold = NoximGlobalParams::packet_injection_rate; else threshold = NoximGlobalParams::probability_of_retransmission; shot = (((double) rand()) / RAND_MAX < threshold); if (shot) { switch (NoximGlobalParams::traffic_distribution) { case TRAFFIC_OneDest: //New Traffic: all to one (dest_id=20) packet = trafficOneDest(); break; case TRAFFIC_RANDOM: packet = trafficRandom(); break; case TRAFFIC_TRANSPOSE1: packet = trafficTranspose1(); break; case TRAFFIC_TRANSPOSE2: packet = trafficTranspose2(); break; case TRAFFIC_BIT_REVERSAL: packet = trafficBitReversal(); break; case TRAFFIC_SHUFFLE: packet = trafficShuffle(); break; case TRAFFIC_BUTTERFLY: packet = trafficButterfly(); break; default: assert(false); } } } else { // Table based communication traffic if (never_transmit) return false; double now = sc_time_stamp().to_double() / 1000; bool use_pir = (transmittedAtPreviousCycle == false); vector < pair < int, double > > dst_prob; double threshold = traffic_table->getCumulativePirPor(local_id, (int) now, use_pir, dst_prob); double prob = (double) rand() / RAND_MAX; shot = (prob < threshold); if (shot) { for (unsigned int i = 0; i < dst_prob.size(); i++) { if (prob < dst_prob[i].second) { // generate a new packet packet.make(local_id, dst_prob[i].first, 0, now, //vinu: i_d_i = 0 ; fixed getRandomSize()); break; } } } } return shot; }