激活函数

tpu_bdc_relu

张量的元素做 ReLU 操作。

void tpu_bdc_relu(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)
\[\begin{split}\mathsf{dst(n, c, h, w)} = {\begin{cases} \mathsf{src(n, c, h, w)}&\mathsf{\text{如果}~shift(n, c, h, w)>0}\\ \mathsf{0}&{\text{其他情况}}\end{cases}}\end{split}\]
参数
  • 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_prelu

张量的元素做 PReLU 操作。

void tpu_bdc_prelu(local_addr_t dst_addr, local_addr_t src_addr, scalar_t alpha, const dim4 *shape, data_type_t dtype)
\[\begin{split}\mathsf{dst(n, c, h, w)} = {\begin{cases} \mathsf{src(n, c, h, w)}&\mathsf{\text{如果}~shift(n, c, h, w)>0}\\ \mathsf{\alpha\times src(n, c, h, w)}&{\text{其他情况}}\end{cases}}\end{split}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • alpha – 常数

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

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

注意事项

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

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

tpu_bdc_fp32_elu

张量的元素做 ELU 操作。

void tpu_bdc_fp32_elu(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, float alpha, const dim4 *shape)
\[\begin{split}\mathsf{dst(n, c, h, w)} = {\begin{cases} \mathsf{src(n, c, h, w)}&\mathsf{\text{如果}~shift(n, c, h, w)>0}\\ \mathsf{\alpha\times (e^{src(n, c, h, w)} - 1)}&{\text{其他情况}}\end{cases}}\end{split}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work0_addr – work0 的地址

  • work1_addr – work1 的地址

  • coeff_addr – coeff 的地址

  • table_addr – table 的地址

  • alpha – 常数

  • 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_addrsrc_addrwork0_addrwork1_addr 任意两个相等, 如果 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_sigmoid

张量的元素做 sigmoid 操作。

void tpu_bdc_fp32_sigmoid(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) = \frac{1}{1 + 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)}\) 小于 -88 或大于 103,则 \(\mathsf{e^{-src(n, c, h, w)}}\) 分别是 \(\mathsf{e^{88}}\)\(\mathsf{e^{-103}}\)

tpu_bdc_fp32_tanh

张量的元素做 tanh 操作。

void tpu_bdc_fp32_tanh(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) = \frac{e^{src(n, c, h, w)} - e^{-src(n, c, h, w)}}{e^{src(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}}\)。 如果 \(\mathsf{src(n, c, h, w)}\) 小于 -88 或大于 103,则 \(\mathsf{e^{-src(n, c, h, w)}}\) 分别是 \(\mathsf{e^{88}}\)\(\mathsf{e^{-103}}\)

tpu_bdc_fp32_softplus

张量的元素做 softplus 操作。

void tpu_bdc_fp32_softplus(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work0_addr, local_addr_t work1_addr, local_addr_t exp_coeff_addr, local_addr_t log_coeff_addr, local_addr_t exp_table_addr, const dim4 *shape, float beta)
\[\mathsf{dst(n, c, h, w) = \frac{1}{\beta}log(1 + e^{\beta\times src(n, c, h, w)})}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work0_addr – work0 的地址

  • work1_addr – work1 的地址

  • exp_coeff_addr – exp_coeff 的地址

  • log_coeff_addr – log_coeff 的地址

  • exp_table_addr – exp_table 的地址

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

注意事项

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

  • exp_coeff 通过 tpu_bdc_load_fp32_exp_coeff() 加载, log_coeff 通过 tpu_bdc_load_fp32_log_coeff() 加载, exp_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{\beta\times src(n, c, h, w)}\) 小于 -103 或大于 88,则 \(\mathsf{e^{\beta\times src(n, c, h, w)}}\) 分别是 \(\mathsf{e^{-103}}\)\(\mathsf{e^{88}}\)

tpu_bdc_fp32_erf

张量的元素做 erf 操作。

