FT_DSP.gitlink.net/master/html/_sources/functionlib/dsplib/split.rst.txt

103 lines
5.1 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Split
=================
将一个张量Tensor沿着指定的轴axis拆分为多个子张量。子张量在指定轴上的大小由 ``split_sizes`` 数组决定。
.. math::
\text{input.shape} = [d_0, d_1, \dots, d_{axis}, \dots, d_{n-1}]
.. math::
\text{对于第 } j \text{ 个输出: } output_j\text{.shape} = [d_0, d_1, \dots, split\_sizes[j], \dots, d_{n-1}]
输入:
- **input** - 输入数据起始地址。
- **axis** - 指定拆分的维度轴。
- **input_shape** - 输入张量的形状数组地址。
- **input_ndim** - 输入张量的维度数。
- **num_split** - 拆分出的子张量个数。
- **split_sizes** - 一个数组,包含每个子张量在拆分轴上的长度。
- **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。
输出:
- **outputs** - 指针数组地址,其中每个元素指向一个子张量的存储地址。
支持平台:
``FT78NE``
``MT7004``
.. note::
- FT78NE 支持 int8, int16, int32, fp32, fp64, cplx64, cplx128
- MT7004 支持 fp16, fp32, int16, int32, cplx64
- ``split_sizes`` 的元素之和必须等于输入张量在 ``axis`` 维度的长度。
- 对于复数类型cplx64 / cplx128拆分逻辑与实数一致但需注意地址偏移按复数对计算。
**共享存储版本:**
.. c:function:: void i8_split_s(int8_t* input, int8_t* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes, int core_mask)
.. c:function:: void i16_split_s(int16_t* input, int16_t* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes, int core_mask)
.. c:function:: void i32_split_s(int32_t* input, int32_t* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes, int core_mask)
.. c:function:: void hp_split_s(half* input, half* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes, int core_mask)
.. c:function:: void fp_split_s(float* input, float* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes, int core_mask)
.. c:function:: void dp_split_s(double* input, double* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes, int core_mask)
.. c:function:: void c64_split_s(float* input, float* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes, int core_mask)
.. c:function:: void c128_split_s(double* input, double* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes, int core_mask)
**C调用示例**
.. code-block:: c
:linenos:
:emphasize-lines: 17
//FT78NE示例共享存储
#include <stdio.h>
#include "78NE/utils.h"
int main(int argc, char* argv[]) {
float *input = (float *)0xA0000000;
float *out0 = (float *)0xB0000000;
float *out1 = (float *)0xB1000000;
float *outputs[] = { out0, out1 };
int input_shape[] = { 2, 10, 4 };
int split_sizes[] = { 6, 4 };
int axis = 1;
int input_ndim = 3;
int num_split = 2;
int core_mask = 0b1011;
fp_split_s(input, outputs, axis, input_shape, input_ndim, num_split, split_sizes, core_mask);
return 0;
}
**私有存储版本:**
.. c:function:: void i8_split_p(int8_t* input, int8_t* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes)
.. c:function:: void i16_split_p(int16_t* input, int16_t* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes)
.. c:function:: void i32_split_p(int32_t* input, int32_t* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes)
.. c:function:: void hp_split_p(half* input, half* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes)
.. c:function:: void fp_split_p(float* input, float* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes)
.. c:function:: void dp_split_p(double* input, double* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes)
.. c:function:: void c64_split_p(float* input, float* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes)
.. c:function:: void c128_split_p(double* input, double* outputs[], int axis, int* input_shape, int input_ndim, int num_split, int* split_sizes)
**C调用示例**
.. code-block:: c
:linenos:
:emphasize-lines: 12
//MT7004 示例
#include <stdio.h>
int main(int argc, char* argv[]) {
float *input = (float *)0x10000000; // 私有存储地址
float *out0 = (float *)0x10010000;
float *out1 = (float *)0x10020000;
float *outputs[] = { out0, out1 };
int input_shape[] = { 20, 10 };
int split_sizes[] = { 10, 10 };
int axis = 0;
fp_split_p(input, outputs, axis, input_shape, 2, 2, split_sizes);
return 0;
}