Tensorarrayread
=================

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

.. math::

    \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``

.. note::
    - FT78NE 支持fp32, int16, int32, cplx64
    - MT7004 支持fp16, fp32, int16, int32, cplx64
    - 算子会复制数据，输出数据与输入数据独立
    - 调用前需要确保 `output_data` 指向的内存空间足够大（至少 `handle_size[index]` 字节）
    - `index` 必须在 `handle_data` 数组的有效范围内

**共享存储版本:**

.. c:function:: void fp_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask)
.. c:function:: void hp_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask)
.. c:function:: void dp_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask)
.. c:function:: void i8_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask)
.. c:function:: void i16_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask)
.. c:function:: void i32_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask)
.. c:function:: void c64_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask)
.. c:function:: void c128_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask)

**C调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 25

    //FT78NE示例
    #include <stdio.h>
    #include <tensorarrayread.h>

    int main(int argc, char* argv[]) {
        // 假设在DDR空间
        // 张量数组包含3个张量
        float *data0 = (float *)0xA0000000;  // 第0个张量的数据
        float *data1 = (float *)0xA1000000;  // 第1个张量的数据
        float *data2 = (float *)0xA2000000;  // 第2个张量的数据
        
        // 每个张量的大小（字节）
        int sizes[3] = {1000 * sizeof(float), 1000 * sizeof(float), 1000 * sizeof(float)};
        
        // 创建数据指针数组
        void* handle_data[3] = {data0, data1, data2};
        
        // 输出数据
        float *output_data = (float *)0xB0000000;  // 需要预先分配足够的内存
        int output_size;  // 输出大小，调用后会被设置
        
        int index = 1;  // 读取第1个张量
        int core_mask = 0xff;
        
        fp_tensorarrayread_s(handle_data, sizes, index, output_data, &output_size, core_mask);
        
        // 此时 output_data 包含 data1 的副本
        // output_size == sizes[1] == 1000 * sizeof(float)
        
        return 0;
    }

**私有存储版本:**

.. c:function:: void fp_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size)
.. c:function:: void hp_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size)
.. c:function:: void dp_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size)
.. c:function:: void i8_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size)
.. c:function:: void i16_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size)
.. c:function:: void i32_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size)
.. c:function:: void c64_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size)
.. c:function:: void c128_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size)


**C调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 20

    //FT78NE示例
    #include <stdio.h>
    #include <tensorarrayread.h>

    int main(int argc, char* argv[]) {
        // 假设在L2空间
        float *data0 = (float *)0x10000000;
        float *data1 = (float *)0x10001000;
        float *data2 = (float *)0x10002000;
        
        int sizes[3] = {1000 * sizeof(float), 1000 * sizeof(float), 1000 * sizeof(float)};
        
        void* handle_data[3] = {data0, data1, data2};
        
        float *output_data = (float *)0x10003000;  // 需要预先分配足够的内存
        int output_size;
        
        int index = 0;  // 读取第0个张量
        
        fp_tensorarrayread_p(handle_data, sizes, index, output_data, &output_size);
        
        return 0;
    }

