已关闭
[Bug-Report|缺陷反馈]: [工具检测]conv3d_backprop_filter_v2 在 Ascend950 一核双 AIV 场景下 ClearWorkspace 清零 GM workspace 缺少 AIV 间同步,racecheck 检出 28 条 WAW #5513
Goldfish_of_Siris创建于 23 天前关闭于 19 天前
23 天前 修改标题为 “[Bug-Report|缺陷反馈]: [工具检测]conv3d_backprop_filter_v2 在 Ascend950 一核双 AIV 场景下 ClearWorkspace 清零 GM workspace 缺少 AIV 间同步,racecheck 检出 28 条 WAW”,原标题为“[Bug-Report|缺陷反馈]: conv3d_backprop_filter_v2 在 Ascend950 一核双 AIV 场景下 ClearWorkspace 清零 GM workspace 缺少 AIV 间同步,racecheck 检出 28 条 WAW”
23 天前 修改标题为 “[Bug-Report|缺陷反馈]: [工具检测]conv3d_backprop_filter_v2 在 Ascend950 一核双 AIV 场景下 ClearWorkspace 清零 GM workspace 缺少 AIV 间同步,racecheck 检出 28 条 WAW”,原标题为“[Bug-Report|缺陷反馈]: conv3d_backprop_filter_v2 在 Ascend950 一核双 AIV 场景下 ClearWorkspace 清零 GM workspace 缺少 AIV 间同步,racecheck 检出 28 条 WAW”
23 天前 将 yuxin5 设为负责人
yuning_chen
23 天前 评论:
23 天前 评论:
您好,感谢反馈,问题已收到,当前 @yuxin5 正在跟踪处理。


