第二章:A Simple Interconnection Network
第二章:一个简单的互联网络
本章提供一个允许丢弃数据包(dropping flow control)的蝶形拓扑网络
网络规范和约束
规范
表 2.1 总结了本章示例网络的规格。这些规格包括网络的大小(64 个端口)和每个端口所需的带宽。
如表中所示
- 峰值和平均带宽相等,这意味着输入以 0.25 GB/s 的速率连续注入消息。
- 随机流量,其中每个输入以相同的概率发送到每个输出,预计消息大小为 4 到 64 字节
- 服务质量和可靠性规范允许drop数据包。并非每个数据包都需要成功传送到目的地,具体哪些packet可以drop由QoS说明。
约束
拓扑
出了拓扑形状外,还要确定speedup、radix以及如何封装
speedup
网络的speedup定义为网络总输入带宽与网络理想容量(capacity)的比值。容量是指理想情况下网络的吞吐量。speedup为 1 的设计意味着输入的需求与网络传输流量的理想能力完全匹配,提供更高的speedup可以增加设计的余量。对于蝶形拓扑,将每个通道设置为与单个输入端口相同的带宽,即speedup为1。
本章设定speedup为8.
基数radix
上图中radix为2。本示例speedup假定为8,输入带宽0.25,因此网络通道带宽为2Gbytes/s,即16Gbit/s,16个1Gbit/s的信号。加上2个额外的控制信号,共18个信号。单个芯片不能超过150个信号,因此150/18约为8个通道。所以采用radix为4,每个交换节点4输入4输出,共8个通道。
64端口蝶形网络
此时基数为4,3级蝴蝶拓扑
封装
如图所示,网络的封装方式是将第一级交换机放置在 4 个电路板上,每个电路板有 4 个芯片。接下来的 2 个阶段封装在 4 个电路板上,每个电路板包含 8 个芯片,连接成 16 端口蝶形网络。
每个电路板有32个通道,每个通道18个信号,总共576个信号,符合每个电路板不能超过750个信号的要求。
路由算法
采用地址标签路由(destination-tag),由目的地址的bit来选择网络每一级的输出端口。
64 节点网络中,目标地址是 6 位。每级交换机使用 2 个地址位来选择 4 个交换机输出中的 1 个,例如,考虑将数据包从输入 12 路由到输出节点 35 = 1000112。目标 (10) 的最高有效位选择交换机 0.3 的第三个输出端口,将数据包传送到交换机 1.11。然后,中间位(00)选择开关1.11的第一个输出端口。从交换机 2.8 开始,最低有效位 (11) 选择最后一个输出端口,将数据包传送到输出端口 35。
请注意,交换机输出选择的顺序完全独立于数据包的输入端口,因此,我们可以通过仅存储每个数据包的目标地址来实现路由算法。为了统一,所有的交换节点都对目标地址字段的最高有效位进行操作。然后,在数据包离开节点之前,地址字段向左移动两位,丢弃刚刚使用过的位,并暴露最高有效位置的下一个位。。例如,对于节点 35,原始地址 100011 被移位为 001100。此约定允许我们在网络中的每个位置使用相同的交换节点,而无需特殊配置。它还有助于将网络扩展到更多节点,仅受地址字段大小的限制。
流量控制
为了传输4-64bytes的数据,定义如下数据包格式
定义dropping:如果数据包到达交换机时所需的输出端口正在使用,则该数据包将被丢弃
这里假定存在更高层次的纠错协议,会将被丢弃的信息重新发送。dropping类型的flow control丢包率高、带宽浪费大,但简单直观,容易理解。
路由器设计
module alloc(clk, thisPort, r0, r1, r2, r3, select, shift) ;
input clk ; // chip clock
input [1:0] thisPort ; // identifies this output port
input [3:0] r0,r1,r2,r3 ; // top four bits of each input phit
output [3:0] select ; // radial select to multiplexer
output shift ; // directs shifter to discard upper two bits
wire [3:0] grant, select, head, payload, match, request, hold ;
wire [2:0] pass ;
reg [3:0] last ;
wire avail ;
assign head = {r3[3:2]==3,r2[3:2]==3,r1[3:2]==3,r0[3:2]==3} ;
assign payload = {r3[3:2]==2,r2[3:2]==2,r1[3:2]==2,r0[3:2]==2} ;
assign match = {r3[1:0]==thisPort,r2[1:0]==thisPort,
r1[1:0]==thisPort,r0[1:0]==thisPort} ;
assign request = head&match ;
assign pass = {pass[1:0],avail}&˜request[2:0] ;
assign grant = request&{pass,avail} ;
assign hold = last&payload ;
assign select = grant|hold ;
assign avail = ˜(|hold) ;
assign shift = |grant ;
always @(posedge clk) last = select ;
endmodule
衡量指标
成本、延迟、吞吐量