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

# Tensorarrayread

从张量数组中读取指定索引的张量，并将其数据复制到输出。该算子不区分数据类型，适用于所有数据类型。

\[\text{output\_data} = \text{handle\_data}[\text{index}]\]

该算子会将 handle_data[index] 指向的数据复制到 output_data 中，复制的大小为 handle_size[index] 字节。

输入：

  - handle_data - 张量数组的数据指针数组（void** 类型），每个元素指向一个张量的数据。

  - handle_size - 每个张量的大小数组（int* 类型），handle_size[i] 表示 handle_data[i] 指向的数据大小（字节）。

  - index - 读取的索引（int 类型），指定从 handle_data 数组中读取哪个张量。

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

输出：

  - output_data - 输出数据指针（void* 类型），包含复制后的数据。

  - output_size - 输出大小指针（int* 类型），指向存储输出大小的变量。调用后，*output_size 会被设置为 handle_size[index]。

支持平台：

  `FT78NE` `MT7004`

备注

- FT78NE 支持fp32, int16, int32, cplx64

- MT7004 支持fp16, fp32, int16, int32, cplx64

- 算子会复制数据，输出数据与输入数据独立

- 调用前需要确保 output_data 指向的内存空间足够大（至少 handle_size[index] 字节）

- index 必须在 handle_data 数组的有效范围内

共享存储版本:

void fp_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)

void hp_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)

void dp_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)

void i8_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)

void i16_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)

void i32_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)

void c64_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)

void c128_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <tensorarrayread.h>
     4
     5int main(int argc, char* argv[]) {
     6    // 假设在DDR空间
     7    // 张量数组包含3个张量
     8    float *data0 = (float *)0xA0000000;  // 第0个张量的数据
     9    float *data1 = (float *)0xA1000000;  // 第1个张量的数据
    10    float *data2 = (float *)0xA2000000;  // 第2个张量的数据
    11
    12    // 每个张量的大小（字节）
    13    int sizes[3] = {1000 * sizeof(float), 1000 * sizeof(float), 1000 * sizeof(float)};
    14
    15    // 创建数据指针数组
    16    void* handle_data[3] = {data0, data1, data2};
    17
    18    // 输出数据
    19    float *output_data = (float *)0xB0000000;  // 需要预先分配足够的内存
    20    int output_size;  // 输出大小，调用后会被设置
    21
    22    int index = 1;  // 读取第1个张量
    23    int core_mask = 0xff;
    24
    25    fp_tensorarrayread_s(handle_data, sizes, index, output_data, &output_size, core_mask);
    26
    27    // 此时 output_data 包含 data1 的副本
    28    // output_size == sizes[1] == 1000 * sizeof(float)
    29
    30    return 0;
    31}

私有存储版本:

void fp_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)

void hp_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)

void dp_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)

void i8_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)

void i16_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)

void i32_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)

void c64_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)

void c128_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <tensorarrayread.h>
     4
     5int main(int argc, char* argv[]) {
     6    // 假设在L2空间
     7    float *data0 = (float *)0x10000000;
     8    float *data1 = (float *)0x10001000;
     9    float *data2 = (float *)0x10002000;
    10
    11    int sizes[3] = {1000 * sizeof(float), 1000 * sizeof(float), 1000 * sizeof(float)};
    12
    13    void* handle_data[3] = {data0, data1, data2};
    14
    15    float *output_data = (float *)0x10003000;  // 需要预先分配足够的内存
    16    int output_size;
    17
    18    int index = 0;  // 读取第0个张量
    19
    20    fp_tensorarrayread_p(handle_data, sizes, index, output_data, &output_size);
    21
    22    return 0;
    23}