已关闭
[Bug-Report|缺陷反馈]:QuantGroupedMatmulInplaceAdd(arch35 hifp8变体)极小shape场景存在多处未初始化内存读取问题 #5030
s_wei创建于 16 天前关闭于 14 天前
游震
16 天前 评论:
16 天前 评论:
/assign @zhoushaolong


16 天前 将 zhoushaolong 设为负责人
14 天前 关闭了 issue
14 天前 添加了label:resolved
/assign @zhoushaolong


Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
Describe the current behavior / 问题描述 (Mandatory / 必填)
通过MindStudio Sanitizer initcheck工具检测,QuantGroupedMatmulInplaceAdd算子arch35 hifp8变体在极小shape输入场景下,检出总计233条未初始化内存读取(uninitialized read)问题,覆盖GM、L1、PRIVATE三大地址空间,经事件级A/B对照实验验证,非工具误报,工具影子状态与设备真实运行状态完全一致。当前问题不影响算子最终数值输出结果,但存在内存读写不规范、代码健壮性不足问题,存在潜在风险,需优化修复。
问题分为两类核心现象,具体明细如下:
GM/L1地址空间:按块对齐装载越界多读未初始化字节(共3条)
算子量化矩阵计算链路(cgmct封装 + AscendC matmul库)基于硬件块对齐、分块搬运逻辑,在极小非对齐shape场景下,GM、L1内存加载阶段会超出业务真实有效数据范围,多读未初始化内存字节。
**- GM空间(2条):**有效输入仅6B,硬件按块对齐读取9B,超出的3B内存未经过宿主初始化,该部分越界数据最终被硬件MMAD越界丢弃机制拦截,不参与有效计算输出。
**- L1空间(1条):**DMA仅初始化L1前32B内存,后续LOAD_L1_MX_2D指令连续读取64B内存,后半段32B无任何前置写操作,属于未初始化内存读取,读取的脏数据最终未纳入有效结果计算。
PRIVATE栈空间:结构体未完整初始化即执行读改写操作(共230条)
算子依赖的cgmct量化matmul公共模板中,运行时/临时tiling结构体存在初始化不完整问题。内核执行时仅对结构体大部分字段赋值,遗漏尾部字段,后续直接对未初始化的栈内存执行read-modify-write读写操作,属于C/C++未定义行为。该问题为模板通用问题,非本算子独有,在grouped_matmul_swiglu_quant_v2等算子中同样复现,高频触发大量未初始化读取告警。
Environment / 环境信息 (Mandatory / 必填)
硬件型号:昇腾Ascend 950(soc=ascend950)
CANN版本:9.1.0
Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
固定极小shape输入(x1/x2为HIFLOAT8类型{2,3},有效数据各6B),通过sanitizer插桩编译并运行算子eager示例,可稳定复现问题,具体步骤如下:
bash build.sh --pkg --ops=quant_grouped_matmul_inplace_add,grouped_matmul --soc=ascend950 --op_debug_config "sanitizer" -j96
bash build.sh --run_example quant_grouped_matmul_inplace_add eager cust --soc=ascend950
time mssanitizer -t initcheck --log-level=error -- bash build.sh --run_example quant_grouped_matmul_inplace_add eager cust --soc=ascend950
执行后可稳定检出233条uninitialized read告警,包含GM 2条、L1 1条、PRIVATE 230条。
Describe the expected behavior / 预期结果 (Mandatory / 必填)
当前问题无业务功能影响,算子输出数值完全正确,但不符合内存安全编码规范,预期完成以下优化,彻底消除未初始化内存读取问题,提升算子健壮性与兼容性,满足sanitizer内存安全检测标准:
**1. GM内存优化:**适配硬件分块对齐读取逻辑,宿主侧按算子实际内存读取范围初始化内存,或库侧增加尾块裁剪逻辑,杜绝越界读取未初始化GM内存;
**2. L1内存优化:**对L1缓冲区未写入的Pad区域做清零处理,或精准控制MX装载范围,避免读取无效脏内存;
**3. PRIVATE栈内存优化:**统一整改cgmct公共matmul模板,对运行时、临时tiling结构体全部成员字段完整初始化,杜绝未赋值先读的未定义行为,根治批量栈内存未初始化读取告警。
Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
3fc61fb4bf3d4cf2bee0422709d957bd.zip
Special notes for this issue/备注 (Optional / 选填)