pypto_pro.language.system.sync_src#

产品支持情况#

  • Ascend 950PR/Ascend 950DT:支持

  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持

  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持

功能说明#

用于同一AI Core内不同流水之间的同步。当set_pipe指定流水中位于本接口之前的所有数据读写操作完成后,pypto_pro.language.system.sync_src将对应标志位置为1。该接口不会阻塞set_pipe中位于其后的操作,需要与pypto_pro.language.system.sync_dst配对使用。

函数原型#

pypto_pro.language.system.sync_src(
    *,
    set_pipe: PipeType,
    wait_pipe: PipeType,
    event_id: Union[int, Scalar],
) -> None

参数说明#

参数

输入/输出

说明

set_pipe

输入

pypto_pro.language.PipeType枚举值,表示源流水,即发送同步事件的流水。必须指定一条具体流水,不支持pypto_pro.language.PipeType.ALL。支持的流水组合见约束说明。

wait_pipe

输入

pypto_pro.language.PipeType枚举值,表示目的流水,即等待同步事件的流水。必须指定一条与set_pipe不同的具体流水,不支持pypto_pro.language.PipeType.ALL。支持的流水组合见约束说明。

event_id

输入

事件ID。支持Python int、结果为整数的常量表达式或整数类型的运行时Scalar,不支持bool,取值范围为[0, 7]。

约束说明#

  • 必须与pypto_pro.language.system.sync_dst配对使用,两个接口的set_pipe、wait_pipe和event_id必须完全一致。

  • 必须先调用pypto_pro.language.system.sync_src发送事件,再调用pypto_pro.language.system.sync_dst等待事件。

  • set_pipe和wait_pipe必须组成当前执行侧支持的核内同步路径。

  • 对于同一set_pipe、wait_pipe组合,同一event_id只能在前一次pypto_pro.language.system.sync_dst完成等待后复用。连续调用pypto_pro.language.system.sync_src、漏写任一配对接口或两个接口所在的控制流路径不一致,可能造成数据竞争或死锁。

  • 与auto_mutex=True同时使用时,应确保显式同步与自动mutex分别处理明确的依赖,避免对同一依赖重复同步。

Vector段支持的流水组合#

set_pipe

支持的wait_pipe

MTE2

V、MTE3、S

MTE3

V、MTE2、S

V

MTE2、MTE3、S

S

V、MTE2、MTE3

Cube段支持的流水组合#

set_pipe

支持的wait_pipe

MTE1

MTE2、M、MTE3、FIX

MTE2

MTE1、M、MTE3、S、FIX

MTE3

MTE1、MTE2、S

M

MTE1、MTE2、FIX、S

S

MTE2、MTE3

FIX

M、MTE2、S、MTE3、MTE1

典型同步模式#

场景

set_pipe

wait_pipe

说明

load后进行向量计算

MTE2

V

GM中的数据搬入UB或L1 Buffer后再进行向量计算

向量计算后store

V

MTE3

向量计算完成后再将数据搬出到GM

store后再次load

MTE3

MTE2

数据搬出到GM后再向相同Buffer搬入新数据

返回值说明#

无。

调用示例#

本示例先将两个FP32输入Tensor从GM搬入UB,再调用pypto_pro.language.system.sync_src发送MTE2到V的同步事件。与其配对的pypto_pro.language.system.sync_dst等待该事件后执行逐元素加法。计算完成后,以相同方式同步V和MTE3,最后将结果从UB写入GM。

import pypto_pro.language as pl


@pl.jit()
def sync_src_kernel(
    a: pl.Tensor[[64, 64], pl.DT_FP32],
    b: pl.Tensor[[64, 64], pl.DT_FP32],
    out: pl.Tensor[[64, 64], pl.DT_FP32],
):
    tt = pl.TileType(shape=[64, 64], dtype=pl.DT_FP32, target_memory=pl.MemorySpace.Vec)
    tile_a = pl.make_tile(tt, addr=0x0000)
    tile_b = pl.make_tile(tt, addr=0x4000)
    tile_out = pl.make_tile(tt, addr=0x8000)
    with pl.section_vector():
        pl.load(tile_a, a, [0, 0])
        pl.load(tile_b, b, [0, 0])
        pl.system.sync_src(set_pipe=pl.PipeType.MTE2, wait_pipe=pl.PipeType.V, event_id=0)
        pl.system.sync_dst(set_pipe=pl.PipeType.MTE2, wait_pipe=pl.PipeType.V, event_id=0)
        pl.add(tile_out, tile_a, tile_b)
        pl.system.sync_src(set_pipe=pl.PipeType.V, wait_pipe=pl.PipeType.MTE3, event_id=1)
        pl.system.sync_dst(set_pipe=pl.PipeType.V, wait_pipe=pl.PipeType.MTE3, event_id=1)
        pl.store(out, tile_out, [0, 0])