# Tensorliststack — MindSpore Signal+ 使用手册 alpha 文档

# Tensorliststack

将多个张量（Tensor）堆叠成一个更大的张量。此算子可以处理不同数据类型的张量，将它们按顺序拼接成一个连续的内存块。

\[\text{output\_data} = [\text{tensor}_1, \text{tensor}_2, \ldots, \text{tensor}_n]\]

其中每个张量的数据类型和元素数量可以不同。

输入：

  - tensor_num - 张量数量，tensor_num > 0

  - tensor_element_nums - 每个张量的元素数量（int* 类型）

  - tensor_data_type - 每个张量元素的数据类型，以字节数表示

  - tensor_data - 每个张量数据的起始地址（void** 类型）

  - output_data - 输出结果的数组起始位置（void* 类型）

  - unknown_type_offset - 未知类型数据在输出结果中的偏移量

  - core_mask - 核掩码（int），仅共享存储版本需要

输出：

  - output_data - 堆叠后的张量数据，按输入顺序连续存储

支持平台：

  `FT78NE` `MT7004`

备注

- 该算子不区分具体的数据类型，数据类型信息通过tensor_data_type参数传递

- 当tensor_data_type[i]为0（kTypeUnknown）时，算子会将输出内存清零

- 当tensor_data_type[i]不为0时，算子会按字节复制数据

- 调用前需要确保output_data指向的内存空间足够大以容纳所有张量数据

- TensorList中不同的Tensor数据类型可能不同，类型信息已经在算子中包含

共享存储版本：

void tensorliststack_s(int tensor_num, int *tensor_element_nums, int *tensor_data_type, void **tensor_data, void *output_data, int unknown_type_offset, int core_mask)

C调用示例（共享存储版本）：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <tensorliststack.h>
     4#include <string.h>
     5
     6int main(int argc, char* argv[]) {
     7    // 假设在DDR空间
     8    int tensor_num = 2;
     9
    10    // 每个张量的元素数量
    11    int tensor_element_nums[] = {3, 2};
    12
    13    // 每个张量的数据类型（以字节数表示）
    14    int tensor_data_type[] = {4, 8};  // 32位int(4字节), 64位double(8字节)
    15
    16    // 张量数据
    17    int *tensor1 = (int *)0xA0000000;
    18    double *tensor2 = (double *)0xA0100000;
    19
    20    void *tensor_data[] = {tensor1, tensor2};
    21
    22    void *output_data = (void *)0xB0000000;  // 输出数据
    23    int unknown_type_offset = 0;
    24    int core_mask = 0xff;
    25
    26    // 调用共享存储版本的函数
    27    tensorliststack_s(tensor_num, tensor_element_nums, tensor_data_type,
    28                     tensor_data, output_data, unknown_type_offset, core_mask);
    29
    30    return 0;
    31}

私有存储版本：

void tensorliststack_p(int tensor_num, int *tensor_element_nums, int *tensor_data_type, void **tensor_data, void *output_data, int unknown_type_offset)

C调用示例（私有存储版本）：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <tensorliststack.h>
     4#include <string.h>
     5
     6int main(int argc, char* argv[]) {
     7    // 假设在L2空间
     8    int tensor_num = 2;
     9
    10    // 每个张量的元素数量
    11    int tensor_element_nums[] = {3, 2};
    12
    13    // 每个张量的数据类型（以字节数表示）
    14    int tensor_data_type[] = {4, 8};  // 32位int(4字节), 64位double(8字节)
    15
    16    // 张量数据
    17    int *tensor1 = (int *)0x10000000;
    18    double *tensor2 = (double *)0x10100000;
    19
    20    void *tensor_data[] = {tensor1, tensor2};
    21
    22    void *output_data = (void *)0x10200000;  // 输出数据
    23    int unknown_type_offset = 0;
    24
    25    // 调用私有存储版本的函数
    26    tensorliststack_p(tensor_num, tensor_element_nums, tensor_data_type,
    27                     tensor_data, output_data, unknown_type_offset);
    28
    29    return 0;
    30}