比较选择函数

tpu_bdc_greater_select

两个张量的元素比较大小,选取另外两个张量的元素作为结果。

void tpu_bdc_greater_select(local_addr_t dst_addr, const variable_t *src0, const variable_t *src1, const variable_t *src2, const variable_t *src3, const dim4 *shape, data_type_t src0_src1_dtype, data_type_t dst_dtype)
\[\begin{split}\mathsf{dst(n, c, h, w)} = {\begin{cases} \mathsf{src2}&\mathsf{\text{如果}~src0 > src1}\\ \mathsf{src3}&{\text{其他情况}}\end{cases}}\end{split}\]

对于上式中的 src0、src1、src2 和 src3,如果 src->typeTENSOR,则取 \(\mathsf{src(n, c, h, w)}\), 如果 src->typeVECTOR,则取 \(\mathsf{src(0, c~~mod~~NPU\_NUM, 0, 0)}\), 如果 src->typeSCALAR,则取对应的常数。

参数
  • dst_addr – dst 的地址

  • src0 – 指向 src0 的指针

  • src1 – 指向 src1 的指针

  • src2 – 指向 src2 的指针

  • src3 – 指向 src3 的指针

  • shape – 指向 dst 的 shape 的指针

  • src0_src1_dtype – src0 和 src1 的元素的数据类型

  • dst_dtype – dst、src2 和 src3 的元素的数据类型

注意事项

  • dst 和 src 从同一个 NPU 开始,dst 是 64-byte aligned layout

  • 如果 src->typeTENSOR,则 src 与 dst 的 shape 相同,64-byte aligned layout, 如果 src->typeVECTOR,则 src 的 shape 是 [1, shape->c, 1, 1]。

  • shape->nshape->cshape->hshape->w 的取值范围是 [1, 65535]。

  • src0_src1_dtype 的位宽小于等于 dst_dtype 的位宽。

tpu_bdc_less_select

两个张量的元素比较大小,选取另外两个张量的元素作为结果。

void tpu_bdc_less_select(local_addr_t dst_addr, const variable_t *src0, const variable_t *src1, const variable_t *src2, const variable_t *src3, const dim4 *shape, data_type_t src0_src1_dtype, data_type_t dst_dtype)
\[\begin{split}\mathsf{dst(n, c, h, w)} = {\begin{cases} \mathsf{src2}&\mathsf{\text{如果}~src0 < src1}\\ \mathsf{src3}&{\text{其他情况}}\end{cases}}\end{split}\]

对于上式中的 src0、src1、src2 和 src3,如果 src->typeTENSOR,则取 \(\mathsf{src(n, c, h, w)}\), 如果 src->typeVECTOR,则取 \(\mathsf{src(0, c~~mod~~NPU\_NUM, 0, 0)}\), 如果 src->typeSCALAR,则取对应的常数。

参数
  • dst_addr – dst 的地址

  • src0 – 指向 src0 的指针

  • src1 – 指向 src1 的指针

  • src2 – 指向 src2 的指针

  • src3 – 指向 src3 的指针

  • shape – 指向 dst 的 shape 的指针

  • src0_src1_dtype – src0 和 src1 的元素的数据类型

  • dst_dtype – dst、src2 和 src3 的元素的数据类型

注意事项

  • dst 和 src 从同一个 NPU 开始,dst 是 64-byte aligned layout

  • 如果 src->typeTENSOR,则 src 与 dst 的 shape 相同,64-byte aligned layout, 如果 src->typeVECTOR,则 src 的 shape 是 [1, shape->c, 1, 1]。

  • shape->nshape->cshape->hshape->w 的取值范围是 [1, 65535]。

  • src0_src1_dtype 的位宽小于等于 dst_dtype 的位宽。

tpu_bdc_equal_select

两个张量的元素比较大小,选取另外两个张量的元素作为结果。

void tpu_bdc_equal_select(local_addr_t dst_addr, const variable_t *src0, const variable_t *src1, const variable_t *src2, const variable_t *src3, const dim4 *shape, data_type_t src0_src1_dtype, data_type_t dst_dtype)
\[\begin{split}\mathsf{dst(n, c, h, w)} = {\begin{cases} \mathsf{src2}&\mathsf{\text{如果}~src0 = src1}\\ \mathsf{src3}&{\text{其他情况}}\end{cases}}\end{split}\]

对于上式中的 src0、src1、src2 和 src3,如果 src->typeTENSOR,则取 \(\mathsf{src(n, c, h, w)}\), 如果 src->typeVECTOR,则取 \(\mathsf{src(0, c~~mod~~NPU\_NUM, 0, 0)}\), 如果 src->typeSCALAR,则取对应的常数。

