已关闭
[Bug-Report|缺陷反馈][工具检测]: mmad_mx和load_data_2dmx_l12l0算子存在未初始化问题 #1741
liusa002创建于  10 天前关闭于  8 天前
liusa002
10 天前 创建

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 / 必填)

  • HDK 版本:25.1.rc2
  • CANN 版本:9.2.0
  • 硬件形态:Ascend950DT
  • 操作系统版本:openEuler 24.03

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

1.下载并安装CANN包
https://cmc-szv.clouddragon.huawei.com/cmcversion/index/releaseView?deltaId=14913606472500480&isSelect=Software

bash Ascend-cann-toolkit_9.2.0_linux-aarch64.run --install --install-path=/home/Ascend-B070 --quiet
bash Ascend-cann-950-ops_9.2.0_linux-aarch64.run --install --install-path=/home/Ascend-B070 --quiet
source /home/Ascend-B070/cann/set_env.sh

2.下载asc-devkit并切换到对应版本:
git clone https://gitcode.com/cann/asc-devkit.git
git checkout c65e4db9
3.切到算子路径:
cd asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_mx/
4.在CMakeLists.txt中加上检测编译选项--cce-enable-sanitizer -g:
image.png

5.编译算子并使用检测拉起:

SCENARIO_NUM=1
mkdir -p build && cd build
cmake .. -DCMAKE_ASC_ARCHITECTURES=dav-3510 -DSCENARIO_NUM=$SCENARIO_NUM && make -j36
python3 ../scripts/gen_data.py -scenarioNum $SCENARIO_NUM
mssanitizer -t initcheck --log-level=error --full-backtrace=yes --log-file=san_error.log ./demo
python3 ../scripts/verify_result.py output/output.bin output/golden.bin

6.能够看到告警:

[mssanitizer] Start initcheck sanitizer on kernel "void KernelMmadMXCustom<40u, 50u, 70u>(unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*)"
====== ERROR: uninitialized read of size 512
======    at 0x0 on L1 in "void KernelMmadMXCustom<40u, 50u, 70u>(unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*)"
======    in block aic(0) on device 3
======    code in pc current 0x214 (serialNo:32)
======    #0 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/dav_3510/kernel_operator_mm_impl.h:337:17
======    #1 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/kernel_operator_mm_load2d_impl.h:217:9
======    #2 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/kernel_operator_mm_intf_impl.h:120:5
======    #3 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_mx/mmad_mx.asc:270:9
======    #4 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_mx/mmad_mx.asc:122:9
======    #5 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_mx/mmad_mx.asc:410:8
======    #6 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_mx/mmad_mx.asc:418:9

====== ERROR: uninitialized read of size 896
======    at 0x30000 on L1 in "void KernelMmadMXCustom<40u, 50u, 70u>(unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*)"
======    in block aic(0) on device 3
======    code in pc current 0x234 (serialNo:34)
======    #0 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/dav_3510/kernel_operator_mm_impl.h:387:17
======    #1 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/kernel_operator_mm_load2d_impl.h:222:9
======    #2 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/kernel_operator_mm_intf_impl.h:120:5
======    #3 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_mx/mmad_mx.asc:298:9
======    #4 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_mx/mmad_mx.asc:126:9
======    #5 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_mx/mmad_mx.asc:410:8
======    #6 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_mx/mmad_mx.asc:418:9

[mssanitizer] Sanitizer finished on kernel "void KernelMmadMXCustom<40u, 50u, 70u>(unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*)". See all detected errors above.
  1. load_data_2dmx_l12l0算子也有类似告警:
    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
    有告警:
[mssanitizer] Start initcheck sanitizer on kernel "void KernelLoadDataL12L0Load2DMX<40u, 50u, 70u>(unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*)"
====== ERROR: uninitialized read of size 512
======    at 0x0 on L1 in "void KernelLoadDataL12L0Load2DMX<40u, 50u, 70u>(unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*)"
======    in block aic(0) on device 4
======    code in pc current 0x214 (serialNo:32)
======    #0 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/dav_3510/kernel_operator_mm_impl.h:337:17
======    #1 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/kernel_operator_mm_load2d_impl.h:217:9
======    #2 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/kernel_operator_mm_intf_impl.h:120:5
======    #3 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/load_data_2dmx_l12l0/load_data_2dmx_l12l0.asc:488:9
======    #4 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/load_data_2dmx_l12l0/load_data_2dmx_l12l0.asc:188:13
======    #5 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/load_data_2dmx_l12l0/load_data_2dmx_l12l0.asc:617:8
======    #6 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/load_data_2dmx_l12l0/load_data_2dmx_l12l0.asc:626:9

