pypto_pro.language.histogram#
产品支持情况#
Ascend 950PR&950DT系列产品:支持
Atlas A3系列产品:不支持
Atlas A2系列产品:不支持
功能说明#
按源Tile元素的指定字节值生成每行256个桶的累计计数,可用于基数排序中确定桶边界。dst中第b个桶表示:通过过滤且选中字节值小于或等于b的元素个数,而不是仅等于b的频数。
例如选中的字节值为[0, 1, 1, 3],则前4个桶的结果为[1, 3, 3, 4]。
函数原型#
pypto_pro.language.histogram(dst: Tile, src: Tile, idx: Tile, *, is_msb: bool) -> None
参数说明#
参数 |
输入/输出 |
说明 |
|---|---|---|
dst |
输出 |
目的UB Tile,数据类型为DT_UINT32,采用pypto_pro.language.ND布局。有效行数与src一致,每行提供256个累计计数桶,Shape为[行数, 256]。 |
src |
输入 |
源操作数,Tile类型,待统计的元素。dtype为DT_UINT16或DT_UINT32;shape任意;布局为pypto_pro.language.ND(行主序)。 |
idx |
输入 |
索引操作数,Tile类型,is_msb为False时用于过滤。dtype为DT_UINT8:src为DT_UINT16时,shape行数与src一致、列数为1,布局为pypto_pro.language.DN(列主序);src为DT_UINT32且is_msb为True时不使用;src为DT_UINT32且is_msb为False时,shape行数为3、列数与src一致,布局为pypto_pro.language.ND(行主序)。 |
is_msb |
输入 |
编译期bool,必须显式传入。True统计最高字节:DT_UINT16为bits 15~8,DT_UINT32为bits 31~24,不执行高位过滤。False统计bits 7~0:DT_UINT16要求高字节与idx对应行值匹配;DT_UINT32要求byte3、byte2、byte1分别与idx的第0、1、2行过滤值匹配。 |
返回值说明#
无。
约束说明#
src支持DT_UINT16、DT_UINT32;dst为DT_UINT32;idx为DT_UINT8。
src和dst采用ND布局。DT_UINT16源的idx采用DN布局,每个源有效行对应一个过滤值;DT_UINT32源的低字节模式使用3行ND过滤Tile。
输出为包含当前桶的累计计数。需要单个桶的频数时,每行第0桶直接取该行dst的第0个值,其余桶取该行相邻累计值之差。
调用示例#
基本用法#
import pypto_pro.language as pl
ROWS = 32
COLS = 128
IDX_COLS_DN = 1
@pl.jit(auto_mutex=True)
def histogram_kernel(
src: pl.Tensor[[ROWS, COLS], pl.DT_UINT16],
idx: pl.Tensor[[ROWS, IDX_COLS_DN], pl.DT_UINT8],
out: pl.Tensor[[ROWS, 256], pl.DT_UINT32],
):
pl.system.bar_all()
tt_src = pl.TileType(shape=[ROWS, COLS], dtype=pl.DT_UINT16,
target_memory=pl.MemorySpace.Vec, layout=pl.ND)
tt_idx = pl.TileType(shape=[ROWS, IDX_COLS_DN], dtype=pl.DT_UINT8,
target_memory=pl.MemorySpace.Vec, layout=pl.DN)
tt_dst = pl.TileType(shape=[ROWS, 256], dtype=pl.DT_UINT32,
target_memory=pl.MemorySpace.Vec, layout=pl.ND)
tile_src = pl.make_tile_group(type=tt_src, addrs=0x0000, mutex_ids=[0])
tile_idx = pl.make_tile_group(type=tt_idx, addrs=0x2000, mutex_ids=[1])
tile_dst = pl.make_tile_group(type=tt_dst, addrs=0x2020, mutex_ids=[2])
with pl.section_vector():
cur_src = tile_src.current()
cur_idx = tile_idx.current()
cur_dst = tile_dst.current()
pl.load(cur_src, src, [0, 0])
pl.load(cur_idx, idx, [0, 0])
pl.histogram(cur_dst, cur_src, cur_idx, is_msb=True)
pl.store(out, cur_dst, [0, 0])
结果示例如下:
输入数据src:[[0 257 514 771 1028 1285 1542 1799 ...], [32896 33153 33410 33667 33924 34181 34438 34695 ...], [256 513 770 1027 1284 1541 1798 2055 ...], [33152 33409 33666 33923 34180 34437 34694 34951 ...], ...]
输入数据idx:[[0], [0], [0], [0], ...]
输出数据out:[[1 2 3 4 5 6 7 8 ...], [0 0 0 0 0 0 0 0 ...], [0 1 2 3 4 5 6 7 ...], [1 1 1 1 1 1 1 1 ...], ...]