参数
  • dst_addr – dst 的地址

  • src0 – 指向 src0 的指针

  • src1 – 指向 src1 的指针

  • src2 – 指向 src2 的指针

  • src3 – 指向 src3 的指针

  • shape – 指向 dst 的 shape 的指针

  • src0_src1_dtype – src0 和 src1 的元素的数据类型

  • dst_dtype – dst、src2 和 src3 的元素的数据类型

注意事项

  • dst 和 src 从同一个 NPU 开始,dst 是 64-byte aligned layout

  • 如果 src->typeTENSOR,则 src 与 dst 的 shape 相同,64-byte aligned layout, 如果 src->typeVECTOR,则 src 的 shape 是 [1, shape->c, 1, 1]。

  • shape->nshape->cshape->hshape->w 的取值范围是 [1, 65535]。

  • src0_src1_dtype 的位宽小于等于 dst_dtype 的位宽。

tpu_bdc_maximum_greater_select

两个张量的元素比较大小,选取其中较大的和另外两个张量的元素作为结果。

void tpu_bdc_maximum_greater_select(local_addr_t dst0_addr, local_addr_t dst1_addr, const variable_t *src0, const variable_t *src1, const variable_t *src2, const variable_t *src3, const dim4 *shape, data_type_t dst0_dtype, data_type_t dst1_dtype)
\[\mathsf{dst0(n, c, h, w) = max(src0, src1)}\]
\[\begin{split}\mathsf{dst1(n, c, h, w)} = {\begin{cases} \mathsf{src2}&\mathsf{\text{如果}~src0 > src1}\\ \mathsf{src3}&{\text{其他情况}}\end{cases}}\end{split}\]

对于上式中的 src0、src1、src2 和 src3,如果 src->typeTENSOR,则取 \(\mathsf{src(n, c, h, w)}\), 如果 src->typeVECTOR,则取 \(\mathsf{src(0, c~~mod~~NPU\_NUM, 0, 0)}\), 如果 src->typeSCALAR,则取对应的常数。

参数
  • dst0_addr – dst0 的地址

  • dst1_addr – dst1 的地址

  • src0 – 指向 src0 的指针

  • src1 – 指向 src1 的指针

  • src2 – 指向 src2 的指针

  • src3 – 指向 src3 的指针

  • shape – 指向 dst0 和 dst1 的 shape 的指针

  • dst0_dtype – dst0、src0 和 src1 的元素的数据类型

  • dst1_dtype – dst1、src2 和 src3 的元素的数据类型

注意事项

  • dst 和 src 从同一个 NPU 开始,dst 是 64-byte aligned layout

  • 如果 src->typeTENSOR,则 src 与 dst 的 shape 相同,64-byte aligned layout, 如果 src->typeVECTOR,则 src 的 shape 是 [1, shape->c, 1, 1]。

  • shape->nshape->cshape->hshape->w 的取值范围是 [1, 65535]。

  • dst0_dtype 的位宽等于 dst1_dtype 的位宽。

tpu_bdc_minimum_less_select

两个张量的元素比较大小,选取其中较小的和另外两个张量的元素作为结果。

void tpu_bdc_minimum_less_select(local_addr_t dst0_addr, local_addr_t dst1_addr, const variable_t *src0, const variable_t *src1, const variable_t *src2, const variable_t *src3, const dim4 *shape, data_type_t dst0_dtype, data_type_t dst1_dtype)
\[\mathsf{dst0(n, c, h, w) = min(src0, src1)}\]
\[\begin{split}\mathsf{dst1(n, c, h, w)} = {\begin{cases} \mathsf{src2}&\mathsf{\text{如果}~src0 < src1}\\ \mathsf{src3}&{\text{其他情况}}\end{cases}}\end{split}\]

对于上式中的 src0、src1、src2 和 src3,如果 src->typeTENSOR,则取 \(\mathsf{src(n, c, h, w)}\), 如果 src->typeVECTOR,则取 \(\mathsf{src(0, c~~mod~~NPU\_NUM, 0, 0)}\), 如果 src->typeSCALAR,则取对应的常数。

参数
  • dst0_addr – dst0 的地址

  • dst1_addr – dst1 的地址

  • src0 – 指向 src0 的指针

  • src1 – 指向 src1 的指针

  • src2 – 指向 src2 的指针

  • src3 – 指向 src3 的指针

  • shape – 指向 dst0 和 dst1 的 shape 的指针

  • dst0_dtype – dst0、src0 和 src1 的元素的数据类型

  • dst1_dtype – dst1、src2 和 src3 的元素的数据类型

注意事项

  • dst 和 src 从同一个 NPU 开始,dst 是 64-byte aligned layout

  • 如果 src->typeTENSOR,则 src 与 dst 的 shape 相同,64-byte aligned layout, 如果 src->typeVECTOR,则 src 的 shape 是 [1, shape->c, 1, 1]。

  • shape->nshape->cshape->hshape->w 的取值范围是 [1, 65535]。

  • dst0_dtype 的位宽等于 dst1_dtype 的位宽。