summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/local_interconnect.h
blob: 502c80daf288fc3919b1045be2bbc7db35bc89b6 (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) 2019, Mahmoud Khairy
// Purdue University
// 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