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

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
24 天前 修改标题为 “[Bug-Report|缺陷反馈][工具检测]: mmad_mx和”,原标题为“[Bug-Report|缺陷反馈][工具检测]:”
Lliusa002
24 天前 修改标题为 “[Bug-Report|缺陷反馈][工具检测]: mmad_mx和load_data_2dmx_l12l0算子存在未初始化问题”,原标题为“[Bug-Report|缺陷反馈][工具检测]: mmad_mx和”
Lliusa002
24 天前 修改了issue 的描述
Llihuaichao成员
23 天前 将 UFOunder 设为负责人
Yyhkz9211成员
23 天前 关联了pull request:fix: 修复 MX 矩阵示例 L1 尾行未初始化问题(#1741)
UUFOunder成员
22 天前 删除了关联的pull request:fix: 修复 MX 矩阵示例 L1 尾行未初始化问题(#1741)
UFOunder成员
22 天前 评论:

您好,感谢反馈。
由于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
22 天前 评论:

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

@UFOunder

同意以这个结论关闭issue。

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

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

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