====== ERROR: uninitialized read of size 896
======    at 0x40000 on L1 in "void KernelLoadDataL12L0Load2DMX<40u, 50u, 70u>(unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*)"
======    in block aic(0) on device 4
======    code in pc current 0x234 (serialNo:34)
======    #0 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/dav_3510/kernel_operator_mm_impl.h:387:17
======    #1 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/kernel_operator_mm_load2d_impl.h:222:9
======    #2 /home/Ascend-B070/cann-9.2.0/asc/include/basic_api/../../impl/basic_api/kernel_operator_mm_intf_impl.h:120:5
======    #3 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/load_data_2dmx_l12l0/load_data_2dmx_l12l0.asc:578:9
======    #4 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/load_data_2dmx_l12l0/load_data_2dmx_l12l0.asc:192:9
======    #5 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/load_data_2dmx_l12l0/load_data_2dmx_l12l0.asc:617:8
======    #6 /home/asc-devkit/examples/01_simd_cpp_api/03_basic_api/03_matrix_compute/load_data_2dmx_l12l0/load_data_2dmx_l12l0.asc:626:9

[mssanitizer] Sanitizer finished on kernel "void KernelLoadDataL12L0Load2DMX<40u, 50u, 70u>(unsigned char*, unsigned char*, unsigned char*, unsigned char*, unsigned char*)". See all detected errors above.

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

预期没有未初始化告警。

以mmad_mx为例进行分析:

Nd2Nz 只搬运有效数据(A:N=40 行;B:N=50 行),而 LoadData2D 按 16 行分形整块读取(mstep=3→48 行 / mstep=4→64 行,kstep=2 两个 k 分形):

  • E1(A1,512B):m=40 向 16 对齐到 mAlignL1=48(mmad_mx.asc:51),第 40~47 行共 8 行从未被 Nd2Nz 写入。8 行 × 32B × 2 个 k 分形 = 512B -> 512B未初始化读。
  • E2(B1,896B):n=50 向 16 对齐到 nAlignL1=64(mmad_mx.asc:60),第 50~63 行共 14 行从未写入。14 行 × 32B × 2 个 k 分形 = 896B -> 896B未初始化读。

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

likedislike
Lliusa002
10 天前 修改标题为 “[Bug-Report|缺陷反馈][工具检测]: mmad_mx和”,原标题为“[Bug-Report|缺陷反馈][工具检测]:”
Lliusa002
10 天前 修改标题为 “[Bug-Report|缺陷反馈][工具检测]: mmad_mx和load_data_2dmx_l12l0算子存在未初始化问题”,原标题为“[Bug-Report|缺陷反馈][工具检测]: mmad_mx和”
Lliusa002
10 天前 修改了issue 的描述
Llihuaichao成员
8 天前 将 UFOunder 设为负责人
Yyhkz9211成员
8 天前 关联了pull request:fix: 修复 MX 矩阵示例 L1 尾行未初始化问题(#1741)
UUFOunder成员
8 天前 删除了关联的pull request:fix: 修复 MX 矩阵示例 L1 尾行未初始化问题(#1741)
UFOunder成员
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或测试路径中初始化补齐区域,或者通过正确设置尾块参数避免无效范围参与计算。

相关文档:

likedislike
liusa002
8 天前 评论:

您好,感谢反馈。
由于mmad计算的方式,补齐的数据参与计算但不会影响有效数据的值,因此未初始化的内存不会影响计算结果,初始化反而会增加开销,影响性能,因此不建议进行额外的初始化。

@UFOunder

同意以这个结论关闭issue。

likedislike
Yyhkz9211成员
8 天前 将 yhkz9211 设为负责人
UFOunder成员
8 天前 评论:

您好,相关问题回复解决。
我们先关闭此issue,如有其他问题,欢迎再提issue交流~

likedislike
UUFOunder成员
8 天前 issue状态由 待办的 改变为 已完成
UUFOunder成员
8 天前 关闭了 issue