本文へ移動
cccskills
無料GitHub で公開

mstx-report-soft-sync

分析 AscendC 算子中自实现的软同步代码,判断其所属同步语义(核间 barrier/set-wait、卡间 barrier/signal),并接入 mssanitizer 的 Sanitizer 接口(sanitizer_report.h)上报软同步语义,避免 racecheck 对软同步误报。

触发:算子存在自实现软同步(GM 地址轮询、flag 计数、跨核/跨卡信号等)需要配合 mssanitizer 检测、需要上报软同步语义、需要判断某段同步代码属于哪种同步语义时。

インストール方法を見る

含まれるファイル(3)

  • SKILL.md7.2 KB
  • references/recognition-examples.md4.9 KB
  • references/sanitizer-interface.md5.0 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

算子软同步语义分析与 mssanitizer 上报

概述

mssanitizer 的 racecheck 会检测访存竞态。算子中由用户自行实现的软同步(轮询 GM 地址 / 写 flag / 计数等)会被 racecheck 误判为竞态,需要通过 sanitizer_report.h 提供的 Sanitizer 接口上报同步语义,让检测器识别这些软同步、跳过误报。

  • 接口头文件:$ASCEND_HOME_PATH/tools/mssanitizer/include/sanitizer_report.h
  • 完整接口签名、结构体字段、参数说明见 references/sanitizer-interface.md

软同步语义分类

语义场景上报结构体(Sanitizer::)
核间 barrier同卡多个核到达同步点后一起继续MstxCrossCoreBarrier
核间 set/wait核 A 发信号,核 B 等待后才继续MstxCrossCoreSetFlag / MstxCrossCoreWaitFlag
卡间 barrier跨卡所有核到达后继续(隐含全流水+核间 barrier)MstxCrossNpuBarrier
卡间 signal基于 GM 地址写值 + 轮询该地址满足条件MstxSignalSet / MstxSignalWait

处理流程

步骤 1:识别自实现软同步

排除项(无需上报):

  • 直接调用已封装的软同步接口,如 aclshmem_signal_wait_until、aclshmemx_signal_op、aclshmem_barrier_all 等(这些内部已上报)。
  • 硬件同步(非软同步):SetFlag/WaitFlag/PipeBarrier(核内事件同步)、CrossCoreSetFlag/CrossCoreWaitFlag(硬件核间同步)。

识别特征(自实现软同步,需上报):

  • GM 地址轮询:while (*(__gm__ T*)addr != value)、while (ReadGmByPassDCache(ptr) != target)
  • 写 flag / 计数:*(__gm__ T*)addr = value、WriteGmByPassDCache(ptr, v)、AtomicAdd(flag, n)
  • 配合 dcci_cacheline(s) 显式刷新 dcache 的轮询/写值

步骤 2:判断同步语义

按三个维度归类:

  1. 参与方:核内(同核流水)→ 跨核(同卡不同 core)→ 跨卡(不同 device/rank)。
  2. 同步方式:barrier(所有参与方到达才释放)→ set/wait(一方发布、另一方等待)→ signal(基于 GM 地址写值+轮询)。
  3. happens-before 粒度:决定能否消除「数据区」的写-读误报(关键!)。

对照「软同步语义分类」表确定上报结构体。

语义选择关键经验(来自 allgather 实测):

  • 同卡多核软同步 → 用核间 barrier(MstxCrossCoreBarrier)或核间 set/wait(MstxCrossCoreSetFlag/WaitFlag)。其 happens-before 是全局的(barrier 之前所有写 → 之后所有读),能消除「数据区」写-读误报。
  • 跨卡软同步 → 用卡间 signal(MstxSignalSet/Wait)或卡间 barrier(MstxCrossNpuBarrier)。signal 的 happens-before 按地址(文档「仅与保存信号的地址有关」),只消除 signal 地址(flag 区)的误报,无法跨到数据区——若误报发生在「生产者写数据 vs 消费者读数据」这类数据区竞争,signal 上报无效,应改用 barrier 语义。

