summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorshen203 <[email protected]>2019-07-30 15:48:32 -0400
committershen203 <[email protected]>2019-07-30 15:48:32 -0400
commit2f5b3332c9b9b3fa9fea43d61276bddb24aa7df2 (patch)
treed4bd26c7dee6de0a95755a30d86728d9a2273c46 /src
parentbf198b13541a427cba9bef22799955aa08ab050a (diff)
changing x-bar algorithm to islip
Diffstat (limited to 'src')
-rw-r--r--src/gpgpu-sim/local_interconnect.cc58
-rw-r--r--src/gpgpu-sim/local_interconnect.h3
2 files changed, 58 insertions, 3 deletions
diff --git a/src/gpgpu-sim/local_interconnect.cc b/src/gpgpu-sim/local_interconnect.cc
index 66d6648..1416b2c 100644
--- a/src/gpgpu-sim/local_interconnect.cc
+++ b/src/gpgpu-sim/local_interconnect.cc
@@ -45,7 +45,8 @@ xbar_router::xbar_router(unsigned router_id, enum Interconnect_type m_type, unsi
total_nodes = n_shader+n_mem;
in_buffers.resize(total_nodes);
out_buffers.resize(total_nodes);
- next_node=0;
+ next_node.resize(total_nodes,0);
+// next_node = 0;
in_buffer_limit = m_in_buffer_limit;
out_buffer_limit = m_out_buffer_limit;
if(m_type == REQ_NET) {
@@ -108,7 +109,7 @@ 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() {
cycles++;
@@ -142,6 +143,59 @@ void xbar_router::Advance() {
out_buffer_util+=out_buffers[i].size();
}
}
+*/
+
+void xbar_router::Advance() {
+ cycles++;
+
+ vector<unsigned> node_tmp;
+
+ for (unsigned i=0; i<total_nodes; ++i){
+
+ if(!in_buffers[i].empty()){
+ Packet _packet_tmp = in_buffers[i].front();
+ if (!node_tmp.empty()){
+ if (std::find(node_tmp.begin(), node_tmp.end(), _packet_tmp.output_deviceID)!=node_tmp.end()){
+ conflicts++;
+ }
+ else
+ node_tmp.push_back(_packet_tmp.output_deviceID);
+ }
+ else{
+ node_tmp.push_back(_packet_tmp.output_deviceID);
+ }
+ }
+ }
+
+ for(unsigned i=0; i<total_nodes; ++i){
+
+ if(Has_Buffer_Out(i, 1)) {
+ for(unsigned j=0; j<total_nodes; ++j){
+ unsigned node_id = (j+next_node[i])%total_nodes;
+
+ if(!in_buffers[node_id].empty()) {
+ Packet _packet = in_buffers[node_id].front();
+ if(_packet.output_deviceID==i){
+ out_buffers[_packet.output_deviceID].push(_packet);
+ in_buffers[node_id].pop();
+ next_node[i] = (++node_id % total_nodes);
+ break;
+ }
+ }
+ }
+ }
+ else
+ out_buffer_full++;
+ }
+
+ //collect some stats about buffer util
+ for(unsigned i=0; i<total_nodes; ++i){
+ in_buffer_util+=in_buffers[i].size();
+ out_buffer_util+=out_buffers[i].size();
+ }
+}
+
+
bool xbar_router::Busy() const {
diff --git a/src/gpgpu-sim/local_interconnect.h b/src/gpgpu-sim/local_interconnect.h
index 502c80d..f4a2af1 100644
--- a/src/gpgpu-sim/local_interconnect.h
+++ b/src/gpgpu-sim/local_interconnect.h
@@ -82,7 +82,8 @@ private:
vector<queue<Packet> > out_buffers;
unsigned _n_shader, _n_mem, total_nodes;
unsigned in_buffer_limit, out_buffer_limit;
- unsigned next_node;
+ vector<unsigned> next_node;
+// unsigned next_node;
unsigned m_id;
enum Interconnect_type router_type;
unsigned active_in_buffers,active_out_buffers;