已关闭
[Bug-Report|缺陷反馈][工具检测]: fill 样例在 L1 上有两处问题, A1/B1 地址重叠(实测致结果错误)+ Fill 与 LoadData 之间没同步 #1676
Goldfish_of_Siris创建于  13 天前关闭于  7 天前
Goldfish_of_Siris
Goldfish_of_Siris
13 天前 创建

Describe the current behavior / 问题描述 (Mandatory / 必填)*

mssanitizer -t racecheck 报 5 条 L1 hazard(4 RAW + 1 WAW),对应 fill.asc 两处问题:

① a1Addr = b1Addr = 0(fill.asc:147-148):A1 与 B1 区间重叠。 A1 占 32KB、B1 占 16KB,B1 整个落在 A1 内 —— InitConstA1 写满 A 之后,InitConstB1 又把 A 的前 16KB 覆写成 1,A 有一半数据被 B 覆盖。现在看不出来,只因两次 Fill 都填 1(覆写后值不变);实测把 A 的填充值改成 2:地址 0/0 → 输出 192(应 256)❌,b1Addr 改 M*K*sizeof(T)(0x8000)→ 256 ✅

② PipeBarrier<PIPE_MTE1>() 管不到 MTE2(fill.asc:133): Fill 走 MTE2、LoadData 走 MTE1,该屏障只保证 MTE1 流水内部的顺序 ⇒ 两者之间实际没有任何同步,LoadData 可能在 Fill 写完前读 L1(读到旧/未初始化数据)。本样例是 AIC 核,编译器不会自动插同步;两条 Fill 之间(同为 MTE2 且地址又重叠)同样没同步。

RAW:PIPE_MTE2 Write at +0x0(asc:54 Fill(a1Local))× PIPE_MTE1 Read at +0x0(asc:90 LoadData),另有 3 条同结构;WAW:PIPE_MTE2 Write at +0x0(asc:54)× PIPE_MTE2 Write at +0x0(asc:60)

实测:只错开地址 → 告警 5→2;只补同步 → 5→1;两处都改 → 0。⇒ 两处都要改。

Environment / 环境信息 (Mandatory / 必填)*

