pypto_pro.language.make_tuple#

产品支持情况#

  • Ascend 950PR/Ascend 950DT:支持

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

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

功能说明#

创建编译期命名元组,将多个IR变量按字段名聚合。字段访问在编译期解析为对应的原始值,不生成C++结构体,也不产生运行时开销。 pypto_pro.language.struct会生成C++结构体,可用于跨Pipeline传递数据,两者有区别。

函数原型#

pypto_pro.language.make_tuple(**kwargs: Any) -> Any

参数说明#

参数

输入/输出

说明

**kwargs

输入

命名字段,以field=value形式传入,至少指定一个字段。字段名必须为合法标识符。字段值支持Kernel内可解析的值表达式,包括Python标量值、Kernel标量表达式、Tensor、Tile、Ptr以及由这些值组成的Python元组,例如(tile0, tile1)。不支持位置参数,也不支持通过字典展开参数,例如make_tuple(**fields)。

约束说明#

返回的命名元组对象支持通过字段名访问打包的变量。字段访问在编译期被常量折叠回原值,不产生运行时开销。

使用场景#

  • 函数返回多个值时,可以将多个Tile或变量聚合后返回。

  • 可以将逻辑相关的变量聚合,并通过字段名访问。

  • 可以聚合ping-pong缓冲中的多个Tile,并通过字段名访问。

与pypto_pro.language.struct的区别#

  • 需要跨Pipeline传递数据,例如通过SSBUF通信时,使用pypto_pro.language.struct。

  • 仅需在同一Pipeline内聚合变量时,使用pypto_pro.language.make_tuple。

返回值说明#

返回包含所有命名字段的命名元组对象。

调用示例#

创建命名元组并访问字段#

import pypto_pro.language as pl

# 场景 1:标量字段打包 + 字段访问
@pl.jit()
def tuple_scalar_kernel(
    out: pl.Tensor[[2], pl.DT_INT32],
):
    s = pl.struct("TScalar", a=11, b=22)
    with pl.section_vector():
        t = pl.make_tuple(first=s.a, second=s.b)
        pl.setval(out, 0, t.first + t.second)
        pl.setval(out, 1, t.second - t.first)
# 场景 2:for 循环内打包 + struct 字段中转
@pl.jit()
def tuple_in_loop_kernel(
    out: pl.Tensor[[1], pl.DT_INT32],
):
    acc = pl.struct("LoopT", v=0, cur=0)
    with pl.section_vector():
        for i in pl.range(0, 4):
            acc.cur = i
            t = pl.make_tuple(x=acc.cur, y=acc.cur * 10)
            acc.v = acc.v + t.x + t.y
        pl.setval(out, 0, acc.v)