BookSim (1.0) 用户手册

BookSim 用户手册

Brian Towles 和 William J. Dally

2004 年 9 月 10 日

目录

  1. 引言 1
  2. 入门 2
    2.1 下载和构建模拟器 2
    2.2 运行仿真 2
    2.3 仿真输出 2
  3. 示例 4
  4. 配置参数 4
    4.1 拓扑 4
    4.2 路由算法 8
    4.3 流控 9
    4.4 路由器组织 9
    4.4.1 输入排队路由器 9
    4.4.2 事件驱动路由器 10
    4.5 分配器 10
    4.6 流量 10
    4.7 仿真参数 11
    A. 随机数生成 12

1 引言

本文档描述 BookSim 互连网络模拟器的使用。该模拟器设计为 Morgan Kaufmann 出版的教科书《互连网络原理与实践》(PPIN)(ISBN: 0122007514)的配套工具,并假定读者熟悉该教材所涵盖的内容。

本用户指南相当简短,因为与大多数模拟器一样,学习和理解模拟器的最佳方式是研究代码。模拟器的大多数组件都设计为模块化,因此添加新的路由算法、拓扑或路由器微架构等任务不需要完全重新设计代码。下载代码、编译并运行一个简单示例(第 2 节)后,第 3 节中更详细的示例将很好地概述模拟器的能力。第 4 节提供了配置选项列表以供参考。

2 入门

2.1 下载和构建模拟器

最新版本的模拟器可从 http://cva.stanford.edu 【译注:新地址,https://github.com/booksim/booksim/tree/master】 以压缩 tar 归档文件形式获得。UNIX/Linux 用户可以使用 tar 工具解压该归档文件:

bash 复制代码
tar xvfx booksim-1.0.tar.gz

Windows 用户可以使用 WinZip 等压缩程序解压归档文件。

