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


5月26日 将 liweijian16 设为负责人
6月10日 关闭了 issue
6月10日 添加了label:resolved
/assign @liweijian16


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.cpp的CheckUbBufferSize()计算 UB 用量时,仅按单 Buffer 计算fixedBufferSize和dynamicBufferSize,未考虑实际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 / 必填)
mhc/mhc_pre/op_host/op_tiling/arch35/mhc_pre_tiling.cpp、mhc/mhc_pre/op_kernel/arch35/mhc_pre_split_bs.hSteps 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; }Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
无
Special notes for this issue/备注 (Optional / 选填)