昇腾社区首页
中文
注册
开发者
下载

vsel

功能说明

根据 selectMode,选择对应输出。

selectMode为0时,该接口根据存储在SPR CMPMASK中的比较掩码(可以通过set_cmpmask()设置),在 src0 和 src1 向量之间进行2选1选择。对于类型 f16,CMPMASK[127:0] 有效;对于类型 f32,CMPMASK[63:0] 有效。如果某一位为1,则目标元素(f16 或 f32)来自src0,否则来自src1。

selectMode 为1时,该接口根据存储在 UB 中起始地址为 src1 的比较掩码,在 src0 和一个常数之间进行逐元素选择。注意,src1 指向的内存不是掩码的具体值,而是掩码的起始地址。对于 f16 类型,常数由 CMPMASK[15:0] 表示;对于 f32 类型,常数由 CMPMASK[31:0] 表示。该接口仍遵循双目运算操作数模板,但 src1 的 src1BlockStride不生效,默认 UB 中所有 CMPMASK 是连续存储的,即src1BlockStride 的重复步长为 16B(f16 类型)或8B(f32 类型)。对于f32 类型,一个比较掩码的长度为64位;对于 f16 类型,一个比较掩码的长度为128位。比较掩码的起始地址应为32B对齐。如果某一位为1,则目标元素(f16 或 f32)来自src0,否则来自该常数。

selectMode 为2时,该接口根据存储在 UB 中的比较掩码,在 src0 和 src1 向量之间进行2选1选择,其起始地址由 SPR CMPMASK 指示(规则类似 Mode1中的src1)。在选择操作之前,根据起始地址从 UB 中获取多个比较掩码到本地缓冲区。该接口会根据本地存储的比较掩码在src0 和src1之间反复进行2选1选择,直到所有比较掩码被消耗完毕。之后,自动发起另一次UB访问以获取新的比较掩码。比较掩码的起始地址应为32B对齐,并且所有比较掩码在UB中是连续存储的。如果某一位为1,则目标元素(f16 或 f32)来自 src0,否则来自 src1。

流程图示如下,其中 Xt[49:48] 对应 selectMode,[Xn] 对应 src0,[Xm] 对应 src1,[Xd] 对应 dst。

该接口支持MASK配置。如果 MASK 的一个位置为0,则 dst 对应的位置保持不变,不写入。

接口原型

// 相同接口的不同原型区别在于源地址和目的地址的数据类型不同
// src1 指向的数据类型在不同 selectMode 配置下有变化,提供 void 指针类型的接口
void vsel(__ubuf__ half *dst, __ubuf__ half *src0, __ubuf__ void *src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, uint8_t selectMode); 

void vsel(__ubuf__ float *dst, __ubuf__ float *src0, __ubuf__ void *src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, uint8_t selectMode);

参数说明

参数含义见 表2 双目运算参数说明

表1 vsel 特有参数说明

参数名

说明

selectMode

选择模式:

  • 0:根据 CMPMASK 信息,在 src0 和 src1 间选取。
  • 1:根据 src1 间接寻址的 MASK,在 src0 和(CMPMASK 存储的)常数间选取。
  • 2:根据 CMPMASK 间接寻址的 MASK,在 src0 和 src1 间选取。

流水类型

PIPE_V