pypto_pro.language.simt.threadfence_block#
产品支持情况#
Ascend 950PR&950DT系列产品:支持
Atlas A3系列产品:不支持
Atlas A2系列产品:不支持
功能说明#
设置线程块作用域的内存栅栏,使当前线程在栅栏前发起的内存访问先于栅栏后的内存访问,对当前线程块中的线程可见。
该接口只约束当前线程的内存访问顺序,不等待其他线程,不是线程屏障。
函数原型#
pypto_pro.language.simt.threadfence_block() -> None
参数说明#
无。
约束说明#
只能在由@pypto_pro.language.vector_function(mode=”simt”)定义的SIMT入口函数或辅助函数中调用。
必须作为独立语句调用,不支持使用其结果参与表达式。
该接口不保证其他线程已经执行到同一位置。如需等待当前线程块中的所有线程,应使用pypto_pro.language.simt.syncthreads。
返回值说明#
无。
调用示例#
每个线程先写共享UB,再调用threadfence_block发布写入,最后通过原子计数确定最后完成写入的线程。
import pypto_pro.language as pl
THREADS = 128
@pl.vector_function(mode="simt", max_threads=THREADS)
def publish_with_threadfence_block(out, values, completed):
tid = pl.simt.linear_thread_idx()
if tid == 0:
completed[0, 0] = 0
values[0, tid] = 0
pl.simt.syncthreads()
values[0, tid] = 1
pl.simt.threadfence_block()
ticket = pl.simt.atomic_add(completed[0, 0], 1)
if ticket == THREADS - 1:
total: pl.DT_INT32 = 0
for index in pl.range(THREADS):
total = total + values[0, index]
out[0, 0] = total
@pl.jit()
def simt_threadfence_block(
out: pl.Tensor[[1, 1], pl.DT_INT32],
):
values = pl.make_tile(
pl.TileType(
shape=[1, THREADS],
dtype=pl.DT_INT32,
target_memory=pl.MemorySpace.Vec,
),
addr=0,
)
completed = pl.make_tile(
pl.TileType(
shape=[1, 8],
dtype=pl.DT_INT32,
target_memory=pl.MemorySpace.Vec,
),
addr=THREADS * 4,
)
with pl.section_vector():
publish_with_threadfence_block[THREADS](out, values, completed)