pypto_pro.language.system.mutex_unlock#

产品支持情况#

  • Ascend 950PR/Ascend 950DT:支持

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

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

功能说明#

在指定pipe上释放mutex_id对应的缓冲区互斥资源,使等待该资源的其他pipe能够继续执行。该接口与mutex_lock配合使用。

函数原型#

pypto_pro.language.system.mutex_unlock(
    *,
    pipe: PipeType,
    mutex_id: Union[int, Scalar],
) -> None

参数说明#

参数

输入/输出

说明

pipe

输入

pypto_pro.language.PipeType枚举值,必须是MTE1/MTE2/MTE3/V/M/S/FIX中的一条具体pipe;不允许PipeType.ALL。

mutex_id

输入

Python整数、结果为整数的常量表达式,或整数类型的运行时Scalar表达式。静态ID的取值范围为[0, 31],不接受bool;动态ID的运行时取值需在[0, 31]范围内。

约束说明#

  • mutex_unlock必须与此前同一pipe、同一mutex_id的mutex_lock成对使用。

  • 不得遗漏mutex_unlock,也不得在未获取对应互斥资源时调用mutex_unlock。

  • 嵌套、复用、控制流及自动mutex等公共约束,参见pypto_pro.language.system.mutex_lock

返回值说明#

无。

调用示例#

下面的Kernel在auto_mutex=False时计算out = x + x。每个mutex_unlock均释放同一pipe上此前通过相同mutex ID获取的互斥资源。

import pypto_pro.language as pl


@pl.jit(auto_mutex=False)
def mutex_kernel(
    x: 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_x = pl.make_tile(tt, addr=0x0000)
    tile_out = pl.make_tile(tt, addr=0x4000)
    with pl.section_vector():
        pl.system.mutex_lock(pipe=pl.PipeType.MTE2, mutex_id=0)
        pl.load(tile_x, x, [0, 0])
        pl.system.mutex_unlock(pipe=pl.PipeType.MTE2, mutex_id=0)

        pl.system.mutex_lock(pipe=pl.PipeType.V, mutex_id=0)
        pl.system.mutex_lock(pipe=pl.PipeType.V, mutex_id=1)
        pl.add(tile_out, tile_x, tile_x)
        pl.system.mutex_unlock(pipe=pl.PipeType.V, mutex_id=1)
        pl.system.mutex_unlock(pipe=pl.PipeType.V, mutex_id=0)

        pl.system.mutex_lock(pipe=pl.PipeType.MTE3, mutex_id=1)
        pl.store(out, tile_out, [0, 0])
        pl.system.mutex_unlock(pipe=pl.PipeType.MTE3, mutex_id=1)