pypto_pro.language.system.sync_dst#
产品支持情况#
Ascend 950PR/Ascend 950DT:支持
Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
功能说明#
用于同一AI Core内不同流水之间的同步。当wait_pipe指定的流水执行到本接口时,如果对应标志位为0,wait_pipe中位于本接口之后的操作将被阻塞;如果对应标志位为1,则将标志位清零,并继续执行后续操作。该接口需要与pypto_pro.language.system.sync_src配对使用。
函数原型#
pypto_pro.language.system.sync_dst(
*,
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_src配对使用,两个接口的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_dst等待pypto_pro.language.system.sync_src发送的MTE2到V同步事件,收到事件后执行逐元素加法;随后等待V到MTE3同步事件,收到事件后将结果从UB写入GM。
import pypto_pro.language as pl
@pl.jit()
def sync_dst_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])