已关闭
[Bug]: 不同函数下的Vector与DataCopyPad存在共享一块内存,两者之间缺少同步信号时(单元测试精度时好时坏),通过mssanitizer 扫描 是否缺少的同步信息,最终没有扫描出来,请优化,多谢 #206
LetsAiGo创建于  9月1日关闭于  9月11日
LetsAiGo
9月1日 创建

在提交新问题之前,请确保您已经在社区中搜索过相关问题,并使用了社区中提供的资源/工具后,仍未找到满意的解决方式。

⚠️ 安全信息提醒:请仔细检查提供的文本内容,确保其不包含敏感数据信息,包括但不限于:

  • API 令牌或密钥
  • 密码或身份验证凭证
  • 私有网址或接口地址
  • 个人或机密数据
  • ...

在分享配置信息或代码示例时,请将敏感信息脱敏处理,或使用 <TOKEN> 等占位符替代原有内容。

环境信息

分别在CANN8.5.1 和CANN9.1.0 下进行了扫描,都没有扫描出缺少同步信息

  • 操作系统 : linux-debian_x86_64
  • 昇腾硬件信息 910B2
  • CANN软件版本。CANN8.5.1
  • 安装的对应软件版本


- 操作系统  : linux-debian_x86_64 
- 昇腾硬件信息  A5 950PR
- CANN软件版本。cann-9.1.0
- 安装的对应软件版本



add_ops_compile_options(
        OP_NAME FlatQuantBnn
        OPTIONS --cce-auto-sync=off
                -Wno-deprecated-declarations
                -Werror
                -g
                -sanitizer
)
### 🐛 问题描述
            
通过mssanitizer 扫描 缺少的同步信息,最终没有扫描出来,请优化,多谢

代码片段:
定义了 Init函数与Process函数
其中:Init函数中包括Vector流水线操作:关键代码如下:

    pipe.InitBuffer(bufQueue, NUM_ONE_NINE_TWO * NUM_ONE_ZERO_TWO_FOUR);
    LocalTensor<uint8_t> tmp = bufQueue.Get<uint8_t>();
    xTensor = tmp.ReinterpretCast<T>();
    x2Tensor = tmp[shape.Mceil * shape.Nceil * sizeof(T)].ReinterpretCast<T>();
    p1Tensor = tmp.ReinterpretCast<T>();
    p2Tensor = tmp[shape.Mceil * shape.Mceil * sizeof(T)].ReinterpretCast<T>();

  Duplicate<T>(xTensor, (T)0, shape.Mceil * shape.Nceil);
  Duplicate<T>(x2Tensor, (T)0, shape.Mceil * shape.Nceil);
  Duplicate<half>(absTensor, (half)0, shape.Mceil * shape.Nceil);
  Duplicate<half>(maxTensor, (half)0, NUM_ONE_TWO_EIGHT);
  Duplicate<half>(qscaleTensor, (half)0, NUM_ONE_TWO_EIGHT);

<span style="color:#e60000;">关键信息:xTensor与p1Tensor 指向统一内存区域</span>

 Process函数中关键代码如下:
  if (shape.M == shape.Mceil) {
        DataCopy(p1Tensor, p1GM[shape.pstart * shape.M], shape.prows * shape.M);
  } else {
       DataCopyExtParams copyParams{static_cast<uint16_t>(shape.prows), static_cast<uint32_t>(shape.M * sizeof(T)), 0, 0, 0};
       DataCopyPadExtParams<T> padParams{true, 0, static_cast<uint8_t>(shape.Mceil - shape.M), 0};
       DataCopyPad(p1Tensor, p1GM[shape.pstart * shape.M], copyParams, padParams);
  }
  set_flag(PIPE_MTE2, PIPE_V, (event_t)NUM_FIVE);
  wait_flag(PIPE_MTE2, PIPE_V, (event_t)NUM_FIVE);
 

代码先执行Init函数,再执行Process函数

从上述代码来看Duplicate Vector操作与 DataCopyPad 操作使用了同一内存块,并且两者之间无同步信号。
由于流水线并发的设计,所以存在:Vector操作没有结束,DataCopyPad已开始执行的概率,导致拷贝进入的数据被Vector操作覆盖了。

实际单元测试情况:出现时好时坏的精度问题。

问题修改:
在vector后增加:MTE2等待V的同步信号后,问题消失。
        event_t eventIdVMTE2 = static_cast<event_t>(pipe.FetchEventID(HardEvent::V_MTE2));
        SetFlag<HardEvent::V_MTE2>(eventIdVMTE2);
        WaitFlag<HardEvent::V_MTE2>(eventIdVMTE2);

在代码修改之前通过mssanitizer扫描,并没有扫描处缺少同步信号,
扫描命令如下;
g340-cd51-5200-c347-2627-3e2f-346f(@:):tests# mssanitizer --kernel-name=FlatQuantBnn --tool=synccheck  pytest normal_tests/test_flat_quant_bnn.py |  tee  test_flat_quant_bnn-synccheck-2026-09-01-01.log
[mssanitizer] logging to file: ./mindstudio_sanitizer_log/mssanitizer_20260901173458_1672516.log



扫描结果没有Error,只有误报的WARNING

![image.png](https://raw.gitcode.com/user-images/assets/8858746/6c102665-46bc-4f86-ae26-ad9d13ef9b68/image.png 'image.png')




欢迎加入社区,感谢您对社区的贡献 🎉!

likedislike
went_code
went_code成员
9月1日 评论:

👋 您好,欢迎向 MindStudio-Sanitizer 提交 Issue!
我们已收到您的反馈,感谢你对开源社区的支持。🎉

📅 处理时效 维护团队将在工作日 24 小时内查看并回复您的问题。
🔍 自助排查(推荐优先查看) 在等待回复期间,您可以先查阅以下资源,多数问题可快速解决:

💡 **为了更快定位问题,请您确保 Issue 包含:

  1. 清晰的问题描述
  2. 可复现的操作步骤
  3. 相关日志、截图或环境信息
    我们会尽快跟进,感谢您的理解与配合!
likedislike
ascend-robotascend-robot成员
9月1日 添加了label:bug
gong-siwei成员
9月2日 评论:

从问题描述看,是出现了ub内存数据竞争,synccheck没法检查数据竞争问题,需要用--tool=racecheck选项
synccheck可检出比如 set_flag 比wait_flag多,或者两对set/wait_flag之间连续执行的冗余问题

likedislike
liusa002成员
9月9日 评论:

从问题描述看,是出现了ub内存数据竞争,synccheck没法检查数据竞争问题,需要用--tool=racecheck选项
synccheck可检出比如 set_flag 比wait_flag多,或者两对set/wait_flag之间连续执行的冗余问题

@LetsAiGo

likedislike
LetsAiGo
9月9日 评论:

从问题描述看,是出现了ub内存数据竞争,synccheck没法检查数据竞争问题,需要用--tool=racecheck选项
synccheck可检出比如 set_flag 比wait_flag多,或者两对set/wait_flag之间连续执行的冗余问题

@LetsAiGo

@liusa002

好的,感谢!

likedislike
liusa002成员
9月10日 评论:

@LetsAiGo
如果racecheck能够解决你的问题,麻烦将issue状态更新为DONE。
如果还是有使用问题,请联系我们~

likedislike
LLetsAiGo
9月11日 issue状态由 TODO 改变为 DONE
LLetsAiGo
9月11日 关闭了 issue
ascend-robotascend-robot成员
9月11日 添加了label:resolved