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

# Stack

沿一个新轴对输入张量序列进行堆叠。所有输入张量必须具有相同的形状。

\[\text{若输入 } num\_inputs \text{ 个形状为 } (d_0, d_1, \dots, d_{n-1}) \text{ 的张量，并在 } axis \text{ 处堆叠：}\]
\[output\_shape = (d_0, \dots, d_{axis-1}, num\_inputs, d_{axis}, \dots, d_{n-1})\]

输入：

  - inputs - 指针数组，包含所有输入张量起始地址的数组。

  - input_shape - 所有输入张量共用的形状（shape）数组。

  - num_inputs - 输入张量的数量。

  - axis - 堆叠操作插入新维度的位置。

  - input_ndim - 输入张量的维度数（秩）。

  - core_mask(int, 可选) - 核掩码（仅适用于共享存储版本）。

输出：

  - output - 计算结果存储地址。

支持平台：

  `FT78NE` `MT7004`

备注

- FT78NE 支持 int8, int16, int32, fp32, fp64, cplx64, cplx128

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

- 所有输入张量必须具有完全一致的 input_shape。

- 输出张量的维度将比输入张量多 1。

共享存储版本:

void i8_stack_s(int8_t *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, int8_t *output, int core_mask)

void i16_stack_s(int16_t *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, int16_t *output, int core_mask)

void i32_stack_s(int32_t *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, int32_t *output, int core_mask)

void hp_stack_s(half *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, half *output, int core_mask)

void fp_stack_s(float *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, float *output, int core_mask)

void dp_stack_s(double *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, double *output, int core_mask)

void c64_stack_s(float *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, float *output, int core_mask)

void c128_stack_s(double *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, double *output, int core_mask)

  C调用示例：

       1// FT78NE 示例（共享存储）
       2#include <stdio.h>
       3#include "78NE/utils.h"
       4
       5int main() {
       6    // 输入形状为 {4, 10, 8, 12}
       7    int input_shape[] = { 4, 10, 8, 12 };
       8    int input_ndim = 4;
       9    int num_inputs = 3;
      10    int axis = 1;
      11    int core_mask = 0b1011;
      12
      13    float *in0 = (float *)0xA0000000;
      14    float *in1 = (float *)0xA2000000;
      15    float *in2 = (float *)0xA4000000;
      16    float *inputs[] = { in0, in1, in2 };
      17    float *output = (float *)0xB0000000;
      18    // 输出形状将变为 {4, 3, 10, 8, 12}
      19
      20    fp_stack_s(inputs, input_shape, num_inputs, axis, input_ndim, output, core_mask);
      21    return 0;
      22}

私有存储版本:

void i8_stack_p(int8_t *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, int8_t *output)

void i16_stack_p(int16_t *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, int16_t *output)

void i32_stack_p(int32_t *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, int32_t *output)

void hp_stack_p(half *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, half *output)

void fp_stack_p(float *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, float *output)

void dp_stack_p(double *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, double *output)

void c64_stack_p(float *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, float *output)

void c128_stack_p(double *inputs[], int *input_shape, int num_inputs, int axis, int input_ndim, double *output)

  C调用示例：

       1// MT7004 示例（私有存储）
       2#include <stdio.h>
       3
       4int main() {
       5    int input_shape[] = { 2, 3, 4, 5 };
       6    int input_ndim = 4;
       7    int num_inputs = 2;
       8    int axis = 0;
       9
      10    float *in0 = (float *)0x10810000;
      11    float *in1 = (float *)0x10812000;
      12    float *inputs[] = { in0, in1 };
      13    float *output = (float *)0x10820000;
      14
      15    fp_stack_p(inputs, input_shape, num_inputs, axis, input_ndim, output);
      16    return 0;
      17}