TensorListReserve
====================

为张量列表（TensorList）预分配指定数量和形状的张量空间。该算子用于初始化TensorList结构，设置其内部张量的形状信息和TensorList本身的形状。

该算子不区分具体的数据类型，主要负责设置TensorList的元数据信息。

输入：
    - **num_elements** - TensorList中包含的张量数量（int类型）。
    - **element_shape** - 每个张量的形状数组（int*类型），表示TensorList中每个张量的维度信息。
    - **shape_size** - 每个张量的形状大小（int类型），即element_shape数组的长度。
    - **tensor_list_c_element_shape_size** - 输出参数，用于存储TensorList内部每个张量的形状大小（int*类型）。
    - **tensor_list_c_element_shape** - 输出参数，用于存储TensorList内部每个张量的形状（int*类型）。
    - **tensor_c_shape_size** - 输出参数，用于存储TensorList本身的形状大小（int*类型）。
    - **tensor_c_shape** - 输出参数，用于存储TensorList本身的形状（int*类型）。

输出：
    - **tensor_list_c_element_shape_size** - 被设置为shape_size的值。
    - **tensor_list_c_element_shape** - 被填充为element_shape的值。
    - **tensor_c_shape_size** - 被设置为1，表示TensorList本身是一个1维结构。
    - **tensor_c_shape** - 被设置为num_elements，表示TensorList包含num_elements个张量。

支持平台：
    ``FT78NE``
    ``MT7004``

.. note::
    - 该算子不区分具体的数据类型，主要操作TensorList的元数据
    - TensorList中的每个张量必须具有相同的形状（element_shape）
    - 调用前需要确保tensor_list_c_element_shape和tensor_c_shape指向的内存空间足够大
    - FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128
    - MT7004 支持fp16, fp32, int16, int32, cplx64

.. note::
    函数签名中参数名缩写对照：``tl_elem_shape_size`` = ``tensor_list_c_element_shape_size``，``tl_elem_shape`` = ``tensor_list_c_element_shape``，``t_shape_size`` = ``tensor_c_shape_size``，``t_shape`` = ``tensor_c_shape``。

**共享存储版本：**

.. c:function:: void i8_tensorlist_reserve_s(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape, int core_mask)
.. c:function:: void i16_tensorlist_reserve_s(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape, int core_mask)
.. c:function:: void i32_tensorlist_reserve_s(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape, int core_mask)
.. c:function:: void hp_tensorlist_reserve_s(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape, int core_mask)
.. c:function:: void fp_tensorlist_reserve_s(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape, int core_mask)
.. c:function:: void dp_tensorlist_reserve_s(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape, int core_mask)
.. c:function:: void c64_tensorlist_reserve_s(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape, int core_mask)
.. c:function:: void c128_tensorlist_reserve_s(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape, int core_mask)


**C调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 15-16

    #include <stdio.h>
    #include <tensorlist_reserve.h>

    int main(int argc, char* argv[]) {
        int num_elements = 128;
        int element_shape[] = {8, 8, 16};
        int shape_size = 3;
        int tensor_list_c_element_shape_size = 0;
        int tensor_list_c_element_shape[MAX_SHAPE_SIZE];
        int tensor_c_shape_size = 0;
        int tensor_c_shape[MAX_SHAPE_SIZE];
        
        //单核线性汇编    
        int core_mask = 0b1111; // 使用所有核心
        fp_tensorlist_reserve_s(num_elements, element_shape, shape_size, &tensor_list_c_element_shape_size, 
        tensor_list_c_element_shape, &tensor_c_shape_size, tensor_c_shape, core_mask);
        return 0;
    }

**私有存储版本:**

.. c:function:: void i8_tensorlist_reserve_p(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape)
.. c:function:: void i16_tensorlist_reserve_p(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape)
.. c:function:: void i32_tensorlist_reserve_p(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape)
.. c:function:: void hp_tensorlist_reserve_p(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape)
.. c:function:: void fp_tensorlist_reserve_p(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape)
.. c:function:: void dp_tensorlist_reserve_p(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape)
.. c:function:: void c64_tensorlist_reserve_p(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape)
.. c:function:: void c128_tensorlist_reserve_p(int num_elements, int *element_shape, int shape_size, int *tl_elem_shape_size, int *tl_elem_shape, int *t_shape_size, int *t_shape)

**C调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 14-15

    #include <stdio.h>
    #include <tensorlist_reserve.h>

    int main(int argc, char* argv[]) {
        int num_elements = 128;
        int element_shape[] = {8, 8, 16};
        int shape_size = 3;
        int tensor_list_c_element_shape_size = 0;
        int tensor_list_c_element_shape[MAX_SHAPE_SIZE];
        int tensor_c_shape_size = 0;
        int tensor_c_shape[MAX_SHAPE_SIZE];
        
        //单核线性汇编    
        fp_tensorlist_reserve_p(num_elements, element_shape, shape_size, &tensor_list_c_element_shape_size, 
        tensor_list_c_element_shape, &tensor_c_shape_size, tensor_c_shape);
        return 0;
    }