19 天前 关闭了 issue
19 天前 添加了label:resolved
Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
Describe the current behavior / 问题描述 (Mandatory / 必填)
1. 现象:racecheck 报 28 条 GM WAW(Write-After-Write)
算子
conv3d_backprop_filter_v2在 Ascend950 上使用 MindStudio Sanitizer(mssanitizer)做竞争检测(racecheck)时,检测出 28 条Potential WAW hazard detected at GM,事件全部集中在ClearWorkspace(清零 GM workspace)的写操作,例如:地址规律非常强:
block(2k)与block(2k+1)写同一个 GM 地址,相邻对的地址间隔0x40000(256KB),正好等于算子的CUBE_WORKSPACE = TOTAL_L0C_SIZE。共 28 对,覆盖 block 0–55。2. 线索:同一 GM 地址被"一对 AIV"写
工具日志(
mssanitizer_*.log)显示:blockDim=28);aic-k→aiv-2k/aiv-2k+1)。对应的事件流(均为
ClearWorkspace的 GM 清零写,同一指令pc=0x47b78):即 同一物理核的两个 AIV(aiv-0/aiv-1)都在执行
ClearWorkspace,向同一块 GM workspace 清零,且各自写前没有等待对方的写完成信号(aiv-1 写前等待的 flagid:12/9 与 aiv-0 写后发出的 flagid:2 不配对)。3. 分析:Ascend950 双 AIV 可并行、需要 AIV 间同步
在 Ascend950(
__NPU_ARCH__ == 3510)上,同一物理核的两个 vector 单元(AIV)是可独立并行的执行流,它们之间确实可能存在竞争,也存在 AIV 间的同步指令。因此 racecheck 将 aiv-0/aiv-1 作为独立执行流检测跨核写写冲突是合理的。算子代码也明确为 3510 双 AIV 做了适配(见
conv_bp_sub_func_deterministic_calculate.h,均在#if __NPU_ARCH__ == 3510下):subCoreInx_ = (isOddCore << 1) + GetSubBlockIdx(); // 双 AIV → 不同 subCoreInx ... addrOffset[this->ctx.subCoreInx_] ... // 归约读写按 sub-core 分独立子区域 ... + GetSubBlockIdx() * QUARTER_CUBE_WORKSPACE // GM 输出按 sub-block 分区域说明算子知道双 AIV 会并行、需要给它们分独立子区域。但
ClearWorkspace(清零路径)漏了这条处理。4. 根因:ClearWorkspace 无条件被双 AIV 执行,清同一块 GM workspace 且无 AIV 间同步
conv3d_dw_v2_basic_block.h的CalcIterateAIV 段:if ASCEND_IS_AIV { this->ClearWorkspace(this->workspaceGm_[this->offsetCubeWorkSpaceC_]); // ❌ 无条件,双 AIV 都执行 VecNotifyCube(); this->dw_.Iterate(); VecWaitCube(); if (isCurIter) { this->dw_.DeterministicReduceKInUb(this->yGm_[this->offsetC_], this->workspaceGm_); } ... }ClearWorkspace清的目标是workspaceGm_[offsetCubeWorkSpaceC_],offsetCubeWorkSpaceC_(conv3d_dw_v2_basic_block.h:125)只按 block/core 维度计算,不含GetSubBlockIdx(),即清的是整块 block 级 GM workspace(CUBE_WORKSPACE粒度);GetSubBlockIdx()条件,双 AIV 都会执行清零写同一块 GM workspace;ClearWorkspace内部只有核内 pipe 事件同步(MTE3_V/V_MTE3/MTE3_MTE2),其后经共享 cube 的VecNotifyCube/VecWaitCube只同步 AIV↔AIC,双 AIV 之间没有直接同步指令;GetSubBlockIdx()*QUARTER_CUBE_WORKSPACE或addrOffset[subCoreInx]给双 AIV 分配了独立子区域——唯独清零路径没有。因此:同一物理核的两个 AIV 无同步地写同一块 GM workspace,构成真实的 WAW,racecheck 检出合理。
5. 涉及代码位置(ops-nn 仓)
conv/conv3d_backprop_filter_v2/op_kernel/arch35/conv3d_backprop_filter_v2/conv3d_dw_v2_basic_block.hCalcIterateAIV 段(约 210-225 行)ClearWorkspace(...)无条件被双 AIV 执行ClearWorkspace定义处conv3d_backprop_filter_v2.h(约 305-328 行)Environment / 环境信息 (Mandatory / 必填)
环境信息
--soc=ascend950,soc_version=Ascend950PR_9599,__NPU_ARCH__==3510),deviceId 7/3conv/conv3d_backprop_filter_v2(9.1.0 分支)racecheck{2,2,7,7,7}FP32,weight{2,2,1,1,1},groups=1(streamK 确定性计算路径)Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
重现步骤
cd ops-nn bash build.sh --pkg --soc=ascend950 --ops=conv3d_backprop_filter_v2 -j96 --mssanitizer ./build_out/cann-ops-nn-custom_linux-x86_64.run # 部署cd ops-nn/build mssanitizer -t racecheck --log-level=error -- ./test_aclnn_conv3d_backprop_filter_v2ERROR: Potential WAW hazard detected at GM,地址为成对的0x1201a2200000、0x1201a2240000…(间隔 0x40000),两事件分属 aiv-0/aiv-1(同物理核双 vector)。mindstudio_sanitizer_log/mssanitizer_*.log:blockDim:28、aic 0-27/aiv 0-55,确认同一 GM 地址由同一物理核的两个 AIV 各自ClearWorkspace写入。Describe the expected behavior / 预期结果 (Mandatory / 必填)
预期结果
ClearWorkspace的 GM workspace 清零应在 Ascend950 双 AIV 场景下正确处理,建议二者之一:if (GetSubBlockIdx() == 0) ClearWorkspace(...),再配合CrossCoreSetFlag/WaitFlag让双 AIV 对齐);或CrossCoreSetFlag<0, PIPE_MTE3>/CrossCoreWaitFlag,新 flag id=13)后重编重跑:No error detected);gradWeight=686.0,与修复前一致(无死锁、功能正确)。Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
见附件:
81_conv3d_backprop_filter_v2.zip
Special notes for this issue/备注 (Optional / 选填)