一元操作
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->n、shape->c、shape->h 和 shape->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->n、shape->c、shape->h 和 shape->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 的元素的数据类型
注意事项
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->n、shape->c、shape->h 和 shape->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->n、shape->c、shape->h 和 shape->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->n、shape->c、shape->h 和 shape->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->n、shape->c、shape->h 和 shape->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_addr 与 src_addr 相同。
shape->n、shape->c、shape->h 和 shape->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_addr 与 src_addr 相同。
shape->n、shape->c、shape->h 和 shape->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_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}}\)。
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_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}}\)。
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_addr 或 work_addr,此情况下 src 的数据会被覆盖。
shape->n、shape->c、shape->h 和 shape->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_addr 或 work_addr,此情况下 src 的数据会被覆盖。
shape->n、shape->c、shape->h 和 shape->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_addr 或 work_addr,此情况下 src 的数据会被覆盖。
shape->n、shape->c、shape->h 和 shape->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->n、shape->c、shape->h 和 shape->w 的取值范围是 [1, 65535]。
如果 dtype 是无符号的,则允许 dst_addr 与 src_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_addr 或 work_addr,此情况下 src 的数据会被覆盖。
shape->n、shape->c、shape->h 和 shape->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_addr 或 work_addr,此情况下 src 的数据会被覆盖。
shape->n、shape->c、shape->h 和 shape->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_addr、src_addr 和 work_addr 任意两个相等。
shape->n、shape->c、shape->h 和 shape->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_addr、src_addr 和 work_addr 任意两个相等。
shape->n、shape->c、shape->h 和 shape->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_addr 或 work_addr,此情况下 src 的数据会被覆盖。
shape->n、shape->c、shape->h 和 shape->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_addr 或 work_addr,此情况下 src 的数据会被覆盖。
shape->n、shape->c、shape->h 和 shape->w 的取值范围是 [1, 65535]。
src 的元素的取值范围是 [-1, 1],dst 的元素的范围是 \([0, \pi]\)。