已合并
feat(rdma): 支持多 AIV 共享 HNS1825 队列 #1727
feat(rdma): 支持多 AIV 共享 HNS1825 队列 #1727
已合并
xun创建于 20 天前
xun
xun
20 天前

描述

修复多个 AIV/block 共享同一 peer/QP 时,SQ 槽位分配、门铃发布和 CQ 消费缺少并发保护的问题。支持基于同一 workspace 并发调用现有 RDMA PUT、GET 和 PUT+notify 接口,沿用现有 Session、调用方提供的 scratch tile 及 WQE/CQE/软件门铃的 UB/MTE 路径。

  • 为每个 peer/QP 增加共享队列状态,通过原子 fetch-add 预留 WQE 区间,WQE 准备完成后按预留顺序推进就绪进度;PUT+notify 一次预留相邻的两个槽位。
  • 使用提交锁保护 owner 和门铃的有序发布,由队尾或批次边界的调用者提交;Wait/Test 和容量等待可补提交连续就绪的 WQE。独立 CQ 锁保护 CQE 消费,维护共享完成进度和错误状态,并结合 SQ/CQ 各自的实际深度控制槽位复用。
  • 在现有 RDMA ST 中增加 16 AIV 持续压力用例。RDMA ST 直接包含所需 MPI/ACL 头文件,并在自身文件内保留 Runtime 声明和设备数量查询,解除对包含 URMA Host 管理器的公共测试头的依赖。

关联的Issue

测试

TPutAsyncRdma.Vec_Int32_MultiAiv 使用单机两张 A5 卡,由 rank 0 的 16 个 AIV 共享面向 rank 1 的 QP0,交替提交 16 字节 int32 payload 的 PUT 和 PUT+notify。各操作使用独立的数据槽和 signal,覆盖以下场景:

  • 持续提交与完成查询:前半段连续提交,不主动调用 Test/Wait,用于检查容量等待时的 CQ 推进;后半段插入交错延迟,各 AIV 按不同节奏调用 Test/Wait,结束时等待各自的最后一个 Event,检查并发提交、完成查询及末尾请求的收尾。
  • 队列回绕与旧 Event:按实际队列深度设置足够的请求数,使 SQ/CQ 多次回绕。所有 AIV 完成后,再启动第二个 kernel 对各 AIV 保存的首尾 Event 执行 Test/Wait,检查槽位复用后旧 Event 的完成语义。
  • 数据与预留区间:逐 int32 精确比较 payload、notify signal、保护区(canary)、源数据及未使用区域;根据全部 Event 重建单槽或双槽的 WQE 预留区间,检查无重复、无缺口。
  • 最终队列状态:核对预留、就绪、已提交、已完成四个进度均等于预期 WQE 数,错误状态和两个锁均为零。

本次双 A5 运行的 SQ/CQ 深度分别为 16384/32768,每个 AIV 提交 65537 次操作,累计 1572880 个 WQE,完成 96 圈 SQ 和 48 圈 CQ 回绕。两个 rank 均为 valid=1,GTest PASS。

PTO_RDMA_BACKEND=HNS_1825 
python3 tests/script/run_st.py -r npu -v a5 -t comm/tput_async_rdma -g TPutAsyncRdma.Vec_Int32_MultiAiv -d -n 2

image.png

文档更新

移除中英文 TPUT_ASYNC_NOTIFY 文档中 RDMA 同 peer/QP 必须串行提交的限制;在现有 RDMA ST 中英文 README 的构建运行部分补充并发用例简介和筛选参数。

类型标签

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 xun 的贡献)
xunxun
20 天前 创建了 pull request,commit 8df8682b
atomgit-bot
atomgit-bot
20 天前 评论:

变更摘要

本 PR 修复多个 AIV/block 共享同一 peer/QP 时,SQ 槽位分配、门铃发布和 CQ 消费缺少并发保护的问题,使同一 workspace 上的 RDMA PUT、GET 与 PUT+notify 接口可被并发调用。核心做法是在 hns_1825_backend.hpp 中为每个 peer/QP 引入共享队列状态 QueueState,通过原子 fetch-add 预留 WQE 区间并按预留顺序推进就绪进度,配合提交锁与独立 CQ 锁保护 owner/门铃发布和 CQE 消费,同时调整 workspace 初始化与校验逻辑,并在 RDMA ST 中新增 16 AIV 持续压力用例。

