Pull Request已成功合入, 合并人@CANN-robot
(感谢 xun 的贡献)变更摘要
本 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 声明与设备数量查询。


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
/approveor/lgtm- Commenting
/approveimplies 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. 👍


/compile


compile


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


compile


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


描述
修复多个 AIV/block 共享同一 peer/QP 时,SQ 槽位分配、门铃发布和 CQ 消费缺少并发保护的问题。支持基于同一 workspace 并发调用现有 RDMA PUT、GET 和 PUT+notify 接口,沿用现有 Session、调用方提供的 scratch tile 及 WQE/CQE/软件门铃的 UB/MTE 路径。
关联的Issue
测试
TPutAsyncRdma.Vec_Int32_MultiAiv使用单机两张 A5 卡,由 rank 0 的 16 个 AIV 共享面向 rank 1 的 QP0,交替提交 16 字节 int32 payload 的 PUT 和 PUT+notify。各操作使用独立的数据槽和 signal,覆盖以下场景:本次双 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文档更新
移除中英文 TPUT_ASYNC_NOTIFY 文档中 RDMA 同 peer/QP 必须串行提交的限制;在现有 RDMA ST 中英文 README 的构建运行部分补充并发用例简介和筛选参数。
类型标签