void tpu_bdc_fp32_erf(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work0_addr, local_addr_t work1_addr, local_addr_t work2_addr, local_addr_t exp_coeff_addr, local_addr_t erf_coeff_addr, local_addr_t exp_table_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = \frac{2}{\sqrt{\pi}}\int_{0}^{src(n, c, h, w)}e^{-t^2}dt}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work0_addr – work0 的地址

  • work1_addr – work1 的地址

  • work2_addr – work2 的地址

  • exp_coeff_addr – exp_coeff 的地址

  • erf_coeff_addr – erf_coeff 的地址

  • exp_table_addr – exp_table 的地址

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

注意事项

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

  • exp_coeff 通过 tpu_bdc_load_fp32_exp_coeff() 加载, erf_coeff 通过 tpu_bdc_load_fp32_erf_coeff() 加载, exp_table 通过 tpu_bdc_load_fp32_exp_table() 加载。

  • work0、work1 和 work2 存放中间结果,不允许 dst_addrsrc_addrwork0_addrwork1_addrwork2_addr 任意两个相等, 如果 dst、work1 和 exp_table 两两之间没有 bank conflicting,则性能更优。

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

  • 如果计算过程中 \(\mathsf{e^t}\) 的指数 t 小于 -103 或大于 88,则 \(\mathsf{e^{t}}\) 分别是 \(\mathsf{e^{-103}}\)\(\mathsf{e^{88}}\)

tpu_bdc_fp32_erfc

张量的元素做 erfc 操作。

void tpu_bdc_fp32_erfc(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work0_addr, local_addr_t work1_addr, local_addr_t work2_addr, local_addr_t exp_coeff_addr, local_addr_t erf_coeff_addr, local_addr_t exp_table_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = 1 - \frac{2}{\sqrt{\pi}}\int_{0}^{src(n, c, h, w)}e^{-t^2}dt}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work0_addr – work0 的地址

  • work1_addr – work1 的地址

  • work2_addr – work2 的地址

  • exp_coeff_addr – exp_coeff 的地址

  • erf_coeff_addr – erf_coeff 的地址

  • exp_table_addr – exp_table 的地址

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

注意事项

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

  • exp_coeff 通过 tpu_bdc_load_fp32_exp_coeff() 加载, erf_coeff 通过 tpu_bdc_load_fp32_erf_coeff() 加载, exp_table 通过 tpu_bdc_load_fp32_exp_table() 加载。

  • work0、work1 和 work2 存放中间结果,不允许 dst_addrsrc_addrwork0_addrwork1_addrwork2_addr 任意两个相等, 如果 dst、work1 和 exp_table 两两之间没有 bank conflicting,则性能更优。

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

  • 如果计算过程中 \(\mathsf{e^t}\) 的指数 t 小于 -103 或大于 88,则 \(\mathsf{e^{t}}\) 分别是 \(\mathsf{e^{-103}}\)\(\mathsf{e^{88}}\)

tpu_bdc_fp32_gelu

张量的元素做 GELU 操作。

void tpu_bdc_fp32_gelu(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work0_addr, local_addr_t work1_addr, local_addr_t work2_addr, local_addr_t work3_addr, local_addr_t exp_coeff_addr, local_addr_t erf_coeff_addr, local_addr_t exp_table_addr, const dim4 *shape)
\[\mathsf{dst(n, c, h, w) = \frac{1}{2}\left(1 + erf\left(\frac{src(n, c, h, w)}{\sqrt{2}}\right)\right)}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work0_addr – work0 的地址

  • work1_addr – work1 的地址

  • work2_addr – work2 的地址

  • work3_addr – work3 的地址

  • exp_coeff_addr – exp_coeff 的地址

  • erf_coeff_addr – erf_coeff 的地址

  • exp_table_addr – exp_table 的地址

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

注意事项

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

  • exp_coeff 通过 tpu_bdc_load_fp32_exp_coeff() 加载, erf_coeff 通过 tpu_bdc_load_fp32_erf_coeff() 加载, exp_table 通过 tpu_bdc_load_fp32_exp_table() 加载。

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

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

  • erf 见 tpu_bdc_fp32_erf()

tpu_bdc_fp32_gelu_fast

张量的元素做快速 GELU 操作。

void tpu_bdc_fp32_gelu_fast(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) = \frac{src(n, c, h, w)}{2}\times\left(1 + tanh\left(\sqrt{\frac{2}{\pi}}\times\left(src(n, c, h, w) + 0.044715\times src(n, c, h, w)^3\right)\right)\right)}\]
参数
  • 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_addrsrc_addrwork0_addrwork1_addr 任意两个相等, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。

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

  • tanh 见 tpu_bdc_fp32_tanh()

