已关闭
[Bug][arch35][pooling] AdaptiveAvgPool3dGrad/MaxPool3DGrad/MaxPoolGrad kernel 使用 SyncAll 但 Tiling 未设置 SetScheduleMode(BATCH_MODE) #3866
tangweiwei2创建于  7月6日关闭于  7月7日
tangweiwei2成员
7月6日 创建

问题描述 (Describe the current behavior)

在 arch35(Ascend950)场景下,pooling 类算子 AdaptiveAvgPool3dGradMaxPool3DGradMaxPoolGrad 的 kernel 中使用了 SyncAll() 进行全核同步,但其 op_host tiling 代码中均未调用 SetScheduleMode(BATCH_MODE)(即 SetScheduleMode(1))。

SyncAll() 要求所有参与同步的核同时启动并在同一调度批次内运行。若未设置 BatchMode,系统默认按核分批调度,会导致:

  • 部分核尚未启动时,已启动的核在 SyncAll() 处无限等待,引发死锁/挂起
  • 或核间梯度数据依赖未就绪即被读取,导致结果错误

涉及算子与代码位置

# 算子 SyncAll 调用位置 tiling 入口函数 tiling 文件
1 AdaptiveAvgPool3dGrad op_kernel/adaptive_avg_pool3d_grad_nc_large_float.h:123adaptive_avg_pool3d_grad_float.h:126adaptive_avg_pool3d_grad_nc_large_cast.h:128,172adaptive_avg_pool3d_grad_cast.h:134 AdaptiveAvgPool3dGrad tiling op_host/adaptive_avg_pool3d_grad_tiling.cpp
2 MaxPool3DGrad op_kernel/arch35/max_pool3d_grad_simt_kernel.h:96 Tiling4MaxPool3DGrad op_host/arch35/max_pool3d_grad_tiling.cpp
3 MaxPoolGrad op_kernel/arch35/max_pool_grad_simt.h:109 Tiling4MaxPoolGrad op_host/arch35/max_pool_grad_tiling.cpp

这些 pooling grad 算子均通过 SyncAll() 实现核间同步(各核计算梯度 partial 后,全核同步确保数据一致性)。三个算子均有明确的 ascend950 binary config,arch35 场景下会触发该问题。

经确认,所有算子 tiling 文件全文无 SetScheduleMode 调用:

$ grep -rn "SetScheduleMode" pooling/adaptive_avg_pool3d_grad/op_host/ pooling/max_pool3d_grad/op_host/ pooling/max_pool_grad/op_host/
(无输出)

环境信息 (Environment)

  • 硬件:Atlas A3 / Ascend 950 (arch35)
  • 仓库:cann/ops-nn
  • 分支:master

重现步骤 (Steps to reproduce)

  1. 在 Ascend 950(arch35)环境下编译运行上述任一 pooling grad 算子的 ST 测试;
  2. 当多核参与调度时(blockDim > 1),因未设置 BatchMode,核间调度存在批次差异;
  3. SyncAll() 处可能发生挂起或梯度结果异常。

预期结果 (Describe the expected behavior)

各算子 tiling 中应调用 SetScheduleMode(1) 设置为 BatchMode,确保所有核同时启动,使 SyncAll() 全核同步正确生效。参考仓库中已有正确实现,例如:

  • pooling/adaptive_max_pool3d_grad/op_host/adaptive_max_pool3d_grad_normal_tiling.cpp:199context_->SetScheduleMode(1);
  • pooling/avg_pool3_d_grad/op_host/avg_pool_3d_grad_tiling.cpp:774tilingContext_->SetScheduleMode(BATCH_MODE);

修复建议

在各算子的 tiling 入口函数中添加:

context->SetScheduleMode(1);  // kernel 使用 SyncAll 全核同步,需设置为 BatchMode

具体位置:

  1. AdaptiveAvgPool3dGrad:对应 tiling 函数(adaptive_avg_pool3d_grad_tiling.cpp
  2. MaxPool3DGradTiling4MaxPool3DGradmax_pool3d_grad_tiling.cpp
  3. MaxPoolGradTiling4MaxPoolGradmax_pool_grad_tiling.cpp

备注 (Special notes)

此问题为通过代码静态排查发现(模式:kernel 含 SyncAll 但 tiling 缺 SetScheduleMode)。同类问题在仓库其他算子类别(hash / conv / loss / norm / quant / index 等)中也存在,将分别提 issue 跟踪。

likedislike
Xxieshengwei1024成员
7月6日 将 xieshengwei1024 设为负责人
tangweiwei2成员
7月6日 评论:

pooling类算子问题,已确认存在问题,安排@xieshengwei1024解决

likedislike
Xxieshengwei1024成员
7月6日 将 liuchuangdev 设为负责人
Xxieshengwei1024成员
7月6日 移除了负责人 xieshengwei1024
yuning_chenyuning_chen成员
7月6日 将 tangweiwei2 设为负责人
CANN-robotCANN-robot成员
7月7日 关闭了 issue
CANN-robotCANN-robot成员
7月7日 添加了label:resolved