本文为达坦科技DatenLord新系列文章【开源周报】的第四篇。
设立这一系列的初衷,是为了更透明地分享达坦科技开源项目的成长轨迹。在这里,我们不仅会同步项目近期的核心开发进展与技术突破,更将通过路线图为您揭示未来的演进方向。
📍 项目地址与参与
GitHub 仓库:https://github.com/open-rdma/open-rdma-driver
我们诚挚邀请所有对高性能网络、Rust系统编程或RDMA技术感兴趣的朋友点击链接关注、支持我们的项目。开源的力量源于社区。您的每一次关注、讨论或代码贡献,都是项目前进的重要动力。期待与您携手,共建更完善的高性能基础设施生态。
01、本周进展
本周核心目标:修复上周发现的关键bug,完善RCCL测试框架
本周主要围绕修复上周发现的问题展开工作,成功解决了NCCL重复注册MR问题和Post Recv WR时找不到QP的问题,同时通过重构提升了代码的类型安全性和可维护性。
- 修复NCCL重复注册MR问题 (commit: 04b3d53)
问题背景:
- 上周发现NCCL会注册两个映射到同一个物理页的MR
- 导致同一个物理页面被重复pin/unpin
- 影响硬件的MTT和PGT管理逻辑
解决方案:
- 实现了MrRegionManager来跟踪和管理内存区域的页面pinning
- 通过记录已注册的内存区域,避免重复pinning同一物理页面
- 在MTT和context层集成MR region manager
- 在virt_to_phy模块中添加虚拟地址对齐检查
实现细节:
- 新增rdma_utils/mr_region_manager.rs模块(496行代码)
- 修改mem/pa_va_map.rs,优化断言格式,提高可读性
- 更新rdma_utils/mtt.rs和verbs/ctx.rs,集成MR region manager
效果:
- 成功解决了NCCL重复注册MR导致的问题
- 确保每个物理页面只被pin一次
- 为RCCL测试扫清了重要障碍
- 引入编译时类型安全的地址类型 (commit: 5704dfc, 5f3c80f)
背景:
- 原有代码使用运行时对齐检查和手动位操作
- 容易出现对齐错误,且错误只能在运行时发现
重构内容:
- 引入AlignedVirtAddr〈N〉和AlignedPhysAddr〈N〉泛型类型
- 将运行时对齐检查提升为编译时类型保证
- 消除手动位操作,提高代码安全性
影响范围:
- mem/mod.rs:更新内存管理接口
- mem/virt_to_phy.rs:使用类型安全的地址转换
- verbs/ctx.rs:使用对齐地址类型
意义:
- 提供编译时页对齐保证,减少运行时错误
- 提高代码可维护性和可读性
- 为后续开发提供更安全的类型基础
- 修复Post Recv WR时找不到QP问题 (commit: 1ff3dcd)
问题描述:
- 上周发现在post接收WR时系统提示找不到对应的QP
- QP已经成功注册,但在某些状态下无法找到
根因分析:
- RDMA规范允许在QP处于INIT状态时post接收WR
- 但原有实现只支持在RTS状态post接收
- NCCL会在INIT状态下就post接收WR
解决方案:
- 在verbs/ctx.rs中添加pending_post_recv_queue
- 当QP处于INIT状态时,将post_recv请求暂存到队列中
- 当QP转换到RTR状态后,自动处理队列中的pending请求
实现细节:
- 修改verbs/ctx.rs,新增62行代码
- 支持在INIT状态下接受post_recv调用
- 实现状态转换时的自动pending请求处理
- 完善测试框架 (commit: 1968be2)
新增测试:
- write_imm.c:RDMA Write with Immediate测试(565行)
- nccl_pattern_test.c:模拟NCCL通信模式的测试(546行)
- run_dual_sim_test.sh:支持双仿真器的测试脚本(94行)
测试脚本优化:
- 新增test_write_imm_sim.sh和test_nccl_pattern_sim.sh
- 重构test_send_recv_sim.sh,改进错误处理
- 更新test_nompi.sh,支持新的测试模式
发现的问题:
- 通过NCCL模式测试发现了新的bug(具体问题需要进一步调试)
- 为下周的问题修复提供了测试基础
02、解决的关键问题
- NCCL重复注册MR问题
问题:NCCL会注册映射到同一物理页的多个MR
解决:通过MrRegionManager避免重复pin/unpin
状态:已完全修复
- Post Recv WR时找不到QP问题
问题:在post接收WR时找不到已注册的QP
解决:添加pending_post_recv_queue支持INIT状态下的post_recv
状态:已完全修复
- 代码类型安全问题
问题:运行时对齐检查容易出错
解决:引入编译时类型安全的对齐地址类型
状态:已完成重构
03、遗留问题
- 仿真器高压稳定性问题
状态:上周发现,本周未处理
现象:
INFO cocotb: ImmAssert failed in mkBsvTopWithoutHardIpInstance.topLevelDmaChannelMux @time=18331000: "/home/peng/projects/rdma_all/open-rdma-rtl/src/FullyPipelineChecker.bsv", line 118, column 25
INFO cocotb: -- DataStream checkFullyPipeline Failed:
name = mkTopLevelDmaChannelMux muxInst write, lastBeatCnt=9140, curBeatCnt=9163, delta=23后续计划:
调研cocotb仿真器行为,确认是否是仿真器代码问题
调试硬件RTL代码,检查流水线控制逻辑
分析高压场景下的时序和竞争条件
- NCCL Pattern测试中发现的新bug
time=20679000: genFirstBeat -> isFirst: True, isLast: False
time=20681000: genSecondBeat -> isFirst: False, isLast: False
time=20683000: genThirdBeat -> isFirst: False, isLast: False
... (之后没有继续生成,缺少isLast=True的结尾beat) ✗ 异常 状态:本周新发现
问题描述: 通过nccl_pattern_test发现RTL仿真器输出了异常的以太网数据流。经分析RTL simulator log,发现Ethernet Packet Generator输出了有头无尾的stream。
异常现象: 第一个数据包只生成了开头,没有isLast标记:
time=20679000: genFirstBeat -> isFirst: True, isLast: False
time=20681000: genSecondBeat -> isFirst: False, isLast: False
time=20683000: genThirdBeat -> isFirst: False, isLast: False
... (之后没有继续生成,缺少isLast=True的结尾beat) ✗ 异常但第二个数据包生成了完整的以太网帧(有头有尾):
time=20747000: genFirstBeat -> isFirst: True, isLast: False
time=20749000: genSecondBeat -> isFirst: False, isLast: False
time=20751000: genThirdBeat -> isFirst: False, isLast: False
... (中间的payload beats)
time=20837000: genMoreBeat -> isFirst: False, isLast: True ✓ 正常结束
初步分析:
- Ethernet Packet Generator在处理第一个数据包时状态机出现异常
- 第一个包未能正常完成,缺少结尾标记,但第二个包恢复正常
- 可能是初始状态或首包处理逻辑存在问题
- 需要进一步调查RTL中的数据包生成状态机和初始化逻辑
后续计划:
调试nccl_pattern_test,定位具体问题
分析问题根因并修复
04、下周规划
短期任务(最高优先级)
- 调试并修复NCCL Pattern测试中发现的bug
- 运行nccl_pattern_test定位问题
- 分析问题根因
- 实现修复方案
- 完成RCCL sim模式基础测试
- 验证所有修复的正确性
- 运行完整的RCCL测试套件
- 确保基础功能稳定
- 解决仿真器高压稳定性问题
- 深入分析checkFullyPipeline失败的根因
- 调研cocotb仿真器行为
- 如果是RTL问题,与硬件团队协作修复
中期任务
- 完善测试框架
- 增加更多NCCL模式的测试用例
- 实现测试结果自动验证机制
- 添加性能基准测试
- 推进RCCL完整功能支持
- 在所有bug修复完成后,验证RCCL完整功能
- 支持更多collective操作测试
长期任务
- Driver 重构
- 优化代码架构,提升可维护性
- 重构核心模块,使得模块对外接口更为简洁同时正确处理错误
- GPU 内存注册支持
- 调研 dma-buf 内核接口的实现细节
- 设计内核模块中的 GPU 内存映射机制
- 实现 ibv_reg_dmabuf_mr verbs 支持
05、本周总结
本周主要聚焦于修复上周发现的关键问题:
成果:
- 成功解决了NCCL重复注册MR问题,实现了MrRegionManager
- 修复了Post Recv WR时找不到QP的问题,支持INIT状态下的post_recv
- 进行了一个小重构,引入编译时类型安全保证
- 完善了测试框架,添加了NCCL模式测试
挑战:
- 仿真器高压稳定性问题暂未处理
- 通过新增测试发现了新的bug,可能是rtl硬件代码导致的,需要进一步调试
达坦科技始终致力于打造高性能AI+Cloud基础设施平台,积极推动AI应用的落地。达坦科技通过软硬件深度融合的方式,提供AI推理引擎和高性能网络,为AI应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对AI+Cloud的需求。
公众号:达坦科技DatenLord
DatenLord官网:
https://datenlord.github.io/zh-cn/
知乎账号:
https://www.zhihu.com/org/da-tan-ke-ji
B站:
https://space.bilibili.com/2017027518
如果您有兴趣加入达坦科技Rust前沿技术交流群、硬件敏捷开发和验证方法学讨论群或AI Infra 交流群,请添加小助手微信:DatenLord_Tech
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。