已关闭
[Bug-Report|缺陷反馈]: Pad tiling 中 Brcb 尾块 repeat times 计算错误,尾轴元素不足 8 时 Brcb 不执行导致数据丢失 #1518
JacsonPile创建于 8月17日关闭于 8月18日
8月17日 将 chenyiyuan 设为负责人
8月17日 将 m0_56712298 设为负责人
8月17日 关联了pull request:fix: 修复Pad tiling中Brcb尾块repeat times计算错误(#1518)
8月17日 issue状态由 待办的 改变为 修复中
8月17日 关联了pull request:【Fix]】修复 Reduce compact 输出与 aligned 输入融合时的精度问题
chenyiyuan
8月18日 评论:
8月18日 评论:
你好,该问题已确认,正在修复中。


8月18日 关闭了 issue
8月18日 添加了label:resolved
8月19日 issue状态由 修复中 改变为 已解决
Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
Describe the current behavior / 问题描述 (Mandatory / 必填)
PadTilingFunc函数在计算 Brcb 尾块的 repeat times 时,使用整数除法brcbFractalTail / 8对尾块元素数进行 8 对齐切分。当尾块元素数brcbFractalTail ∈ [1, 7]时,brcbFractalTail / 8经整数截断结果为 0,导致brcbFractalTailRepeatTimes与brcbFractalTailRepeatTimesTail均被计算为 0。kernel 侧
pad_base_impl.h的 2201 架构UnAlignedPad路径依据这两个 tiling 字段决定是否发射Brcb指令:// pad_base_impl.h:215-228 if (brcbFractalCount == brcbFractal) { for (uint32_t i = 0; i < brcbFractalTailRepeatTimes; i++) { // 0 次,不执行 Brcb(...); } if (brcbFractalTailRepeatTimesTail) { // 0,条件为 false,不执行 Brcb(...); } tmp1RowFull = brcbFractalTail; }两个循环/分支均不执行,尾块的 1~7 个元素不会从 srcTensor 加载到 tmp1,最终输出数据错误。
缺陷代码位置
impl/adv_api/tiling/pad/pad_tiling_impl.cpp第 169-170 行:uint32_t brcbFractalTailRepeatTimes = brcbFractalTail / 8 / maxRepeatTimes; // [1,7]/8 = 0 uint32_t brcbFractalTailRepeatTimesTail = brcbFractalTail / 8 % maxRepeatTimes; // [1,7]/8 = 0其中
brcbFractalTail = srcHeight * srcWidth % brcbTiling,即总元素数对brcbTiling取余后的尾块剩余元素数。对比:同文件中正确的向上取整写法
第 151-152 行的
widthFractalTailAlingned已正确使用 ceiling division 处理非对齐尾块:uint32_t widthFractalTailAlingned = ((widthFractalTail - 1) / (PAD_ONE_BLK_SIZE / typeSize) + 1) * (PAD_ONE_BLK_SIZE / typeSize);说明 Brcb 尾块路径遗漏了同样的向上取整处理。
Environment / 环境信息 (Mandatory / 必填)
NpuArch::DAV_2201(Ascend910B)DAV_3510/DAV_5102:使用 SIMD Reg API(pad_3510_impl.h),不走 Brcb__NPU_ARCH__ == 2002(Ascend910A):走DuplicateLastDimImpl,已正确处理tailM = srcSize % BRCB_BROADCAST_NUMBERwidth * sizeof(T) % 32 != 0(非 32B 对齐,进入UnAlignedPad路径)且srcHeight * srcWidth % brcbTiling ∈ [1, 7]Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
触发条件推导
以
typeSize=2(half)、stackBufferSize=4096为例:当
srcHeight * srcWidth对 64 取余结果落在[1, 7]时触发。例如srcHeight=1, srcWidth=65(total=65,brcbFractalTail=1)。数值验证
/8触发面扫描(width 非 32B 对齐,half 类型)
复现步骤
cann/asc-devkit仓库9.2.0-beta.1分支[1, 65](half 类型)的 Pad 调用,leftPad=0, rightPad=0,使width * sizeof(half) = 130非 32B 对齐stackBufferSize=4096的 sharedTmpBufferPad(dst, src, padParams, sharedTmpBuffer, tiling),tiling 由PadTilingFunc生成Describe the expected behavior / 预期结果 (Mandatory / 必填)
当
brcbFractalTail ∈ [1, 7]时,Brcb 应至少执行 1 次 repeat(处理这 1~7 个元素),而非 0 次。即
brcbFractalTail / 8应使用向上取整,使brcbFractalTailRepeatTimesTail >= 1,保证尾块数据被加载。Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
Special notes for this issue/备注 (Optional / 选填)
调用链
Tiling 字段定义(
include/adv_api/pad/pad_tilingdata.h)BEGIN_TILING_DATA_DEF(PadTiling) ... TILING_DATA_FIELD_DEF(uint32_t, brcbTiling); TILING_DATA_FIELD_DEF(uint32_t, brcbFractal); TILING_DATA_FIELD_DEF(uint32_t, brcbFractalTail); TILING_DATA_FIELD_DEF(uint32_t, maxRepeatTimes); TILING_DATA_FIELD_DEF(uint32_t, brcbTilingRepeatTimes); TILING_DATA_FIELD_DEF(uint32_t, brcbTilingRepeatTimesTail); TILING_DATA_FIELD_DEF(uint32_t, brcbFractalTailRepeatTimes); // bug 字段 1 TILING_DATA_FIELD_DEF(uint32_t, brcbFractalTailRepeatTimesTail); // bug 字段 2 END_TILING_DATA_DEF;分支对比
ge::Shape→TensorShape、新增DAV_5102等无关改动