-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcrossbar_latency_queue.cpp
More file actions
89 lines (84 loc) · 3.1 KB
/
Copy pathcrossbar_latency_queue.cpp
File metadata and controls
89 lines (84 loc) · 3.1 KB
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
//
// Created by 10791 on 2023/1/12.
//
#include <queue>
#include "crossbar_latency_queue.h"
#include "crossbar.h"
void crossbar_latency_queue::crossbar_latency_queue_cycle(LocalInterconnect& out_crossbar,
LocalInterconnect& in_crossbar, int out_buffer, int
in_buffer){ //暂且队列实现
time++;//传参
int cnt_out = 0;
int cnt_in = 0;
int vacant_in = 0;
int vacant_out = 0;
while (cnt_in < bank) //考虑减少遍历次数,用学长的办法
{
if (!in_crossbar.in_buffers_list_full(in_buffer, cnt_in, buffer_size))
{
vacant_in = 0; //可以进入
auto *mf = crossbar_latency_queues[cnt_in][0];//弹出 C++队列不好使 //front -> [0]
//修改为
if (mf) { //non-void insert //增加判断情况
in_crossbar.in_buffers_list_push(in_buffer, next_node_in, *mf);
delete(mf);
crossbar_latency_queues[cnt_in][0] = nullptr; //最后弹出
next_node_in = (++next_node_in) % (n_mem + n_shader);
} //处理有很多种
else
{
//如果是空, 就不用处理了
//node不变
//下次还是该它接收
}
++cnt_in; //无论如何, 这一格被消耗
}
else
{
++vacant_in;
next_node_in = (++next_node_in) % (n_mem + n_shader);
}
if (vacant_in == n_mem + n_shader)
{
break;
}
}
for (int i = 0; i < bank; ++i) { //形成队列,如果没有解决就一直等待
for (int stage = 0; stage < latency - 1; ++stage) {//模拟移动 //不能爆了,很精妙
if (crossbar_latency_queues[i][stage] == nullptr) {
crossbar_latency_queues[i][stage] = crossbar_latency_queues[i][stage + 1];
crossbar_latency_queues[i][stage + 1] = nullptr;
}
}
}
while (cnt_out < bank)
{
if (!out_crossbar.out_buffers_list_empty(out_buffer, next_node_out))
{
vacant_out = 0;
auto *mf = new Packet(out_crossbar.out_buffers_list_probe(out_buffer, next_node_out));
if (crossbar_latency_queues[cnt_out][latency - 1] == nullptr) //如果是空
{
// printf("time is %d arrived %d %d\n", time, *(int *) (mf->data), mf->output_deviceID);
crossbar_latency_queues[cnt_out][latency - 1] = mf;
out_crossbar.out_buffers_list_pop(out_buffer, next_node_out); //先probe
next_node_out = (++next_node_out) % (n_shader + n_mem);
}
else
{
//又需要回退
}
++cnt_out;
}
else
{
++vacant_out;
next_node_out = (++next_node_out) % (n_shader + n_mem);
}
if (vacant_out == (n_shader + n_mem))
{
break;
}
}
}//先加config
//bp vectorAdd conv3d //周期不变