项目 值
硬件 / 卡 Ascend950PR(Ascend950PR_9579),NPU 3(ASCEND_RT_VISIBLE_DEVICES=3)
CANN / 工具 / 仓库 CANN 9.1.0(安装包 Ascend-cann-toolkit_9.1.0_linux-x86_64.run + Ascend-cann-950-ops_9.1.0_linux-x86_64.run,自昇腾社区 CANN 下载页 https://www.hiascend.com/developer/download/community/result?module=cann 获取)/ msSanitizer 26.0.0(随 CANN 包提供)/ asc-devkit 9.1.0(dav-3510)
编译 / 检测 ASCFLAGS="-g --cce-enable-sanitizer";cmake -DSCENARIO_NUM=1 -DCMAKE_ASC_ARCHITECTURES=dav-3510 -DCMAKE_ASC_LINK_FLAGS=--cce-enable-sanitizer .. && make -j48;mssanitizer -t racecheck --log-level=error -- ./demo

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

source <CANN>/set_env.sh                       # CANN 9.1.0
export ASCFLAGS="-g --cce-enable-sanitizer" TMPDIR=/tmp ASCEND_RT_VISIBLE_DEVICES=3
SAMPLE=<asc-devkit>/examples/01_simd_cpp_api/06_compatibility_guide/fill
cmake -S $SAMPLE -B ./build_058 -DSCENARIO_NUM=1 -DCMAKE_ASC_ARCHITECTURES=dav-3510 -DCMAKE_ASC_LINK_FLAGS=--cce-enable-sanitizer && make -j48 -C ./build_058
cd ./build_058 && mkdir -p output input && python3 $SAMPLE/scripts/gen_data.py && ./demo
python3 $SAMPLE/scripts/verify_result.py output/output.bin output/golden.bin   # test pass!(掩盖了两处问题)
mssanitizer -t racecheck --log-level=error -- ./demo                          # 5 条告警
# 复现①:把 InitConstA1 中 Fill 第 4 个参数 1→2 重编重跑:地址 0/0 → 192(错);b1Addr 改 0x8000 → 256(对)

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

AscendC::PipeBarrier<PIPE_ALL>();   // ① fill.asc:133 补 MTE2→MTE1 同步(或 SetFlag/WaitFlag<AscendC::HardEvent::MTE2_MTE1>(EVENT_ID1))
uint64_t b1Addr = static_cast<uint64_t>(M) * K * sizeof(T);   // ② fill.asc:148 B1 避开 A1(0x8000,32B 对齐)

修复后:racecheck 告警 5 → 0;把填充值改成 2/1 时输出仍为 256。

见附件:issue_058_fill_L1同步缺失.zip

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

  • 仓内同类样例(pattern_transformation、data_copy_l1togm、set_loaddata_boundary、data_copy_l0c2gm)都错开了 b1Addr,扫网 racecheck 全通过,只有本样例重叠;建议顺带排查其它手动寻址 L1(TPosition::A1/B1/C1)的样例/算子是否存在同址、跨流水依赖是否被写成 PipeBarrier<PIPE_MTE1>。
likedislike
Goldfish_of_SirisGoldfish_of_Siris
13 天前 修改了issue 的描述
Llihuaichao成员
13 天前 将 GRJ_XIDUO 设为负责人
GRJ_XIDUO
GRJ_XIDUO成员
13 天前 评论:

您好,感谢反馈。

fill兼容性样例中PIPE_MTE1指令和PIPE_MTE2指令之间应该使用多流水同步(SetFlag和WaitFlag),当前使用的PipeBarrier<PIPE_MTE1>()确实是错误用法。

近期会针对样例中同步使用有误的问题全量检查并修复。

likedislike
Goldfish_of_SirisGoldfish_of_Siris
12 天前 修改了issue 的描述
Goldfish_of_Siris
Goldfish_of_Siris
12 天前 评论:

你好,关于本issue中提到的另外三个判定为工具能力缺陷的问题,经复核验证确认之前的定位结论有误,该场景为算子确实没加同步,issue文本已经更新,麻烦再确认下

likedislike
Goldfish_of_SirisGoldfish_of_Siris
12 天前 修改了issue 的描述
Goldfish_of_SirisGoldfish_of_Siris
12 天前 修改标题为 “[Bug-Report|缺陷反馈]: fill 样例在 L1 上有两处问题 —— A1/B1 地址重叠(实测致结果错误)+ Fill 与 LoadData 之间没同步”,原标题为“[Bug-Report|缺陷反馈]: [工具检测] asc-devkit 仓 fill 样例报 L1 RAW 竞争,定位为 PipeBarrier 流水线类型选择错误(缺 MTE2→MTE1 同步)”
Goldfish_of_SirisGoldfish_of_Siris
12 天前 修改标题为 “[Bug-Report|缺陷反馈]: fill 样例在 L1 上有两处问题, A1/B1 地址重叠(实测致结果错误)+ Fill 与 LoadData 之间没同步”,原标题为“[Bug-Report|缺陷反馈]: fill 样例在 L1 上有两处问题 —— A1/B1 地址重叠(实测致结果错误)+ Fill 与 LoadData 之间没同步”
Goldfish_of_SirisGoldfish_of_Siris
12 天前 修改标题为 “[Bug-Report|缺陷反馈][工具检测]: fill 样例在 L1 上有两处问题, A1/B1 地址重叠(实测致结果错误)+ Fill 与 LoadData 之间没同步”,原标题为“[Bug-Report|缺陷反馈]: fill 样例在 L1 上有两处问题, A1/B1 地址重叠(实测致结果错误)+ Fill 与 LoadData 之间没同步”
GRJ_XIDUO
GRJ_XIDUO成员
12 天前 评论:

您好,感谢反馈。

已确认fill.asc的a1Addr与b1Addr在L1 Buffer的地址存在重叠,近期将会将b1Addr改为M x K x sizeof(T)。

likedislike
UUFOunder成员
8 天前 将 UFOunder 设为负责人
GRJ_XIDUOGRJ_XIDUO成员
8 天前 关联了pull request:修复fill样例,L1 Buffer地址重叠与同步使用错误。
GRJ_XIDUOGRJ_XIDUO成员
8 天前 删除了关联的pull request:修复fill样例,L1 Buffer地址重叠与同步使用错误。
GRJ_XIDUOGRJ_XIDUO成员
8 天前 关联了pull request:修复Fill样例的L1地址重叠和流水同步错误
GRJ_XIDUO
GRJ_XIDUO成员
8 天前 评论:

您好,您指出的两项问题均已完成修复:

(1)已将fill.asc的a1Addr与b1Addr在L1 Buffer的地址重叠问题解决(实测将B矩阵的填充值改为2后,样例依然通过)。

(2)已排查example目录下与Fill(L1 Buffer)相关的跨流水同步问题并修复。

相关PR已合入:

https://gitcode.com/cann/asc-devkit/pull/6242

https://gitcode.com/cann/asc-devkit/pull/6254

likedislike
GRJ_XIDUO
GRJ_XIDUO成员
7 天前 评论:

您好,相关问题已修复。

我们先关闭此issue,如有其他问题,欢迎再提issue交流~

likedislike
GRJ_XIDUOGRJ_XIDUO成员
7 天前 issue状态由 待办的 改变为 已完成
GRJ_XIDUOGRJ_XIDUO成员
7 天前 关闭了 issue
CANN-robotCANN-robot成员
7 天前 添加了label:resolved