已关闭
[Bug-Report|缺陷反馈][工具检测]: mmad_mx和load_data_2dmx_l12l0算子存在未初始化问题 #1741
liusa002创建于 10 天前关闭于 8 天前
8 天前 将 UFOunder 设为负责人
UFOunder
8 天前 评论:
8 天前 评论:
您好,感谢反馈。
由于MMAD计算的方式,补齐的数据参与计算但不会影响有效数据的值,因此未初始化的内存不会影响计算结果,初始化反而会增加开销,影响性能,因此不建议进行额外的初始化。
对于MMAD的尾块计算,硬件通常会按照对齐后的块大小执行计算,因此补齐区域也可能参与内部计算。但只要通过尾块参数明确有效计算范围,补齐区域对应的计算结果不会写入有效的M/N/K数据范围,因此不会影响有效输出数据。
需要说明的是,该结论适用于以下场景:
- 使用MMAD类接口进行普通矩阵乘或矩阵乘累加;
- 只读取有效输出区域;
- 不依赖补齐区域的数值;
- 不涉及需要对Global Memory原有值进行累加的Split-K、AtomicAdd等场景。
如果使用了Split-K或AtomicAdd,输出缓冲区在首次累加前仍需要先清零,否则无效区域或原有数据可能参与累加并造成精度问题,具体请参考 EnableMultiCoreSplitK。
关于sanitizer报告的未初始化内存告警,可以根据使用场景采用以下方式规避:
在测试或sanitizer专用版本中,将A/B矩阵尾块的补齐区域显式填充为0(或其他确定值),再执行MMAD。正式性能版本可以不执行该填充。
因此,未初始化的补齐内存在普通MMAD尾块计算中通常不会影响有效结果,生产性能路径不建议为了该原因额外初始化全部输入内存;但如果需要通过sanitizer检查,建议仅在sanitizer或测试路径中初始化补齐区域,或者通过正确设置尾块参数避免无效范围参与计算。
相关文档:


Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
Describe the current behavior / 问题描述 (Mandatory / 必填)
使用未初始化检测拉起算子mmad_mx和load_data_2dmx_l12l0,存在未初始化问题。
Environment / 环境信息 (Mandatory / 必填)
Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
1.下载并安装CANN包
https://cmc-szv.clouddragon.huawei.com/cmcversion/index/releaseView?deltaId=14913606472500480&isSelect=Software
2.下载asc-devkit并切换到对应版本:

git clone https://gitcode.com/cann/asc-devkit.gitgit checkout c65e4db93.切到算子路径:
cd asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_mx/4.在
CMakeLists.txt中加上检测编译选项--cce-enable-sanitizer -g:5.编译算子并使用检测拉起:
6.能够看到告警:
cd asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/load_data_2dmx_l12l0/在
CMakeLists.txt中加上检测编译选项--cce-enable-sanitizer -g,然后参考README.md进行编译和运行:mssanitizer -t initcheck --log-level=error --full-backtrace=yes --log-file=san_error.log ./demo有告警:
Describe the expected behavior / 预期结果 (Mandatory / 必填)
预期没有未初始化告警。
Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
以mmad_mx为例进行分析:
Nd2Nz只搬运有效数据(A:N=40 行;B:N=50 行),而LoadData2D按 16 行分形整块读取(mstep=3→48 行 / mstep=4→64 行,kstep=2 两个 k 分形):mAlignL1=48(mmad_mx.asc:51),第 40~47 行共 8 行从未被 Nd2Nz 写入。8 行 × 32B × 2 个 k 分形 = 512B-> 512B未初始化读。nAlignL1=64(mmad_mx.asc:60),第 50~63 行共 14 行从未写入。14 行 × 32B × 2 个 k 分形 = 896B-> 896B未初始化读。Special notes for this issue/备注 (Optional / 选填)