tpu_bdc_fp32_mish

张量的元素做 mish 操作。

void tpu_bdc_fp32_mish(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) = src(n, c, h, w)\times tanh(log(1 + e^{src(n, c, h, w)}))}\]
\[\mathsf{= src(n, c, h, w)\times\left(1 - 2\times\frac{1}{(1 + e^{src(n, c, h, w)})^2 + 1}\right)}\]
参数
  • 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_addrsrc_addrwork0_addrwork1_addr 任意两个相等, 如果 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_silu

张量的元素做 SiLU 操作。

void tpu_bdc_fp32_silu(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) = src(n, c, h, w)\times\frac{1}{1 + 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_addrsrc_addrwork0_addrwork1_addr 任意两个相等, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。

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

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

tpu_bdc_fp32_selu

张量的元素做 SELU 操作。

void tpu_bdc_fp32_selu(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, float alpha, const dim4 *shape)
\[\begin{split}\mathsf{dst(n, c, h, w)} = \mathsf{\lambda\times}{\begin{cases} \mathsf{src(n, c, h, w)}&\mathsf{\text{如果}~shift(n, c, h, w)>0}\\ \mathsf{\alpha\times (e^{src(n, c, h, w)} - 1)}&{\text{其他情况}}\end{cases}}\end{split}\]
\[\mathsf{\alpha = 1.6732632423543772848170429916717}\]
\[\mathsf{\lambda = 1.0507009873554804934193349852946}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work0_addr – work0 的地址

  • work1_addr – work1 的地址

  • coeff_addr – coeff 的地址

  • table_addr – table 的地址

  • alpha – 常数

  • 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_addrsrc_addrwork0_addrwork1_addr 任意两个相等, 如果 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_fp_hsigmoid

张量的元素做 HARDSIGMOID 操作。

tpu_bdc_fp_hsigmoid(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work0_addr, const dim4 *shape, float alpha, float beta, data_type_t dtype)
.. math::
\mathsf{dst(n, c, h, w)} = \mathsf{\lambda\times}{\begin{cases}
\mathsf{0}&\mathsf{\text{如果}~x<=-3}\    \mathsf{1}&\mathsf{\text{如果}~x>=3}\    \mathsf{\alpha \times \left(  \mathsf{src(n, c, h, w)} + \beta \right)}&{\text{其他情况}}\end{cases}}
.. math:: \mathsf{\alpha = 0.166666666666666666666666666667}
.. math:: \mathsf{\beta =  0.5}
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work0_addr – work0 的地址

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

  • alpha – 常数

  • beta – 常数

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

注意事项

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

tpu_bdc_fp_hswish

张量的元素做 HARDSWISH 操作。

tpu_bdc_fp_hswish(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t work0_addr, const dim4 *shape, data_type_t dtype)
.. math::
\mathsf{dst(n, c, h, w)} = \mathsf{\lambda\times}{\begin{cases}
\mathsf{0}&\mathsf{\text{如果}~x<=-3}\    \mathsf{src(n, c, h, w)}&\mathsf{\text{如果}~x>=3}\    \mathsf{\mathsf{src(n, c, h, w)} \times \left(  \mathsf{src(n, c, h, w)} + 0.5 \right) \div 6}&{\text{其他情况}}\end{cases}}
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • work0_addr – work0 的地址

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

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

注意事项

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