判断方法:先看 racecheck 误报的地址是否等于软同步 flag 地址(是→signal 即可;否、且为数据区写-读→barrier/set-wait)。

步骤 3:先封装宏,再插入上报

为避免每个同步点重复构造结构体,仿照 shmem 内部 shmemi_mstx_report.h 的写法,在算子文件顶部先定义一组宏封装 sanitizer_report.h 的 Sanitizer:: 接口(不依赖 shmem 内部头文件,便于移植到其他算子仓)。宏名改用 MSTX_SOFT_SYNC_ 前缀,与 shmem 内部的 MSTX_* 宏区分,避免编译期冲突:

#include "sanitizer_report.h"

#ifdef __MSTX_DFX_REPORT__
#define MSTX_SOFT_SYNC_FUSE_SCOPE_START() Sanitizer::SanitizerFuseScopeStart()
#define MSTX_SOFT_SYNC_FUSE_SCOPE_END() Sanitizer::SanitizerFuseScopeEnd()
#define MSTX_SOFT_SYNC_SIGNAL_SET_REPORT(addr_, val_)     \
    do {                                        \
        Sanitizer::MstxSignalSet soft_sync_set__{};  \
        soft_sync_set__.addr = (uint64_t)(addr_);    \
        soft_sync_set__.value = (val_);              \
        Sanitizer::SanitizerReport(soft_sync_set__); \
    } while (0)
#define MSTX_SOFT_SYNC_SIGNAL_WAIT_REPORT(addr_, cmp_, val_)        \
    do {                                                  \
        Sanitizer::MstxSignalWait soft_sync_wait__{};          \
        soft_sync_wait__.addr = (uint64_t)(addr_);             \
        soft_sync_wait__.cmpValue = (val_);                    \
        soft_sync_wait__.cmpOp = (Sanitizer::CompareOp)(cmp_); \
        Sanitizer::SanitizerReport(soft_sync_wait__);          \
    } while (0)
#define MSTX_SOFT_SYNC_CROSS_CORE_BARRIER_REPORT(core_num)         \
    do {                                                           \
        Sanitizer::MstxCrossCoreBarrier soft_sync_barrier__{};     \
        soft_sync_barrier__.usedCoreNum = (core_num);              \
        Sanitizer::SanitizerReport(soft_sync_barrier__);           \
    } while (0)
#else
#define MSTX_SOFT_SYNC_FUSE_SCOPE_START()
#define MSTX_SOFT_SYNC_FUSE_SCOPE_END()
#define MSTX_SOFT_SYNC_SIGNAL_SET_REPORT(addr_, val_)
#define MSTX_SOFT_SYNC_SIGNAL_WAIT_REPORT(addr_, cmp_, val_)
#define MSTX_SOFT_SYNC_CROSS_CORE_BARRIER_REPORT(core_num)
#endif

然后在每个同步点插入:

// set 侧(写 flag / 发信号)
MSTX_SOFT_SYNC_FUSE_SCOPE_START();
/* user-defined 软同步逻辑:写 flag、put、AtomicAdd 等 */
MSTX_SOFT_SYNC_FUSE_SCOPE_END();
MSTX_SOFT_SYNC_SIGNAL_SET_REPORT(flag_addr, written_value);

// wait 侧(轮询 flag / 等信号)
MSTX_SOFT_SYNC_FUSE_SCOPE_START();
/* user-defined 软同步逻辑:while 轮询 */
MSTX_SOFT_SYNC_FUSE_SCOPE_END();
MSTX_SOFT_SYNC_SIGNAL_WAIT_REPORT(flag_addr, Sanitizer::CompareOp::EQ, expected_value);

