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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
// 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 <iostream>
#include <map>
#include <queue>
#include <vector>
using namespace std;
enum Interconnect_type { REQ_NET = 0, REPLY_NET = 1 };
enum Arbiteration_type {
NAIVE_RR = 0, //
iSLIP,
PERFECT
};
struct inct_config {
// config for local interconnect
unsigned in_buffer_limit;
unsigned out_buffer_limit;
unsigned subnets;
Arbiteration_type arbiter_algo;
unsigned verbose;
unsigned grant_cycles;
};
class xbar_router {
public:
xbar_router(unsigned router_id, enum Interconnect_type m_type,
unsigned n_shader, unsigned n_mem,
const struct inct_config& m_localinct_config);
~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 conflicts_util;
unsigned long long cycles_util;
unsigned long long reqs_util;
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:
void iSLIP_Advance();
void RR_Advance();
void Perfect_Advance();
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;
vector<unsigned> next_node; // used for iSLIP arbit
unsigned next_node_id; // used for RR arbit
unsigned m_id;
enum Interconnect_type router_type;
unsigned active_in_buffers, active_out_buffers;
Arbiteration_type arbit_type;
unsigned verbose;
unsigned grant_cycles;
unsigned grant_cycles_count;
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
|