这是一个独立的 AetherPDES 原生 Unified Bus 仿真工程。运行时不链接 ns-3, 也没有修改 AetherPDES 源码;原 ns3ub 只作为差分验证和性能基线。
工程在 third_party/AetherPDES 内附带一份构建所需的 AetherPDES 源码快照,
并由 CMake FetchContent 以本地 SOURCE_DIR 方式接入。来源分支固定为
perf-opt-p5-p6b,实际内容锁定到不可变提交
b361934820815c1f2401004c64b03711ccc80546。默认构建不需要访问私有上游仓库,
也不会因为远端分支继续更新而改变实验底座。
依赖:CMake 3.24+、支持 C++17 的编译器、MPI,以及运行测试时使用的 Python 3.10+。
cd /path/to/aether-ub
cmake --preset dev
cmake --build --preset dev
ctest --preset dev
./build/dev/aether-ub --case /path/to/case --mode sequential
mpirun -np 2 ./build/dev/aether-ub \
--case /path/to/case --mode conservative --window auto默认配置全程使用仓库内的固定 AetherPDES 快照,不需要联网下载框架源码。
提交前可运行统一格式检查:
cmake --build build/dev --target format-check主性能验收 case 是 dayu64p_8p_all_reduce_ring_16mb:64 个 Device、8 个
Switch、8,064 个 URMA_WRITE 任务。另对 ns3ub 仓库的 25 个 scratch case
做了全量扫描和差分;其中 23 个原版可完成 case 均能由 Aether 原生程序运行,
并全部达到相同停止虚拟时间。19 个 case 的任务级 canonical 输出完全一致,
其余 4 个的最大偏差为 246 ns。迁移的实际执行路径包括:phase 依赖与
可配置的跨进程可见延迟、64 KiB TA 分段、4 KiB TP 包、可靠 ACK、write response、
8 路 multipath/packet spray、路由、Switch VOQ、round-robin/DWRR allocator、端口
预取、链路序列化与传播、入口处理延迟、CBFC 信用消费/阻塞/piggyback/40B control-credit,
以及 100 us 进度轮询停止边界。case 中关闭的重传、拥塞控制和 fault 会在
加载时校验为关闭,不会被静默忽略。
额外完成了 URMA_READ/WRITE_NOTIFY、MEM_STORE/LOAD、静态 TP/动态 CTP、 HASH/ADAPTIVE 路由、Selective/GBN 重传、legacy/retrans fault、DCQCN/CAQM, 以及 PFC fixed/dynamic/paper-dynamic 的原生状态机。 PFC 的三层 ingress admission、shared pool、per-port headroom、processing/VOQ/ egress 占用、Pause/Resume 全 VL 状态都属于 UB LP 可回滚状态。PFC 动态压测与 ns3ub 对照得到相同的 510,000 us 虚拟时间、2,765,022 个 wire packet(其中 171,022 个 40B PFC 帧)和逐任务完成时刻。
TP 发送侧还包含可配置 inflight window、Selective/SACK、fast retrans、
MarkPSN 抑制、GBN/Selective RTO 和 timer generation token;确定性
retrans_fault.csv 的 drop 与 detached delay 也已迁移。原
non_first_tp_packet_loss_markpsn case 与 ns3ub 均在 1.131 us 给出业务完成
可见事件、100 us 结束,且 38 个实际 wire packet 的逐端口发送时刻一致。
cmake/AetherDependency.cmake:固定 Aether 官方仓库、来源分支和提交; 默认选择 vendored 快照,同时提供本地 checkout 和远端 FetchContent 入口。third_party/AetherPDES:固定提交的构建所需 AetherPDES 源码,禁止混入 UB 业务修改。CMakePresets.json:统一dev、release、ci三套构建配置。src/case.cpp:读取原 case 的 node/topology/routing/traffic 和network_attribute.txt,并校验本次迁移的活动配置。include/aether_ub/packet.hpp:不依赖 Aether 的 UB 包和值类型。include/aether_ub/event.hpp:UB 与 Aether 之间唯一的序列化事件信封。src/partition.cpp:UB 拓扑感知的初始 LP 分区策略。src/model.cpp:Aether Logical Process、任务/TP、交换机、端口队列、 allocator、链路和 CBFC 的时间状态机。src/main.cpp:Aether Engine、Sequential/Conservative MPI 启动、统计与 canonical 输出。tests/:232 个原 ns3ub UB 测试类的清单、原生契约测试和 MPI 黑盒测试。.github/workflows/ci.yml:Linux/Open MPI 的可复现构建与全量测试。docs/MIGRATION_BOUNDARY.md:业务侧与框架侧的职责和修改门槛。docs/MIGRATION_MATRIX.md:原src/unified-bus各模块的迁移状态与顺序。benchmarks/20260831-native-aether-vs-ns3ub:同 case 的可复现实验脚本、 25 次原始记录和结果报告。
默认的独立构建通过 FetchContent 使用仓库内 vendored Aether:
cmake -S . -B build/release \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTING=OFF
cmake --build build/release -j
./build/release/aether-ub --case /path/to/case --mode sequential
mpirun -np 2 ./build/release/aether-ub --case /path/to/case --mode conservative
mpirun -np 4 ./build/release/aether-ub --case /path/to/case --mode conservative
mpirun -np 8 ./build/release/aether-ub --case /path/to/case --mode conservative也可以直接使用 release preset:
cmake --preset release
cmake --build --preset release
cmake --install build/release --prefix /path/to/install做框架优化 A/B 时,通过 AETHER_ROOT 显式覆盖 FetchContent。工程不会修改
该目录:
cmake -S . -B build/local -DCMAKE_BUILD_TYPE=Release \
-DAETHER_ROOT=/path/to/AetherPDES \
-DBUILD_TESTING=ON
cmake --build build/local -j
ctest --test-dir build/local --output-on-failure可复现构建不应覆盖 AETHER_UB_AETHER_COMMIT。只有准备正式升级框架并重新跑
正确性与性能基线时,才同时更新
cmake/AetherDependency.cmake、THIRD_PARTY_NOTICES.md 和报告中的 provenance。
若运行环境本身有权访问上游私有仓库,也可以关闭 bundled 模式,让 FetchContent 直接检出固定提交:
cmake -S . -B build/fetch \
-DAETHER_UB_USE_BUNDLED_AETHER=OFF \
-DBUILD_TESTING=ON原生测试清单来自 ns3ub 的 src/unified-bus/test/ub-test.cc,覆盖其中全部
232 个唯一 TestCase 类;focused suite 的重复注册不重复计数。全量运行:
ctest --preset dev第一个 CTest 目标执行 199 个进程内 UB 契约测试;第二个执行 33 个
aether-ub 黑盒系统测试,并逐行比较 Aether Sequential 与双进程
Conservative 的 canonical 任务时间线。迁移规则和结果见
docs/TEST_MIGRATION.md。
本次迁移的验收范围是 Sequential 和 Conservative MPI;Optimistic/Hybrid 不是正确性或性能交付条件。
当前默认依赖是 Aether 优化 MR #2 的提交 b361934。需要复测合入前基线时,
通过 AETHER_ROOT 传入对应的框架 checkout。
业务工程和 Aether 框架是两个独立源码树。通过 AETHER_ROOT 可以只替换框架
实现,不改 UB 业务源码:
cmake -S . -B build-framework-opt -DCMAKE_BUILD_TYPE=Release \
-DAETHER_ROOT=/path/to/AetherPDES-framework-checkout
cmake --build build-framework-opt -j
./build-framework-opt/aether-ub --case /path/to/case --queue ladder
./build-framework-opt/aether-ub --case /path/to/case --queue binned--queue 的名字直接交给所选 Aether checkout 的事件队列工厂校验,因此以后
增加框架队列不需要再修改 UB 业务程序。
MPI 模式默认使用 --window auto:它会按当前 LP 分区,取最短跨进程链路
事件(传播延迟 + 最短活动包序列化)和跨进程 phase 依赖中的较小值。也可以用
--window 50ns 显式指定,但超过自动计算的安全上限会直接报错。
一个 tick 是 1 ps。摘要中的 simulated_us 包括与 ns3ub 相同的 100 us
完成轮询边界;--canonical-output <base> 可另外保存任务 START 和
COMPLETE_VISIBLE 时间。
Device 和 Switch 会分别轮转到各 rank,避免交换机集中到某个进程。每个 进程只创建自己拥有的可变节点 LP;完整 case 的只读拓扑、路由和任务表仍会 在各进程保留一份。运行摘要会输出本地 LP 数范围、跨 rank 事件数以及紧凑 事件大小,便于检查分区是否真的生效。
每个 UB Node LP 的端口队列、TP 序号、task/phase 和统计状态都有显式值状态;
业务对象之间只用稳定 ID,不跨进程传 C++ 指针。--lb-interval N 保留为框架
能力入口,但当前终验只覆盖串行和保守同步。
本次实测报告见
benchmarks/20260831-native-aether-vs-ns3ub/REPORT.md。
50 ns 链路与自动窗口的补充实验见
benchmarks/20260831-50ns-window-scaling/REPORT.md。
允许修改框架调用后的原生业务迁移 v2 结果见
benchmarks/20260903-native-business-migration/REPORT.md。
独立 Aether 框架 checkout、heap/ladder/binned 队列和调度热路径优化结果见
benchmarks/20260904-framework-queue-opt/REPORT.md。
25 个 scratch case 的迁移终验、DWRR/DCQCN/MTP/MPI 对比和最新代码量见
benchmarks/20260904-full-business-migration/REPORT.md。
Aether 优化 MR #2 在 DWRR、DCQCN 和 64-device 大 case 上的隔离 A/B 见
benchmarks/20260904-aether-pr2/REPORT.md。
Aether-UB 的 UB 业务迁移代码沿用原 ns3ub 模块的
GPL-2.0-only 许可证。通过 FetchContent 获取的 AetherPDES 使用
BSD-3-Clause,依赖版本和声明见
THIRD_PARTY_NOTICES.md;安装时也会包含 Aether 的
完整许可证文本。