Closed
[Bug-Report|缺陷反馈]:[工具检测]:mssanitizer 检测到 matmul_callback 样例 DMA 从 GM 0x0 非法越界读取 #1672
h-glueAdd on Sep 16Closed at Sep 28
li-yuanjie-da
Sep 16 Comments:
Sep 16 Comments:
感谢反馈。我们确认所报GM 0x0访问与该代码路径吻合。当前不能将原因直接定为缺少Mb(),还需排查跨核DCache写回覆盖。我们将在 950 环境下以mssanitizer进行验证。


Sep 16 Assign li-yuanjie-da as responsible person
ca1kw
Sep 28 Comments:
Sep 28 Comments:
您好,对于该问题,已经修改样例,上述提到的128出报错经验证已经解决,具体修改可以查看关联pr~


Sep 28 Added label: resolved
Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
Describe the current behavior / 问题描述 (Mandatory / 必填)
使用 mssanitizer(memcheck 模式)对
examples/01_simd_cpp_api/04_advanced_api/00_matmul/matmul_callback样例进行内存检测,报告 129 处illegal read of size 256:pc 0x1644 (serialNo:47),即DMA_MOV_ND2NZ_D,src:(type:GM;addr:0x0;loop1Stride:1024),D:128/N:128,一次搬运跨度覆盖 0x0~0x1fc00;matmul_callback.asc:92(CustomDataCopyInA中DataCopy)←:174(IterateAll)←:212(Process);aic(0,2-5,7-8,10-12,14-18),非法读取地址(相对 GM 偏移)从 0x0 到 0x1fc00;0x1200.../0x1201...),偏移 0x0 处从未被分配,即 DMA 从 GM 0x0 读取,确为越界访问。Environment / 环境信息 (Mandatory / 必填)
Ascend 950PR
cann-9.1.0
检测工具:mssanitizer(memcheck)
基于asc-devlit: 9.1.0分支代码检测
Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
cd examples/01_simd_cpp_api/04_advanced_api/00_matmul/matmul_callback source ${install_path}/cann/set_env.shmkdir -p build && cd build cmake -DSCENARIO_NUM=1 -DCMAKE_ASC_ARCHITECTURES=dav-3510 -DCMAKE_ASC_LINK_FLAGS=--cce-enable-sanitizer .. && make -j python3 ../scripts/gen_data.py mssanitizer -t memcheck -t racecheck -t initcheck -t synccheck --log-level=error -- ./demoDescribe the expected behavior / 预期结果 (Mandatory / 必填)
算子在 mssanitizer memcheck 下运行不应出现非法内存访问:回调
DataCopy搬运 A 矩阵的源地址应为各核实际分配到的 A 分块地址,而非从未分配的 GM 偏移 0x0。Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
mssanitizer memcheck 报告(地址均为相对 GM 偏移):
其余 128 处错误调用栈与上完全相同(同一 serialNo:47 指令),仅报错地址不同,完整地址列表如下:
Special notes for this issue/备注 (Optional / 选填)
初步根因分析:
scripts/gen_data.py初始化为全 0(仅 index 0=256)。Process()中通过offsetListGlobal.SetValue(curBlockIdx, srcBaseAddr1)(标量 GM 写)写入各核自己的 A 分块地址,随后IterateAll()触发回调CustomDataCopyInA,经dataGM.GetValue(curBlockIdx)读取该地址作为DataCopy源地址(第 92 行)。AscendC::Mb()),导致部分核的 DMA 读到 offset list 初始值 0,从而从 GM 偏移 0x0 非法读取。