pypto_pro.language.simt.threadfence#

产品支持情况#

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

  • Atlas A3系列产品:不支持

  • Atlas A2系列产品:不支持

功能说明#

设置设备作用域的内存栅栏,使当前线程在栅栏前发起的内存访问先于栅栏后的内存访问,对设备上的线程可见。

该接口只约束当前线程的内存访问顺序,不等待当前线程块或其他线程块中的线程。

函数原型#

pypto_pro.language.simt.threadfence() -> None

参数说明#

无。

约束说明#

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

  • 必须作为独立语句调用,不支持使用其结果参与表达式。

  • 该接口不是设备级线程屏障。如需在线程块内等待所有线程,应使用pypto_pro.language.simt.syncthreads。

返回值说明#

无。

调用示例#

每个线程块先写入自己的GM数据,再调用threadfence发布写入,随后通过GM中的原子计数更新完成状态。最后完成的线程块可以读取其他线程块已经写入的数据。

import pypto_pro.language as pl

BLOCKS = 4


@pl.vector_function(mode="simt", max_threads=1)
def publish_with_threadfence(
    out: pl.Tensor[[1, 1], pl.DT_INT32],
    values: pl.Tensor[[1, BLOCKS], pl.DT_INT32],
    completed: pl.Tensor[[1, 1], pl.DT_INT32],
):
    block_id = pl.simt.block_idx().x
    values[0, block_id] = 1
    pl.simt.threadfence()
    ticket = pl.simt.atomic_add(completed[0, 0], 1)
    if ticket == BLOCKS - 1:
        total: pl.DT_INT32 = 0
        for index in pl.range(BLOCKS):
            total = total + values[0, index]
        out[0, 0] = total


@pl.jit()
def simt_threadfence(
    out: pl.Tensor[[1, 1], pl.DT_INT32],
    values: pl.Tensor[[1, BLOCKS], pl.DT_INT32],
    completed: pl.Tensor[[1, 1], pl.DT_INT32],
):
    with pl.section_vector():
        publish_with_threadfence[1](out, values, completed)

# 使用4个线程块启动。
# simt_threadfence[None, BLOCKS](out, values, completed)