一元操作

tpu_bdc_abs

取张量的元素的绝对值。

void tpu_bdc_abs(local_addr_t dst_addr, local_addr_t src_addr, const dim4 *shape, const dim4 *dst_stride, const dim4 *src_stride, data_type_t dtype)
\[\mathsf{dst(n, c, h, w) = |src(n, c, h, w)|}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • shape – 指向 dst 和 src 的 shape 的指针

  • dst_stride – 指向 dst 的 stride 的指针

  • src_stride – 指向 src 的 stride 的指针

  • dtype – dst 和 src 的元素的数据类型

注意事项

  • dst 和 src 从同一个 NPU 开始。

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

  • 如果张量的 stride 指针是 NULL,则此张量是 64-byte aligned layout,否则是 free layout

tpu_bdc_not

张量的元素按位取反。

void tpu_bdc_not(local_addr_t dst_addr, local_addr_t src_addr, const dim4 *shape, const dim4 *dst_stride, const dim4 *src_stride, data_type_t dtype)
\[\mathsf{dst(n, c, h, w) = \textbf{NOT}(src(n, c, h, w))}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • shape – 指向 dst 和 src 的 shape 的指针

  • dst_stride – 指向 dst 的 stride 的指针

  • src_stride – 指向 src 的 stride 的指针

  • dtype – dst 和 src 的元素的数据类型

注意事项

  • dst 和 src 从同一个 NPU 开始。

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

  • 如果张量的 stride 指针是 NULL,则此张量是 64-byte aligned layout,否则是 free layout

tpu_bdc_neg

张量的元素取相反数。

void tpu_bdc_neg(local_addr_t dst_addr, local_addr_t src_addr, const dim4 *shape, const dim4 *dst_stride, const dim4 *src_stride, data_type_t dtype)
\[\mathsf{dst(n, c, h, w) = -src(n, c, h, w)}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • shape – 指向 dst 和 src 的 shape 的指针

  • dst_stride – 指向 dst 的 stride 的指针

  • src_stride – 指向 src 的 stride 的指针

  • dtype – dst 和 src 的元素的数据类型

注意事项

  • dst 和 src 从同一个 NPU 开始。

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

  • 如果张量的 stride 指针是 NULL,则此张量是 64-byte aligned layout,否则是 free layout

  • 如果 dtypeDT_UINT32DT_UINT16DT_UINT8, 则 dst 的元素的数据类型是 DT_INT32DT_INT16DT_INT8

tpu_bdc_fp32_reciprocal

张量的元素取倒数。

void tpu_bdc_fp32_reciprocal(local_addr_t dst_addr, local_addr_t src_addr, const dim4 *shape, const dim4 *dst_stride, const dim4 *src_stride)
\[\mathsf{dst(n, c, h, w) = \frac{1}{src(n, c, h, w)}}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • shape – 指向 dst 和 src 的 shape 的指针

  • dst_stride – 指向 dst 的 stride 的指针

  • src_stride – 指向 src 的 stride 的指针

注意事项

  • dst 和 src 从同一个 NPU 开始。

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

  • 如果张量的 stride 指针是 NULL,则此张量是 64-byte aligned layout,否则是 free layout

  • 等价于 Newton 迭代次数是 3 的 tpu_bdc_fp32_tunable_reciprocal()

tpu_bdc_fp32_tunable_reciprocal

张量的元素取倒数。

void tpu_bdc_fp32_tunable_reciprocal(local_addr_t dst_addr, local_addr_t src_addr, const dim4 *shape, const dim4 *dst_stride, const dim4 *src_stride, int num_iter)
\[\mathsf{dst(n, c, h, w) = \frac{1}{src(n, c, h, w)}}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • shape – 指向 dst 和 src 的 shape 的指针

  • dst_stride – 指向 dst 的 stride 的指针

  • src_stride – 指向 src 的 stride 的指针

  • num_iter – Newton 迭代次数

注意事项

  • dst 和 src 从同一个 NPU 开始。

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

  • 如果张量的 stride 指针是 NULL,则此张量是 64-byte aligned layout,否则是 free layout

  • num_iter 是性能参数,取值范围是 [1, 4]。

tpu_bdc_fp32_rsqrt

张量的元素的算术平方根倒数。

void tpu_bdc_fp32_rsqrt(local_addr_t dst_addr, local_addr_t src_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = \frac{1}{\sqrt{src(n, c, h, w)}}}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • shape – 指向 dst 和 src 的 shape 的指针

注意事项

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

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

  • 等价于 Newton 迭代次数是 3 的 tpu_bdc_fp32_tunable_rsqrt()

tpu_bdc_fp32_tunable_rsqrt

张量的元素的算术平方根倒数。

void tpu_bdc_fp32_tunable_rsqrt(local_addr_t dst_addr, local_addr_t src_addr, const dim4 *shape, int num_iter)
\[\mathsf{dst(n, c, h, w) = \frac{1}{\sqrt{src(n, c, h, w)}}}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • shape – 指向 dst 和 src 的 shape 的指针

  • num_iter – Newton 迭代次数

注意事项

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

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

  • num_iter 是性能参数,取值范围是 [1, 4]。

tpu_bdc_fp32_sqrt

张量的元素的算术平方根。

void tpu_bdc_fp32_sqrt(local_addr_t dst_addr, local_addr_t src_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = \sqrt{src(n, c, h, w)}}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • shape – 指向 dst 和 src 的 shape 的指针

注意事项

  • dst 和 src 从同一个 NPU 开始,都是 64-byte aligned layout,不允许 dst_addrsrc_addr 相同。

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

  • 等价于 Newton 迭代次数是 3 的 tpu_bdc_fp32_tunable_sqrt()

tpu_bdc_fp32_tunable_sqrt

张量的元素的算术平方根。

void tpu_bdc_fp32_tunable_sqrt(local_addr_t dst_addr, local_addr_t src_addr, const dim4 *shape, int num_iter)
\[\mathsf{dst(n, c, h, w) = \sqrt{src(n, c, h, w)}}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • shape – 指向 dst 和 src 的 shape 的指针

  • num_iter – Newton 迭代次数

注意事项

  • dst 和 src 从同一个 NPU 开始,都是 64-byte aligned layout,不允许 dst_addrsrc_addr 相同。

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

  • num_iter 是性能参数,取值范围是 [1, 4]。

tpu_bdc_fp32_exp

张量的元素为指数,自然常数 e 为底数的指数运算。

void tpu_bdc_fp32_exp(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work0_addr, local_addr_t work1_addr, local_addr_t coeff_addr, local_addr_t table_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = e^{src(n, c, h, w)}}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work0_addr – work0 的地址

  • work1_addr – work1 的地址

  • coeff_addr – coeff 的地址

  • table_addr – table 的地址

  • shape – dst、src、work0 和 work1 的 shape 的指针

注意事项

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

  • coeff 通过 tpu_bdc_load_fp32_exp_coeff() 加载,table 通过 tpu_bdc_load_fp32_exp_table() 加载。

  • work0 和 work1 存放中间结果,不允许 dst_addrwork0_addrwork1_addr 任意两个相等, 允许 src_addr 等于 dst_addrwork0_addrwork1_addr,此情况下 src 的数据会被覆盖, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。

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

  • 如果 \(\mathsf{src(n, c, h, w)}\) 小于 -103 或大于 88,则 \(\mathsf{e^{src(n, c, h, w)}}\) 分别是 \(\mathsf{e^{-103}}\)\(\mathsf{e^{88}}\)

tpu_bdc_fp32_expm1

张量的元素为指数,自然常数 e 为底数的指数运算,结果再减 1。

void tpu_bdc_fp32_expm1(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work0_addr, local_addr_t work1_addr, local_addr_t coeff_addr, local_addr_t table_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = e^{src(n, c, h, w)} - 1}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work0_addr – work0 的地址

  • work1_addr – work1 的地址

  • coeff_addr – coeff 的地址

  • table_addr – table 的地址

  • shape – dst、src、work0 和 work1 的 shape 的指针

注意事项

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

  • coeff 通过 tpu_bdc_load_fp32_exp_coeff() 加载,table 通过 tpu_bdc_load_fp32_exp_table() 加载。

  • work0 和 work1 存放中间结果,不允许 dst_addrwork0_addrwork1_addr 任意两个相等, 允许 src_addr 等于 dst_addrwork0_addrwork1_addr,此情况下 src 的数据会被覆盖, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。

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

  • 如果 \(\mathsf{src(n, c, h, w)}\) 小于 -103 或大于 88,则 \(\mathsf{e^{src(n, c, h, w)}}\) 分别是 \(\mathsf{e^{-103}}\)\(\mathsf{e^{88}}\)

tpu_bdc_fp32_log

以自然常数 e 为底数对张量的元素做对数运算。

void tpu_bdc_fp32_log(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work_addr, local_addr_t coeff_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = log(src(n, c, h, w))}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work_addr – work 的地址

  • coeff_addr – coeff 的地址

  • shape – dst、src 和 work 的 shape 的指针

注意事项

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

  • coeff 通过 tpu_bdc_load_fp32_log_coeff() 加载。

  • work 存放中间结果,不允许 dst_addr 等于 work_addr, 允许 src_addr 等于 dst_addrwork_addr,此情况下 src 的数据会被覆盖。

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

tpu_bdc_fp32_log1p

以自然常数 e 为底数对张量的元素加 1 的结果做对数运算。

void tpu_bdc_fp32_log1p(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work_addr, local_addr_t coeff_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = log(src(n, c, h, w) + 1)}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work_addr – work 的地址

  • coeff_addr – coeff 的地址

  • shape – dst、src 和 work 的 shape 的指针

注意事项

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

  • coeff 通过 tpu_bdc_load_fp32_log_coeff() 加载。

  • work 存放中间结果,不允许 dst_addr 等于 work_addr, 允许 src_addr 等于 dst_addrwork_addr,此情况下 src 的数据会被覆盖。

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

tpu_bdc_fp32_logx

以 x 为底数对张量的元素做对数运算。

void tpu_bdc_fp32_logx(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work_addr, local_addr_t coeff_addr, const dim4 *shape, float x)
\[\mathsf{dst(n, c, h, w) = log_x(src(n, c, h, w))}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work_addr – work 的地址

  • coeff_addr – coeff 的地址

  • shape – dst、src 和 work 的 shape 的指针

  • x – 底数

注意事项

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

  • coeff 通过 tpu_bdc_load_fp32_log_coeff() 加载。

  • work 存放中间结果,不允许 dst_addr 等于 work_addr, 允许 src_addr 等于 dst_addrwork_addr,此情况下 src 的数据会被覆盖。

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

  • x 大于 0。

tpu_bdc_sign

张量的元素做 sign 操作。

void tpu_bdc_sign(local_addr_t dst_addr, local_addr_t src_addr, const dim4 *shape, data_type_t dtype)
\[\begin{split}\mathsf{dst(n, c, h, w)} = {\begin{cases} \mathsf{1}&\mathsf{\text{如果}~src(n, c, h, w)>0}\\ \mathsf{0}&\mathsf{\text{如果}~src(n, c, h, w)=0}\\ \mathsf{-1}&\mathsf{\text{如果}~src(n, c, h, w)<0}\end{cases}}\end{split}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • shape – 指向 dst 的 shape 的指针

  • dtype – dst 和 src 的元素的数据类型

注意事项

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

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

  • 如果 dtype 是无符号的,则允许 dst_addrsrc_addr 相同。

tpu_bdc_fp32_sin

对张量的元素做 sin 运算。

void tpu_bdc_fp32_sin(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work_addr, local_addr_t coeff_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = sin(src(n, c, h, w))}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work_addr – work 的地址

  • coeff_addr – coeff 的地址

  • shape – dst、src 和 work 的 shape 的指针

注意事项

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

  • coeff 通过 tpu_bdc_load_fp32_sin_coeff() 加载。

  • work 存放中间结果,不允许 dst_addr 等于 work_addr, 允许 src_addr 等于 dst_addrwork_addr,此情况下 src 的数据会被覆盖。

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

tpu_bdc_fp32_cos

对张量的元素做 cos 运算。

void tpu_bdc_fp32_cos(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work_addr, local_addr_t coeff_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = sin(src(n, c, h, w))}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work_addr – work 的地址

  • coeff_addr – coeff 的地址

  • shape – dst、src 和 work 的 shape 的指针

注意事项

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

  • coeff 通过 tpu_bdc_load_fp32_cos_coeff() 加载。

  • work 存放中间结果,不允许 dst_addr 等于 work_addr, 允许 src_addr 等于 dst_addrwork_addr,此情况下 src 的数据会被覆盖。

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

tpu_bdc_fp32_tan

对张量的元素做 tan 运算。

void tpu_bdc_fp32_tan(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work_addr, local_addr_t coeff_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = tan(src(n, c, h, w))}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work_addr – work 的地址

  • coeff_addr – coeff 的地址

  • shape – dst、src 和 work 的 shape 的指针

注意事项

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

  • coeff 通过 tpu_bdc_load_fp32_tan_coeff() 加载。

  • work 存放中间结果,不允许 dst_addrsrc_addrwork_addr 任意两个相等。

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

tpu_bdc_fp32_cot

对张量的元素做 cot 运算。

void tpu_bdc_fp32_cot(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work_addr, local_addr_t coeff_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = cot(src(n, c, h, w))}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work_addr – work 的地址

  • coeff_addr – coeff 的地址

  • shape – dst、src 和 work 的 shape 的指针

注意事项

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

  • coeff 通过 tpu_bdc_load_fp32_tan_coeff() 加载。

  • work 存放中间结果,不允许 dst_addrsrc_addrwork_addr 任意两个相等。

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

tpu_bdc_fp32_arcsin

对张量的元素做 arcsin 运算。

void tpu_bdc_fp32_arcsin(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work_addr, local_addr_t coeff_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = arcsin(src(n, c, h, w))}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work_addr – work 的地址

  • coeff_addr – coeff 的地址

  • shape – dst、src 和 work 的 shape 的指针

注意事项

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

  • coeff 通过 tpu_bdc_load_fp32_arcsin_coeff() 加载。

  • work 存放中间结果,不允许 dst_addr 等于 work_addr, 允许 src_addr 等于 dst_addrwork_addr,此情况下 src 的数据会被覆盖。

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

  • src 的元素的取值范围是 [-1, 1],dst 的元素的范围是 \([-\frac{\pi}{2}, \frac{\pi}{2}]\)

tpu_bdc_fp32_arccos

对张量的元素做 arccos 运算。

void tpu_bdc_fp32_arccos(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work_addr, local_addr_t coeff_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = arccos(src(n, c, h, w))}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work_addr – work 的地址

  • coeff_addr – coeff 的地址

  • shape – dst、src 和 work 的 shape 的指针

注意事项

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

  • coeff 通过 tpu_bdc_load_fp32_arcsin_coeff() 加载。

  • work 存放中间结果,不允许 dst_addr 等于 work_addr, 允许 src_addr 等于 dst_addrwork_addr,此情况下 src 的数据会被覆盖。

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

  • src 的元素的取值范围是 [-1, 1],dst 的元素的范围是 \([0, \pi]\)