数据选择 - 2023.2 简体中文

AI 引擎内核与计算图编程指南 (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 简体中文

select 内部函数用于根据 select 参数的值来选择第一组通道或第二组通道。如果 select 中的通道对应位为 0,那么它会返回第一组通道中的值。如果该位为 1,那么它会返回第二组通道中的值。例如,select16 内部函数具有以下函数原型。

v16int32 select16 (	                            unsigned int select,
	v16int32 xbuff,
	int xstart,
	unsigned int xoffsets,
	unsigned int xoffsets_hi,
	v16int32 ybuff,
	int ystart,
	unsigned int yoffsets,
	unsigned int yoffsets_hi 
)	

对于 select 的每个位(从低到高),它将从 xbuff 选择一条通道(前提是 select 参数位为 0)或者从 ybuff 选择一条通道(前提是 select 参数位为 1)。xbuffybuff 生成的通道上的数据置换是由 shuffle 搭配 xoffsetsyoffsets 中的对应位来达成的。以下是 select 的 C 语言样式伪代码。

for (int i = 0; i < 16; i++){
	idx = f( xstart, xoffsets[i]); //i'th 4 bits of offsets
	idy = f( ystart, yoffsets[i]);
	o[i] = select[i] ? y[idy]:x[idx];
}

如需了解有关前述代码中 f 的工作方式的信息,请参阅本节开始处列出的常规通道选择方案公式。

处理 int16 数据类型时,select 内部函数具有额外的 xsquare 参数,它允许在完成主置换后进一步进行 16 位粒度的迷你置换。例如,select32 内部函数具有以下函数原型。


v32int16 select32	(unsigned int select,
	v64int16 xbuff,
	int xstart,
	unsigned int xoffsets,
	unsigned int xoffsets_hi,
	unsigned int xsquare,
	int ystart,
	unsigned int yoffsets,
	unsigned int yoffsets_hi,
	unsigned int ysquare 
)	

以下是 select 的 C 语言样式伪代码。

for (int i = 0; i < 32; i++){
	idx = f( xstart, xoffsets[i], xsquare); 
	idy = f( ystart, yoffsets[i], ysquare);
	o[i] = select[i] ? y[idy]:x[idx];
}

以下示例使用 select32AB(首先是 A)的前 16 个元素进行交织。

int16 A[32]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
    16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
int16 B[32]={32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
    48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63};
v32int16 *pA=(v32int16*)A;
v32int16 *pB=(v32int16*)B;
v32int16 C = select32(0xAAAAAAAA, concat(*pA,*pB),
		0, 0x03020100, 0x07060504, 0x1100,
		32, 0x03020100, 0x07060504, 0x1100);

前述代码的 C 语言输出如下。

{0,32,1,33,2,34,3,35,4,36,5,37,6,38,7,39,8,40,9,41,10,42,11,43,12,44,13,45,14,46,15,47
}

这也可使用 shuffle32 内部函数来完成。

v32int16 C = shuffle32(concat(*pA,*pB),
	0, 0xF3F2F1F0, 0xF7F6F5F4, 0x3120);

下图显示了前述 select32 内部函数的工作方式。

图 1. int16 类型的数据选择