summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/local_interconnect.cc
diff options
context:
space:
mode:
authorMahmoud <[email protected]>2019-08-26 12:17:52 -0400
committerMahmoud <[email protected]>2019-08-26 12:17:52 -0400
commitc2a1e3a668f9a88239184e13460f7e1725b15c90 (patch)
tree0546cc50d6e222072add55e36999a338b925d807 /src/gpgpu-sim/local_interconnect.cc
parent56c52cf6c4b369e9fd05759e9b16ea37ff6e332c (diff)
Banked L1, adding iSLIP and RR arbiteratio and adding some comments
Diffstat (limited to 'src/gpgpu-sim/local_interconnect.cc')
-rw-r--r--src/gpgpu-sim/local_interconnect.cc40
1 files changed, 31 insertions, 9 deletions
diff --git a/src/gpgpu-sim/local_interconnect.cc b/src/gpgpu-sim/local_interconnect.cc
index 1416b2c..da8a65c 100644
--- a/src/gpgpu-sim/local_interconnect.cc
+++ b/src/gpgpu-sim/local_interconnect.cc
@@ -36,7 +36,7 @@
#include "local_interconnect.h"
#include "mem_fetch.h"
-xbar_router::xbar_router(unsigned router_id, enum Interconnect_type m_type, unsigned n_shader, unsigned n_mem, unsigned m_in_buffer_limit, unsigned m_out_buffer_limit)
+xbar_router::xbar_router(unsigned router_id, enum Interconnect_type m_type, unsigned n_shader, unsigned n_mem, unsigned m_in_buffer_limit, unsigned m_out_buffer_limit, enum Arbiteration_type m_arbit_type)
{
m_id=router_id;
router_type=m_type;
@@ -46,9 +46,10 @@ xbar_router::xbar_router(unsigned router_id, enum Interconnect_type m_type, unsi
in_buffers.resize(total_nodes);
out_buffers.resize(total_nodes);
next_node.resize(total_nodes,0);
-// next_node = 0;
in_buffer_limit = m_in_buffer_limit;
out_buffer_limit = m_out_buffer_limit;
+ arbit_type = m_arbit_type;
+ next_node_id=0;
if(m_type == REQ_NET) {
active_in_buffers=n_shader;
active_out_buffers=n_mem;
@@ -109,14 +110,25 @@ bool xbar_router::Has_Buffer_In(unsigned input_deviceID, unsigned size, bool upd
bool xbar_router::Has_Buffer_Out(unsigned output_deviceID, unsigned size){
return (out_buffers[output_deviceID].size() + size <= out_buffer_limit);
}
-/*
+
void xbar_router::Advance() {
+
+ if(arbit_type == NAIVE_RR)
+ RR_Advance();
+ else if(arbit_type == iSLIP)
+ iSLIP_Advance();
+ else
+ assert(0);
+
+}
+
+void xbar_router::RR_Advance() {
cycles++;
vector<bool> issued(total_nodes, false);
for(unsigned i=0; i<total_nodes; ++i){
- unsigned node_id = (i+next_node)%total_nodes;
+ unsigned node_id = (i+next_node_id)%total_nodes;
if(!in_buffers[node_id].empty()) {
Packet _packet = in_buffers[node_id].front();
@@ -130,12 +142,16 @@ void xbar_router::Advance() {
else
conflicts++;
}
- else
+ else {
out_buffer_full++;
+
+ if(issued[_packet.output_deviceID])
+ conflicts++;
+ }
}
}
- next_node = (++next_node % total_nodes);
+ next_node_id = (++next_node_id % total_nodes);
//collect some stats about buffer util
for(unsigned i=0; i<total_nodes; ++i){
@@ -143,13 +159,17 @@ void xbar_router::Advance() {
out_buffer_util+=out_buffers[i].size();
}
}
-*/
-void xbar_router::Advance() {
+//iSLIP algorithm
+//McKeown, Nick. "The iSLIP scheduling algorithm for input-queued switches." IEEE/ACM transactions on networking 2 (1999): 188-201.
+//https://www.cs.rutgers.edu/~sn624/552-F18/papers/islip.pdf
+void xbar_router::iSLIP_Advance() {
cycles++;
vector<unsigned> node_tmp;
+
+ //calcaulte how many conflicts are there for stats
for (unsigned i=0; i<total_nodes; ++i){
if(!in_buffers[i].empty()){
@@ -167,6 +187,8 @@ void xbar_router::Advance() {
}
}
+
+ //do iSLIP
for(unsigned i=0; i<total_nodes; ++i){
if(Has_Buffer_Out(i, 1)) {
@@ -242,7 +264,7 @@ void LocalInterconnect::CreateInterconnect(unsigned m_n_shader, unsigned m_n_mem
net.resize(n_subnets);
for (unsigned i = 0; i < n_subnets; ++i) {
- net[i] = new xbar_router( i, static_cast<Interconnect_type>(i), m_n_shader, m_n_mem, m_inct_config.in_buffer_limit, m_inct_config.out_buffer_limit );
+ net[i] = new xbar_router( i, static_cast<Interconnect_type>(i), m_n_shader, m_n_mem, m_inct_config.in_buffer_limit, m_inct_config.out_buffer_limit,m_inct_config.arbiter_algo);
}
}