主要改动

  • 新增共享队列状态与原子原语: 在 hns_1825_types.hpp 中新增 64 字节的 QueueState 结构(reserveHead、readyHead、postedHead、completedHead、postLock、cqLock、error),并为 SqContext 增加 stateAddr 字段;后端新增 QueueFence、AtomicLoad、TryQueueLock/UnlockQueue、FailQueue 等基于本地标量原子与 DSB_DDR 的同步原语,并新增错误码 kQueueIndexExhaustedError、常量 kMaxQueueIndex、kCqProgressBatch、kPostSendBatch。

  • WQE 预留与有序提交: 后端新增 ReserveWqes(用 atomicAdd 预留相邻 WQEBB,并按 SQ/CQ 实际深度 QueueCapacity 做容量等待)、SubmitReadyWqes(按预留顺序以 atomicCAS 推进 readyHead,仅由队尾或批次边界调用 PostSend)、TryPostSend/PostSend(在 postLock 内发布 owner 并响铃);PostSendReadWrite 与 PostSendWriteNotify 改为先预留再填充,PUT+notify 一次预留两个槽位。

  • CQ 消费并发保护: 将原 PollCq 拆分为带 cqLock 的 ProgressCq(按批次检查 CQE、维护 completedHead 与错误状态、仅在消费推进时响铃)与锁外轮询的 PollCq;TestEvent/WaitEventStatus 改为基于 completedHead 与 QueueError 判断,并可通过 SubmitReady 补提交就绪前缀。

  • Workspace 初始化与校验调整: hns_1825_workspace_manager 新增 stateDeviceBase 与 InitializeSqOwners(按 64 字节 WQEBB 初始化 owner 为无效),PrepareRdmaInfoLayout 在元数据后按 QueueState 对齐追加每 peer/QP 的状态区并写入 sq[peer].stateAddr,CQ 深度校验增加 cqRing < 4 限制;rdma_workspace_types.hpp 将 kRdmaWorkspaceVersion 从 1 升为 2;后端新增 IsQueueValid 统一校验队列深度、对齐与 stateAddr。

  • 新增并发压力测试用例: tput_async_rdma_kernel.cpp 新增 TPutAsyncRdmaConcurrentKernel、RunPutAsyncRdmaConcurrent 及 VerifyConcurrentRdmaBuffers,main.cpp 新增 TPutAsyncRdma.Vec_Int32_MultiAiv,并通过 blockCount 参数将 block 数下传至 kernel;rdma_test_backend.hpp 新增 ReadBackendQueueSnapshot 读取队列深度与状态快照,测试头文件与实现改为直接包含 acl/acl.h 及自持 Runtime 声明与设备数量查询。

likedislike
不准确?
atomgit-bot
atomgit-bot
20 天前 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
CANN-robotCANN-robot成员
20 天前 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
20 天前 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.


PR Approval Progress

✅ Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
docs ✅ kerwinair, echo_stone (2/2) ✅ kerwinair, echo_stone (2/1)
repo-cann/pto-isa ✅ kerwinair, echo_stone (2/2) ✅ kerwinair, echo_stone (2/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

mengxun233, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robotCANN-robot成员
20 天前 将zhangjian_hz11,csjlchen,zhezhou,bluesky901,changxianyu,Zhanghaijian,syfeng,shengxinchen,yinjie27_,zhoubotcam,HuangXingYuan_777,linjiashu,WenboCodes,qukelin,ChanKaLok,kerwinair,echo_stone设为评审人
CANN-robotCANN-robot成员
20 天前 将zhangjian_hz11,csjlchen,zhezhou,bluesky901,changxianyu,Zhanghaijian,syfeng,shengxinchen,yinjie27_,zhoubotcam,HuangXingYuan_777,linjiashu,WenboCodes,qukelin,ChanKaLok,kerwinair,echo_stone设为审查人
xun
xun
20 天前 评论:

/compile

likedislike
xunxun
20 天前 预合并成功(commit_id: bcf8eedbbd2fed1b324c8b7d1c8327a8075bc607)
xun
xun
20 天前 评论:

compile

likedislike
CANN-robot
CANN-robot成员
20 天前 评论:
🚀 CI 流水线已启动
📋 执行详情: 点击查看流水线
likedislike
CANN-robotCANN-robot成员
20 天前 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
20 天前 评论:
🚀 CI 流水线已启动
📋 执行详情: 点击查看流水线
likedislike
CANN-robotCANN-robot成员
20 天前 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
20 天前 添加了label:ci-pipeline-failed
xun
xun
20 天前 评论:

compile

likedislike
CANN-robot
CANN-robot成员
20 天前 评论:
🚀 CI 流水线已启动
📋 执行详情: 点击查看流水线
likedislike
CANN-robotCANN-robot成员
20 天前 删除了label:ci-pipeline-failed
CANN-robotCANN-robot成员
20 天前 添加了label:ci-pipeline-running
CANN-robotCANN-robot成员
20 天前 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
20 天前 添加了label:ci-pipeline-failed
CANN-robotCANN-robot成员
20 天前 删除了label:ci-pipeline-failed
CANN-robotCANN-robot成员
20 天前 添加了label:ci-pipeline-passed
XuWenquan成员
20 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
20 天前 添加了label:approved
liulei成员
19 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
19 天前 添加了label:lgtm
CANN-robotCANN-robot成员
19 天前 合入了pull request