pypto_pro.language.set_mask_count#
产品支持情况#
Ascend 950PR&950DT系列产品:支持
Atlas A3系列产品:不支持
Atlas A2系列产品:不支持
功能说明#
将向量掩码寄存器切换为count(计数)模式。在该模式下,掩码寄存器的低64位被解释为参与运算的元素个数,而非逐位掩码。可直接设置计算数据量,实际迭代次数由Vector计算单元推断。
与pypto_pro.language.set_vec_mask配合使用:先切换到count模式,再设置元素个数,即可精确控制尾块计算的有效元素数。
函数原型#
pypto_pro.language.set_mask_count() -> None
参数说明#
无。
返回值说明#
无。
约束说明#
切换到count模式后,须通过pypto_pro.language.set_vec_mask设置有效元素个数,否则掩码值不确定。
count模式下,pypto_pro.language.set_vec_mask的mask_low参数被解释为元素个数(而非位掩码),mask_high忽略。
count模式处理完尾块后,须先调用pypto_pro.language.set_mask_norm切回norm模式,再调用pypto_pro.language.reset_mask恢复全1掩码;pypto_pro.language.set_mask_norm本身不会改写当前掩码值。否则后续矢量计算的掩码行为不确定。
Tile级操作(如add、mul)内部会自动管理掩码,用户手动设置的count模式会被覆盖。pypto_pro.language.set_mask_count主要用于自定义操作或底层控制场景。
调用示例#
import pypto_pro.language as pl
@pl.jit(auto_mutex=True)
def mask_count_norm_kernel(
a: pl.Tensor[[64, 64], pl.DT_FP32],
b: pl.Tensor[[64, 64], pl.DT_FP32],
out: pl.Tensor[[64, 64], pl.DT_FP32],
):
tile_type = pl.TileType(shape=[64, 64], dtype=pl.DT_FP32, target_memory=pl.MemorySpace.Vec)
tile_a = pl.make_tile_group(type=tile_type, addrs=0x0000, mutex_ids=[0])
tile_b = pl.make_tile_group(type=tile_type, addrs=0x4000, mutex_ids=[1])
tile_out = pl.make_tile_group(type=tile_type, addrs=0x8000, mutex_ids=[2])
with pl.section_vector():
cur_a = tile_a.current()
cur_b = tile_b.current()
cur_out = tile_out.current()
pl.load(cur_a, a, [0, 0])
pl.load(cur_b, b, [0, 0])
pl.set_mask_count()
pl.set_vec_mask(0, 64 * 64)
# 在此执行读取count模式掩码的自定义矢量计算
pl.set_mask_norm()
pl.reset_mask()
pl.add(cur_out, cur_a, cur_b)
pl.store(out, cur_out, [0, 0])