pypto_pro.language.simt.warp_all#

产品支持情况#

  • Ascend 950PR&950DT系列产品:支持

  • Atlas A3系列产品:不支持

  • Atlas A2系列产品:不支持

功能说明#

判断当前Warp内所有活跃Lane的输入是否均为真,可以理解为对所有活跃Lane的predicate执行一次逻辑与操作。

每个活跃Lane先独立计算自己的predicate,然后共同参与投票:

  • 所有活跃Lane的predicate均为真时,投票结果为1。

  • 只要有一个活跃Lane的predicate为假,投票结果就为0。

  • 每个参与投票的Lane获得相同的投票结果,非活跃Lane不参与判断。

函数原型#

pypto_pro.language.simt.warp_all(
    predicate: int,
) -> Scalar

参数说明#

参数

输入/输出

说明

predicate

输入

当前Lane参与投票的条件值,布尔或整型常量,或相应类型的运行时标量表达式,支持DT_BOOL和DT_INT32。值为0表示假,非0表示真。不同Lane可以传入不同的条件值。

约束说明#

  • 只能在由@pypto_pro.language.vector_function(mode=”simt”)定义的SIMT入口函数或辅助函数中调用。

  • 仅汇总执行到当前指令的活跃Lane;发生分支发散时,不同分支的参与集合不同。

返回值说明#

返回DT_INT32类型的投票结果。如果所有活跃Lane的predicate均为真,则返回1;否则返回0。所有参与投票的Lane返回相同结果。

调用示例#

以下示例进行两次投票。第一次投票中所有Lane的条件均为真,output第0行全部为1;第二次投票中Lane 31的条件为假,output第1行全部为0。

import pypto_pro.language as pl

WARP_SIZE = 32


@pl.vector_function(mode="simt", max_threads=WARP_SIZE)
def warp_all_example(output: pl.Tensor[[2, WARP_SIZE], pl.DT_INT32]):
    tid = pl.simt.linear_thread_idx()
    lane = pl.simt.lane_id()
    warp_size = pl.simt.warp_size()
    output[0, tid] = pl.simt.warp_all(lane < warp_size)
    output[1, tid] = pl.simt.warp_all(lane < warp_size - 1)


@pl.jit()
def warp_all_kernel(output: pl.Tensor[[2, WARP_SIZE], pl.DT_INT32]):
    with pl.section_vector():
        warp_all_example[WARP_SIZE](output)