模拟器本身使用 C++ 编写,并且特别使用 GNU 的 G++ 编译器(版本 >= 3)进行了测试。此外,还需要 LEX 和 YACC 工具(也称为 FLEX 和 BISON)来创建配置解析器。这些是任何 UNIX/Linux 开发环境中的标准工具。建议 Windows 用户下载这些 UNIX 开发工具的 CYGWIN 版本(http://www.cygwin.com),以简化编译过程。应编辑 Makefile,使其前几行给出工具路径。例如,在斯坦福大学,编译器、YACC 和 LEX 存储在 /usr/pubsw/bin 目录中。Makefile 反映了这一点:

makefile 复制代码
CPP = /usr/pubsw/bin/g++
YACC = /usr/pubsw/bin/byacc -d
LEX = /usr/pubsw/bin/flex

然后,可以通过在包含 Makefile 的目录中运行 make 来编译模拟器。

2.2 运行仿真

模拟器的语法很简单:

bash 复制代码
booksim [configfile]

可选参数 configfile 是包含模拟器配置信息的文件。因此,例如,要在均匀流量下模拟一个简单的 8×8 环面(8 元 2 立方体)网络的性能,可以使用如图 1 所示的配置。这个特定配置存储在 examples/torus88 中。

除了指定拓扑之外,配置文件还包含有关路由算法、流控和流量的基本信息。这个简单示例使用维序路由,并且为了确保该路由函数在环面中的无死锁性,需要两个虚拟通道。添加 injection_rate 参数以告诉模拟器每个节点每个仿真周期注入 0.15 个微片。由于模拟器在微片级别运行,大多数参数都以微片为单位指定,injection_rate 也是如此。此外,配置中以 // 开头的任何行都被视为注释,模拟器会忽略。第 4 节给出了详细的配置参数列表。

2.3 仿真输出

继续我们的示例,运行环面仿真会产生如图 2 所示的输出。每个仿真都有三个基本阶段:预热、测量和排空。预热和测量阶段的长度是基本采样周期(由配置中的 sample_period 定义)的倍数。如图所示,当前延迟和吞吐率(已接受数据包的速率)在每个采样周期后打印。总体吞吐率由网络中所有目的地的最低吞吐率决定,但也会显示平均吞吐率。

在预热阶段过去后,模拟器打印 "Warmed up" 消息并重置所有仿真统计信息。然后,测量阶段开始,统计信息在每个采样周期后继续报告。一旦测量阶段过去,所有测量数据包都会从网络中排空,然后报告最终延迟和吞吐率数字。用于控制仿真阶段长度的配置参数细节见第 4.7 节。

图 1:用于模拟 8 元 2 立方体网络的示例配置文件。

text 复制代码
// 拓扑
topology = torus;
k = 8;
n = 2;
// 路由
routing_function = dim_order;
// 流控
num_vcs = 2;
// 流量
traffic = uniform;
injection_rate = 0.15;

图 2:运行 examples/torus88 配置文件时的模拟器输出。

text 复制代码
%============================
% Average latency = 6.02008
% Accepted packets = 0.11 at node 52 (avg = 0.147094)
% latency change = 1
% throughput change = 1

...

% Warmed up ...
%============================
% Average latency = 6.0796
% Accepted packets = 0.119 at node 5 (avg = 0.148266)
% latency change = 0.00562457
% throughput change = 0.00379387

...

% Draining all recorded packets ...
% Draining remaining packets ...
====== Traffic class 0 ======
Overall average latency = 6.09083 (1 samples)
Overall average accepted rate = 0.149475 (1 samples)
Overall min accepted rate = 0.138551 (1 samples)

3 示例

互连网络最基本的性能指标之一是其延迟与提供负载的关系。图 3 显示了一个简单配置文件,用于在转置流量模式下测量 8 元 2 网格网络的这一指标。该配置用于生成 PPIN 中的图 25.2。该特定配置考虑了输入排队路由器的一些小延迟和流水线,并引入了一个小的输入加速比,以弥补分配中的任何低效。通过对注入率的许多增量运行仿真,可以找到平均延迟曲线。然后,例如,为了比较维序路由与其他几种路由算法的性能,可以更改 routing_function 选项。

图 4 显示了一个配置文件,可用于确定使用基于年龄的仲裁的 2 元 6 蝶形网络中数据包延迟的分布。注意 priority 配置参数与 select 分配器一起使用,以考虑数据包优先级。模拟器默认不输出延迟分布,但通过编辑 trafficmanager.cpp、将配置变量 DISPLAY_LAT_DIST 设置为 true 并重新编译,分布将在仿真结束时显示。该技术用于生成 PPIN 图 25.12 中所示的分布。

作为最后一个示例,图 5 显示了使用特殊单节点拓扑来测试交换机分配器性能------在本例中为 iSLIP 分配器。in_ports 和 out_ports 选项设置了一个 8×8 交叉开关的仿真。

图 3:一个典型配置文件(examples/mesh88_lat),用于为 8 元 2 网格网络创建延迟与提供负载曲线。

text 复制代码
// 拓扑
topology = mesh;
k = 8;
n = 2;
// 路由
routing_function = dim_order;
// 流控
num_vcs = 8;
vc_buf_size = 8;
wait_for_tail_credit = 1;
// 路由器架构
vc_allocator = islip;
sw_allocator = islip;
alloc_iters = 1;
credit_delay = 2;
routing_delay = 1;
vc_alloc_delay = 1;
input_speedup = 2;
output_speedup = 1;
internal_speedup = 1.0;
// 流量
traffic = transpose;
const_flits_per_packet = 20;
// 仿真
sim_type = latency;
injection_rate = 0.1;

图 4:一个配置文件(examples/fly26_age),用于使用基于年龄的仲裁寻找数据包延迟分布。

text 复制代码
// 拓扑
topology = fly;
k = 2;
n = 6;
// 路由
routing_function = dest_tag;
// 流控
num_vcs = 8;
vc_buf_size = 8;
wait_for_tail_credit = 1;
// 路由器架构
vc_allocator = select;
sw_allocator = select;
alloc_iters = 1;
credit_delay = 2;
routing_delay = 1;
vc_alloc_delay = 1;
input_speedup = 2;
output_speedup = 1;
internal_speedup = 1.0;
// 流量
traffic = uniform;
const_flits_per_packet = 20;
priority = age;
// 仿真
sim_type = latency;
injection_rate = 0.1;

图 5:一个单节点配置文件(examples/single),用于测试交换机分配器的性能。

text 复制代码
// 拓扑
topology = single;
in_ports = 8;
out_ports = 8;
// 路由
routing_function = single;
// 流控
vc_allocator = islip;
sw_allocator = islip;
alloc_iters = 2;
num_vcs = 8;
vc_buf_size = 1000;
wait_for_tail_credit = 0;
// 仿真
sim_type = latency;
injection_rate = 0.1;

4 配置参数

用于配置仿真的所有信息都通过配置文件传递,如第 2.2 节示例所示。本节列出已有的配置参数------用户可以通过修改 booksim_config.cpp 文件来加入额外选项。

4.1 拓扑

topology 参数决定网络的底层拓扑,模拟器支持四种基本拓扑:

  • fly:k 元 n 蝶形(butterfly)拓扑。k 参数决定网络的基数,n 参数决定网络的维数。
  • mesh:k 元 n 网格(mesh)拓扑。k 参数决定网络的基数,n 参数决定网络的维数。
  • single:具有单个节点的网络,用于测试单路由器性能。节点的输入和输出端口数分别由 in_ports 和 out_ports 参数决定。
  • torus:k 元 n 立方体(torus)拓扑。k 参数决定网络的基数,n 参数决定网络的维数。

mesh 和 torus 拓扑都支持通过 link_failures 参数添加随机链路故障。link_failures 的值决定从拓扑中随机移除的通道数,因此这些通道不再可用于转发数据包。此外,故障通道的随机化通过为 fail_seed 参数选择一个整数值来控制------固定种子会给出固定的故障通道集合,独立于仿真中的其他随机化。另请注意,只有某些路由函数支持此功能(见第 4.2 节)。

4.2 路由算法

routing_function 参数为拓扑选择一种路由算法。许多路由算法需要多个虚拟通道来实现无死锁(VcDF)。

路由函数 描述
dim_order 维序路由。适用于 mesh 拓扑(1 VcDF)和 torus 拓扑(2 VcDF)。
dim_order_bal 用于 torus 拓扑的维序路由,使用更平衡的 VC 使用以避免死锁(2 VcDF)。
dim_order_ni 维序路由的非干扰版本。适用于 torus 或 mesh 拓扑,每个网络终端需要一个 VC。
min_adapt 用于 mesh 拓扑(2 VcDF)和 torus 拓扑(3 VcDF)的最小自适应路由算法。
planar_adapt 用于 mesh 拓扑的平面自适应路由(2 VcDF)。支持绕过故障通道进行路由。
romm 用于 mesh 的 ROMM 路由(2 VcDF)。负载通过两阶段路由来平衡:第一阶段从源到最小象限中的随机中间节点,第二阶段从中间节点到目的地。
romm_ni 用于 mesh 的 ROMM 路由的非干扰版本,每个网络终端需要一个 VC。
single 用于 single 拓扑的哑路由函数。
valiant 用于 mesh 拓扑(2 VcDF)和 torus 拓扑(4 VcDF)的 Valiant 随机路由算法。
valiant_ni 用于 torus 的 Valiant 算法非干扰版本,每个网络终端需要 4 个 VC。

此外,模拟器代码的结构使得可以以最小的整体模拟器改动来添加额外的路由算法(参见模拟器源代码中的 routefunc.cpp 文件)。

4.3 流控

模拟器支持带有基于信用的背压的基本虚拟通道流控。

  • num_vcs:每个物理通道的虚拟通道数。
  • vc_buf_size:每个虚拟通道的深度,以微片为单位。
  • voq:如果非零,则使用虚拟输出排队。使用虚拟输出排队时,为网络中的每个目的地分配一个单独的虚拟通道。此选项与无干扰路由算法(第 4.2 节)一起使用时最有用。
  • wait_for_tail_credit:如果非零,则在尾部微片离开该虚拟通道之前,不重新分配虚拟通道。这种保守方法可防止连续共享同一虚拟通道的两个数据包之间形成依赖关系。

4.4 路由器组织

模拟器还支持两种不同的路由器微架构。输入排队路由器遵循 PPIN 中描述的一般组织,而事件驱动路由器则仿照 Avici TSR 中使用的路由器,并在美国专利 6,370,145 中描述。微架构通过 router 选项选择。此外,两种路由器共享一小组选项。

  • credit_delay:信用的处理延迟(以周期为单位)。不包括传输信用的线路延迟。
  • internal_speedup:路由器内部相对于通道传输速率的任意加速比。例如,加速比 1.5 意味着平均而言,在单个微片通过通道传输所需的时间内,路由器可以转发 1.5 个微片。此外,配置解析器期望此字段为浮点数,因此整数加速比也应包含小数点(例如 "2.0")。
  • output_delay:路由器输出队列中产生的处理延迟。
4.4.1 输入排队路由器

输入排队路由器(router = iq)遵循 PPIN 中描述的路由计算、虚拟通道分配、交换机分配和交换机遍历流水线。有几个选项特定于输入排队路由器。

  • input_speedup:输入端口在空间上的整数加速比。例如,加速比为 2 时,每个输入有两个进入交叉开关的输入端口。对这些端口的访问基于虚拟通道号静态分配:对于输入加速比 s,输入 i 上的虚拟通道 v 连接到端口 i·s + (v mod s)。
  • output_speedup:输出端口在空间上的整数加速比。类似于 input_speedup。
  • routing_delay:路由计算的延迟(以周期为单位)。
4.4.2 事件驱动路由器

事件驱动路由器(router = event)是一种微架构,专门设计用于高效支持大量虚拟通道(VC)。与输入排队路由器中持续轮询虚拟通道状态不同,它只跟踪 VC 状态的变化。因此,其效率来自每个周期的状态变化数量是恒定的,并且与 VC 数量无关。

4.5 分配器

模拟器中使用的许多分配器都是可配置的(参见第 4.4.1 节中的输入排队路由器),并且有几种分配算法可用。

  • max_size:最大规模匹配。
  • islip:iSLIP 可分离分配器。
  • pim:并行迭代匹配可分离分配器。
  • loa:孤独输出分配器。
  • wavefront:波前匹配。
  • select:基于优先级的分配器。分配方式与 iSLIP 中相同,但偏好较高优先级的数据包(参见第 4.6 节中的 priority 选项)。

还可以通过执行算法的多次迭代来改进分配,迭代次数由 alloc_iters 参数控制。

4.6 流量

微片注入模拟器的速率使用 injection_rate 选项设置。模拟器的周期时间是微片周期,即单个微片在源端注入所需的时间,注入率以微片/微片周期为单位指定。例如,设置 injection_rate = 0.25 意味着每个源每四个模拟器周期注入一个新微片。注入过程也可以指定为伯努利过程(injection_process = bernoulli)或开-关过程(injection_process = on_off)。后一种注入过程的突发性由 burst_alpha 和 burst_beta 参数控制。有关开-关过程及其参数的描述,请参见 PPIN 第 24.2.2 节。

注入单位是数据包,数据包可能由许多微片组成。每个数据包的微片数使用 const_flits_per_packet 选项设置。每个数据包还可以具有关联的优先级,由 priority 选项指定,可以是基于年龄的(age)或无(none)。

模拟器还支持几种不同的流量模式,使用 traffic 选项指定。为了描述这些模式,我们使用 PPIN 第 3.2 节中的相同符号:(s_i)((d_i))表示源(目的地)地址的第 (i) 位,而 (s_x)((d_x))表示源(目的地)地址的第 (x) 个基数为 (k) 的数字。地址的位长度为 (b = \log_2 N),其中 (N) 是网络中的节点数。

  • uniform:每个源向每个目的地发送等量流量(traffic = uniform)。
  • bitcomp:位补。(d_i = \neg s_i)
  • bitrev:位反转。(d_i = s_{b - i - 1})
  • shuffle:混洗。(d_i = s_{i - 1} \bmod b)
  • transpose:转置。(d_i = s_{i + b/2} \bmod b)
  • tornado:龙卷风。(d_x = s_x + \lfloor k/2 \rfloor - 1 \bmod k)
  • neighbor:邻居。(d_x = s_x + 1 \bmod k)
  • random:随机排列。从所有排列的集合中均匀随机地选择一个固定排列流量模式。用于生成此排列的种子由 perm_seed 选项设置。因此,随机选择 perm_seed 值可以得到排列的随机采样,而固定的 perm_seed 值允许在多个实验中使用相同的排列。

4.7 仿真参数

仿真的持续时间和其他方面通过一组仿真参数控制。

  • sim_type:仿真可以侧重于吞吐率或延迟。这两种类型的关键区别在于,延迟仿真会等待所有测量数据包排空后才结束仿真,以确保准确的延迟测量。在吞吐率仿真中,消除了最后的排空步骤,以允许模拟运行超过饱和点的网络。
  • sample_period:采样周期以模拟器周期表示,并在指定仿真的预热长度和最大样本数时用作乘数。此外,中间统计信息每 sample_period 个周期显示一次。
  • warmup_periods:预热长度,表示为采样周期的倍数。预热后,所有统计计数器都会重置。
  • max_samples:仿真总长度,表示为采样周期的倍数。
  • latency_thres:如果当前仿真的采样延迟超过 latency_thres,仿真立即结束。
  • sim_count:针对给定配置连续运行的仿真次数。用于创建特定统计量的集成平均值。
  • seed:仿真的随机种子。
  • reorder:非零值表示应保持数据包顺序,并且重排序时间计入总体延迟。

A 随机数生成

模拟器使用 Knuth 的整数和浮点伪随机数生成器。这些算法及其解释出现在《计算机程序设计艺术:半数值算法》中。

相关推荐
论文复现现场1 天前
AutoDL、算家云与公有云 GPU 怎么选?环境复现、计费与断点恢复对比
pytorch·深度学习·云计算·gpu
Eloudy2 天前
全文 - Dissecting How Die Scaling Breaks GPU Fine-grained Scheduling
gpu·chiplet
Eloudy3 天前
BlackWell 双 计算 die 的 L2 一致性 cases
gpu·chiplet
Eloudy3 天前
全文 - version.A - AMBA CHI Chip-to-Chip(C2C)
java·开发语言·数据库·gpu·chiplet
Eloudy4 天前
全文 - 第0章 前言,第 1 章 简介 - UCIe v3.0 Specification
gpu·chiplet
Eloudy6 天前
NVSwitch 和 UALink 的数据(缓存)一致性
网络·缓存·gpu
Eloudy13 天前
开源 gpunetio examples 01 解析 gpunetio_verbs_put_bw
gpu·fpga·rdma·roce·doca
Eloudy14 天前
GPUNetIO开源实现与FPGA的 RoCEv2 通信延迟实验
gpu·fpga·rdma·roce·doca
Eloudy15 天前
cpu rdma 与 gpunetio 的关系
gpu·rdma·roce·doca