竞争检测

竞争检测工具是一个用于检测算子运行时外部存储同时访问异常的工具,该工具主要是帮助用户识别到内存数据的竞争访问风险。在昇腾芯片架构下,外部存储或内部存储可以被多个流水访问,通常被用作临时缓冲区保存正在处理的数据。由于这些数据可以同时被多个流水访问,算子程序没有正确处理流水同步时就可能会导致数据竞争的问题。

竞争异常类型

竞争异常是指两个内存事件(其中至少有一个为写事件)尝试访问同一块内存时,出现不符合基于预期执行顺序的结果。竞争检测工具能够识别以下三种典型的竞争异常

表1 竞争异常类型

异常名

描述

位置

支持地址空间

Write-After-Write(WAW)

当两个内存事件尝试向同一块内存写入时,可能存在这种异常,导致内存结果值取决于两个内存事件的实际访问顺序。

kernel

GM, UB, L0{A,B,C}, L1

Write-After-Read(WAR)

当两个内存事件(一个事件执行读取操作,另一个事件执行写入操作)尝试访问同一块内存时,可能存在这种异常,即写操作事件实际在读操作事件之前执行完毕,并导致读取到的内存值并非预期起始值。

Read-After-Write(RAW)

当两个内存事件(一个事件执行读取操作,另一个事件执行写入操作)尝试访问同一块内存时,可能存在这种异常,即读操作事件实际在写操作事件之前执行完毕,并导致读取到的内存值还未更新。

启用竞争检测

运行mssanitizer工具时,启用竞争检测工具racecheck,执行如下命令:
mssanitizer --tool=racecheck ./<kernel_name>_npu

./<kernel_name>_npu为NPU侧可执行文件所在路径,可配置为相对路径或绝对路径。

  • 竞争检测不会执行内存错误检查,建议用户首先运行内存检测,确保算子程序能够正常执行,没有运行异常。
  • 当用户程序运行完成后,界面将会打印异常报告,异常的具体含义见竞争检测报告解析
  • 启动工具后,将会在当前目录下自动生成工具操作日志文件mssanitizer_{TIMESTAMP}_{PID}.log。

竞争检测报告解析

竞争检测工具会输出一系列信息,详细说明有关算子各 PIPE 之间存在的内存数据竞争访问异常。

========= ERROR: Potential RAW hazard detected in block 0 (aiv) at UB :       // 竞争事件类型、核类型、AICore信息以及异常内存块信息
=========     PIPE_V Write at RAW()+0xf280 in add_custom.cpp:520      // 竞争事件的详细信息,包含该事件所在的 PIPE、操作类型、内存访问起始地址以及代码执行所在文件名及行号 
=========     PIPE_MTE3 Read at RAW()+0xf280 in add_custom.cpp:498

以上示例中表示了AICore 0中存在对UB的先写后读竞争异常,PIPE_V 流水中存在对“0xf280”地址的写入操作事件,该操作对应算子实现文件add_custom.cpp中的第520行,PIPE_MTE3流水中存在对“0xf280”地址的读取操作事件,该操作对应算子实现文件add_custom.cpp中的第498行。