激活函数
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->n、shape->c、shape->h 和 shape->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->n、shape->c、shape->h 和 shape->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_addr、src_addr、work0_addr 和 work1_addr 任意两个相等, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。
shape->n、shape->c、shape->h 和 shape->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_addr、work0_addr 和 work1_addr 任意两个相等, 允许 src_addr 等于 dst_addr、work0_addr 或 work1_addr,此情况下 src 的数据会被覆盖, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。
shape->n、shape->c、shape->h 和 shape->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_addr、work0_addr 和 work1_addr 任意两个相等, 允许 src_addr 等于 dst_addr、work0_addr 或 work1_addr,此情况下 src 的数据会被覆盖, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。
shape->n、shape->c、shape->h 和 shape->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_addr、work0_addr 和 work1_addr 任意两个相等, 允许 src_addr 等于 dst_addr、work0_addr 或 work1_addr,此情况下 src 的数据会被覆盖, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。
shape->n、shape->c、shape->h 和 shape->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_addr、src_addr、work0_addr、work1_addr 和 work2_addr 任意两个相等, 如果 dst、work1 和 exp_table 两两之间没有 bank conflicting,则性能更优。
shape->n、shape->c、shape->h 和 shape->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_addr、src_addr、work0_addr、work1_addr 和 work2_addr 任意两个相等, 如果 dst、work1 和 exp_table 两两之间没有 bank conflicting,则性能更优。
shape->n、shape->c、shape->h 和 shape->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_addr、work0_addr、work1_addr、work2_addr 和 work3_addr 任意两个相等, 允许 src_addr 等于 dst_addr、work0_addr、work1_addr、work2_addr 或 work3_addr,此情况下 src 的数据会被覆盖, 如果 dst、work1 和 exp_table 两两之间没有 bank conflicting,则性能更优。
shape->n、shape->c、shape->h 和 shape->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_addr、src_addr、work0_addr 和 work1_addr 任意两个相等, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。
shape->n、shape->c、shape->h 和 shape->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_addr、src_addr、work0_addr 和 work1_addr 任意两个相等, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。
shape->n、shape->c、shape->h 和 shape->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_addr、src_addr、work0_addr 和 work1_addr 任意两个相等, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。
shape->n、shape->c、shape->h 和 shape->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_addr、src_addr、work0_addr 和 work1_addr 任意两个相等, 如果 dst、work1 和 table 两两之间没有 bank conflicting,则性能更优。
shape->n、shape->c、shape->h 和 shape->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}}\)。