summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/local_interconnect.h
blob: 0f83d05d71e9626593ad89ba028e01bca94988f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright (c) 2009-2013, Tor M. Aamodt, Dongdong Li, Ali Bakhoda
// The University of British Columbia
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// Redistributions in binary form must reproduce the above copyright notice, this
// list of conditions and the following disclaimer in the documentation and/or
// other materials provided with the distribution.
// Neither the name of The University of British Columbia nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#ifndef _LOCAL_INTERCONNECT_HPP_
#define _LOCAL_INTERCONNECT_HPP_

#include <vector>
#include <queue>
#include <iostream>
#include <map>
using namespace std;


struct inct_config
{

	//config for local interconnect
	unsigned   in_buffer_limit;
	unsigned   out_buffer_limit;
	unsigned   subnets;
};

enum Interconnect_type {
	REQ_NET=0,
	REPLY_NET=1
};
class xbar_router {

public:
  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();
   void Push(unsigned input_deviceID, unsigned output_deviceID, void* data, unsigned int size);
   void* Pop(unsigned ouput_deviceID);
   void Advance();
   bool Busy() const;
   bool Has_Buffer_In(unsigned input_deviceID, unsigned size, bool update_counter=false);
   bool Has_Buffer_Out(unsigned output_deviceID, unsigned size);

   //some stats
   unsigned long long cycles;
   unsigned long long conflicts;
   unsigned long long out_buffer_full;
   unsigned long long out_buffer_util;
   unsigned long long in_buffer_full;
   unsigned long long in_buffer_util;
   unsigned long long packets_num;

private:
  struct Packet{
	  Packet(void* m_data, unsigned m_output_deviceID) {
		  data = m_data;
		  output_deviceID = m_output_deviceID;
	  }
	  void* data;
	  unsigned output_deviceID;
  };
  vector<queue<Packet> > in_buffers;
  vector<queue<Packet> > out_buffers;
  unsigned _n_shader, _n_mem, total_nodes;
  unsigned in_buffer_limit, out_buffer_limit;
  unsigned next_node;
  unsigned m_id;
  enum Interconnect_type router_type;
  unsigned active_in_buffers,active_out_buffers;

  friend class LocalInterconnect;

};

class LocalInterconnect {
public:
  LocalInterconnect(const struct inct_config& m_localinct_config);
  ~LocalInterconnect();
  static LocalInterconnect* New(const struct inct_config& m_inct_config);
  void CreateInterconnect(unsigned n_shader, unsigned n_mem);
  
  //node side functions
  void Init();
  void Push(unsigned input_deviceID, unsigned output_deviceID, void* data, unsigned int size);
  void* Pop(unsigned ouput_deviceID);
  void Advance();
  bool Busy() const;
  bool HasBuffer(unsigned deviceID, unsigned int size) const;
  void DisplayStats() const;
  void DisplayOverallStats() const;
  unsigned GetFlitSize() const;
  
  void DisplayState(FILE* fp) const;
  
  
protected:

  const inct_config& m_inct_config;
  
  unsigned n_shader, n_mem;
  unsigned n_subnets;
  vector<xbar_router *> net;

};

#endif