要点:

  • SanitizerFuseScopeStart() / SanitizerFuseScopeEnd() 包裹的自定义软同步指令不会被 racecheck 检测,SanitizerReport(record) 上报同步语义。
  • signal 的 set/wait 通过 addr 配对:对称内存下 set 方写入的地址与 wait 方轮询的地址数值相同。
  • (uint64_t) 强转兼容 GM_ADDR 的指针/整型两种底层类型。
  • 宏受 __MSTX_DFX_REPORT__ 门控:非 mssanitizer 构建时为空,不影响普通编译。其余语义(barrier、set/wait)可仿照同一模式扩展对应宏。

参考资料

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

当用户直接要求进行数据集压缩测评,或在量化调优过程中需要使用 AISBench 评测工具输出数据集精度等场景时使用。 本 Skill 负责:使用 AISBench 数据集压缩代码、用 RBF Kernel Herding 算法生成压缩后的数据子集(coreset),并按用户目标交付两种产物之一: ① 接入量化调优主流程:产出独立的 coreset 数据集配置(不覆盖原始数据),回传「全集 config_name + coreset config_name」给编排层,供 evaluation.yaml 切换; ② 仅数据集压缩测评(不做量化调优):基于 example 模板生成「全集测试脚本」和「子集测试脚本」两份 shell 脚本。 暂时支持 AIME 2025 和 GPQA,其他数据集需要再结合 aisbench tools目录下 herding_coreset_selector 源码进行分析。

日本語の概要は準備中です。原文の説明を表示しています。

kali20gakki/msAgent322026年10月10日 更新

Ascend cluster comparison tool. Invoke when user asks to compare two cluster datasets (DB or TEXT), or to generate cluster_analysis_output from raw profiling data via msprof-analyze and then compare.

日本語の概要は準備中です。原文の説明を表示しています。

kali20gakki/msAgent322026年10月10日 更新

专门用于 Ascend 集群 Profiling 性能数据的“快慢卡”诊断专家技能。当用户提供【集群性能数据目录/路径】并要求分析【快慢卡】、【慢节点】、【负载不均衡】或【集群瓶颈】时,必须触发此技能。该技能会自动接收集群路径,调度相关工具输出快慢卡的宏观定性与微观根因(如 Host 下发瓶颈、算子计算劣化)。

日本語の概要は準備中です。原文の説明を表示しています。

kali20gakki/msAgent322026年10月10日 更新

Analyze Ascend NPU collective communication profiling data with a DB-first workflow. Use when the user provides `cluster_analysis_output/cluster_analysis.db`, rank-level `analysis.db`, rank-level `ascend_pytorch_profiler_{rank_id}.db`, together with `profiler_info.json`, and asks about HCCL or hcom communication cost, collective communication TOP ops, wait time, slow rank/straggler, Notify Wait, bandwidth, retry, relay, SDMA/RDMA/HCCS links, communication matrix, or Ascend communication fault patterns.

日本語の概要は準備中です。原文の説明を表示しています。

kali20gakki/msAgent322026年10月10日 更新

Analyze Ascend NPU computation-side profiling data for single-card runs or a selected rank from multi-card runs. Use this skill when the user asks to diagnose computation bottlenecks, AI Core / AI Vector / AICPU hotspots, dynamic shape overhead, block dim issues, redundant TransData/Transpose/Cast, cross-stream waits, frequency/runtime-state issues, or fusion opportunities.

日本語の概要は準備中です。原文の説明を表示しています。

kali20gakki/msAgent322026年10月10日 更新

针对昇腾 NPU 上的 PyTorch 模型,识别可做融合算子替换的代码段、替换为 torch_npu 融合算子并做性能/精度验证。当用户提到融合算子、NPU 算子替换、RMSNorm/SwiGLU/RoPE/Attention 融合、torch_npu 亲和算子等关键词是,使用本 Skill。

日本語の概要は準備中です。原文の説明を表示しています。

kali20gakki/msAgent322026年10月10日 更新

kali20gakki のスキルをすべて見る

このスキルの問題を報告する