已关闭
[Bug-Report|缺陷反馈]: mhc_pre: CheckUbBufferSize 低估 UB 需求(未乘 Double Buffer 倍数) #2677
dingxu创建于  5月26日关闭于  6月10日
dingxu
5月26日 创建

Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.

Describe the current behavior / 问题描述 (Mandatory / 必填)

mhc/mhc_pre/op_host/op_tiling/arch35/mhc_pre_tiling.cppCheckUbBufferSize() 计算 UB 用量时,仅按单 Buffer 计算 fixedBufferSizedynamicBufferSize,未考虑实际 InitBuffer 使用了 kDoubleBufferCount=2(Double Buffer),导致校验值低于实际用量,可能通过校验但在运行时 UB 溢出。

代码片段mhc_pre_tiling.cpp 行 593-624):

ge::graphStatus MhcPreBaseTiling::CheckUbBufferSize()
{
    size_t fixedBufferSize = 0;
    size_t dynamicBufferSize = 0;
    const size_t floatSize = sizeof(float);

    if (tilingMode_ == TilingMode::SPLIT_BS) {
        fixedBufferSize = 80 * 1024 + 20 * 1024 + 40 * 1024;   // 单 Buffer 值
    } else {
        fixedBufferSize = 80 * 1024 + 32 * 1024 + 20 * 1024;   // 单 Buffer 值
    }

    dynamicBufferSize = static_cast<size_t>(matN_) * floatSize * 2;
    // ...
    size_t totalUbRequired = fixedBufferSize + dynamicBufferSize;  // 校验值偏低
    if (totalUbRequired > ubSize_) {
        OP_LOGE(context_->GetNodeName(), "UB buffer require %zu bytes exceeds ubSize %lu bytes", ...);
        return ge::GRAPH_FAILED;
    }
    return ge::GRAPH_SUCCESS;
}

关联代码mhc_pre_split_bs.h 行 158-159):

pipe_->InitBuffer(xInQueue_, kDoubleBufferCount, kXInQueueBufferBytes);   // bufferNum=2
pipe_->InitBuffer(outQueue_, kDoubleBufferCount, kOutQueueBufferBytes);   // bufferNum=2

问题分析InitBuffer 使用 kDoubleBufferCount=2,实际 UB 分配为单 Buffer 的 2 倍。但 CheckUbBufferSize 中的 fixedBufferSize 仍按单 Buffer 计算,校验值严重偏低。当 UB 空间处于单 Buffer 可用但双 Buffer 不足的临界区间时,校验会通过但运行时 UB 溢出。

Environment / 环境信息 (Mandatory / 必填)

  • 算子仓:ops-transformer
  • 算子名:MhcPre
  • 涉及文件:mhc/mhc_pre/op_host/op_tiling/arch35/mhc_pre_tiling.cppmhc/mhc_pre/op_kernel/arch35/mhc_pre_split_bs.h
  • 涉及行号:593-624(tiling)、158-159(kernel)

Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)

构造 MhcPre 算子 SPLIT_BS 或 SPLIT_ND 模式的 Tiling 参数,使 UB 单 Buffer 用量刚好低于 ubSize_ 但双 Buffer 用量超出 ubSize_。运行算子观察是否出现 UB 溢出异常。

Describe the expected behavior / 预期结果 (Mandatory / 必填)

fixedBufferSize 应乘以 Double Buffer 倍数(如 × 2),或按实际 InitBuffer 参数逐一计算总 UB 需求:

// 修复方案:fixedBufferSize 乘以 Double Buffer 倍数
if (tilingMode_ == TilingMode::SPLIT_BS) {
    fixedBufferSize = (80 * 1024 + 20 * 1024 + 40 * 1024) * kDoubleBufferCount;
} else {
    fixedBufferSize = (80 * 1024 + 32 * 1024 + 20 * 1024) * kDoubleBufferCount;
}

Special notes for this issue/备注 (Optional / 选填)

likedislike
huang-chuhong成员
5月26日 评论:

/assign @liweijian16

likedislike
CANN-robotCANN-robot成员
5月26日 将 liweijian16 设为负责人
CANN-robotCANN-robot成员
6月10日 关闭了 issue
CANN-robotCANN-robot成员
6月10日 添加了label:resolved