特殊函数

tpu_bdc_fp_taylor

张量的元素的 Taylor 级数。

void tpu_bdc_fp_taylor(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t coeff_addr, const dim4 *shape, int num, data_type_t dtype)
\[\mathsf{dst(n, c, h, w) = \sum_{i = 0}^{num - 1}coeff(0, c~~mod~~NPU\_NUM, 0, i) \times src(n, c, h, w)^i}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • coeff_addr – coeff 的地址

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

  • num – Taylor 级数的项数

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

注意事项

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

  • coeff 从 NPU 0 开始,shape 是 [1, NPU_NUM, 1, num],64-byte aligned layout

  • num 大于等于 2。

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

tpu_bdc_table_lookup

通过张量的元素查表。

void tpu_bdc_table_lookup(local_addr_t dst_addr, local_addr_t src_addr, local_addr_t table_addr, const dim4 *shape, int len, data_type_t dst_dtype, data_type_t src_dtype)
\[\mathsf{dst(n, c, h, w) = table(0, c~~mod~~NPU\_NUM, 0, src(n, c, h, w))}\]
参数
  • dst_addr – dst 的地址

  • src_addr – src 的地址

  • table_addr – table 的地址

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

  • len – 表的长度

  • dst_dtype – dst 和 table 的元素的数据类型

  • src_dtype – src 的元素的数据类型

注意事项

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

  • table 从 NPU 0 开始,shape 是 [1, NPU_NUM, 1, len],64-byte aligned layout

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

  • src_dtype 的有效取值是 DT_UINT16DT_UINT8,src 的元素的取值范围是 [0, len - 1]。

  • 如果 dst、src 和 table 两两之间没有 bank conflicting,则性能更优。

tpu_bdc_arithmetic_sequence_bcast

生成等差数列,广播到各个 NPU。

void tpu_bdc_arithmetic_sequence_bcast(local_addr_t dst_addr, int npu_num, int start, int step, int num)
\[\mathsf{dst(0, c, 0, w) = start + step \times w}\]
参数
  • dst_addr – dst 的地址

  • npu_num – 广播 NPU 的数量

  • start – 等差数列的首项

  • step – 等差数列的步长

  • num – 等差数列的项数

注意事项

  • dst 的 shape 是 [1, npu_num, 1, num],64-byte aligned layout,元素的数据类型是 INT32。

  • 如果 dst 从 NPU X 开始,X 的取值范围是 [0, NPU_NUM - 1],则 npu_num 小于等于 NPU_NUM - X。

  • num 大于 0。

tpu_bdc_arithmetic_sequence_distribute

生成等差数列,分布在各个 NPU。

void tpu_bdc_arithmetic_sequence_distribute(local_addr_t dst_addr, int start, int step, int num)
\[\mathsf{dst(0, c, 0, 0) = start + step \times c}\]
参数
  • dst_addr – dst 的地址

  • start – 等差数列的首项

  • step – 等差数列的步长

  • num – 等差数列的项数

注意事项

  • dst 从 NPU 0 开始,compact layout

  • dst 的 shape 是 [1, num, 1, 1],元素的数据类型是 INT32。

  • num 大于 0。

tpu_bdc_arithmetic_sequence_general

生成等差数列,分布在各个 NPU。

void tpu_bdc_arithmetic_sequence_general(local_addr_t dst_addr, local_addr_t buffer_addr, int npu_num, int start, int step, int num)
\[\mathsf{dst(0, c, 0, w) = start + step \times(num \times c + w)}\]
参数
  • dst_addr – dst 的地址

  • buffer_addr – buffer 的地址

  • npu_num – 序列数 channel 的数量

  • start – 等差数列的首项

  • step – 等差数列的步长

  • num – 等差数列的项数

注意事项

  • dst 的 shape 是 [1, npu_num, 1, num], 64-byte aligned layout,元素的数据类型是 INT32。

  • 要求 dst 和 buffer 从 NPU 0 开始。

  • buffer 的 shape 是[1, NPU_NUM, 1, 1], compact layout,元素的数据类型是 INT32。

  • npu_num 大于 0。

  • num 大于 0。

tpu_bdc_load_fp32_exp_coeff

加载 exp 的 Taylor 系数到 local memory。

void tpu_bdc_load_fp32_exp_coeff(local_addr_t coeff_addr)
参数

coeff_addr – coeff 的地址

注意事项

  • coeff 从 NPU 0 开始,shape 是 [1, NPU_NUM, 1, 32],64-byte aligned layout

tpu_bdc_load_fp32_exp_table

加载 -103 ~ 88 对应的 exp 的表到 local memory。

void tpu_bdc_load_fp32_exp_table(local_addr_t table_addr)
参数

table_addr – table 的地址

注意事项

  • table 从 NPU 0 开始,shape 是 [1, NPU_NUM, 1, 192],64-byte aligned layout

tpu_bdc_load_fp32_log_coeff

加载 log 的 Taylor 系数到 local memory。

void tpu_bdc_load_fp32_log_coeff(local_addr_t coeff_addr)
参数

coeff_addr – coeff 的地址

注意事项

  • coeff 从 NPU 0 开始,shape 是 [1, NPU_NUM, 1, 32],64-byte aligned layout

tpu_bdc_load_fp32_erf_coeff

加载 erf 的 Taylor 系数到 local memory。

void tpu_bdc_load_fp32_erf_coeff(local_addr_t coeff_addr)
参数

coeff_addr – coeff 的地址

注意事项

  • coeff 从 NPU 0 开始,shape 是 [1, NPU_NUM, 1, 10],64-byte aligned layout

tpu_bdc_load_fp32_sin_coeff

加载 sin 的 Taylor 系数到 local memory。

void tpu_bdc_load_fp32_sin_coeff(local_addr_t coeff_addr)
参数

coeff_addr – coeff 的地址

注意事项

  • coeff 从 NPU 0 开始,shape 是 [1, NPU_NUM, 1, 32],64-byte aligned layout

tpu_bdc_load_fp32_cos_coeff

加载 cos 的 Taylor 系数到 local memory。

void tpu_bdc_load_fp32_cos_coeff(local_addr_t coeff_addr)
参数

coeff_addr – coeff 的地址

注意事项

  • coeff 从 NPU 0 开始,shape 是 [1, NPU_NUM, 1, 32],64-byte aligned layout

tpu_bdc_load_fp32_tan_coeff

加载 tan 的 Taylor 系数到 local memory。

void tpu_bdc_load_fp32_tan_coeff(local_addr_t coeff_addr)
参数

coeff_addr – coeff 的地址

注意事项

  • coeff 从 NPU 0 开始,shape 是 [1, NPU_NUM, 1, 32],64-byte aligned layout

tpu_bdc_load_fp32_arcsin_coeff

加载 arcsin 的 Taylor 系数到 local memory。

void tpu_bdc_load_fp32_arcsin_coeff(local_addr_t coeff_addr)
参数

coeff_addr – coeff 的地址

注意事项

  • coeff 从 NPU 0 开始,shape 是 [1, NPU_NUM, 1, 32],64-byte aligned layout