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

# Switchlayer

根据索引从输入张量数组中选择一个张量，并将其数据复制到输出。该算子不区分数据类型，适用于所有数据类型。

\[\text{output} = \text{input\_tensors}[\text{index}]\]

该算子会将选中的输入张量的数据复制到输出张量中。复制的大小为 size * type_size 字节。

输入：

  - input_tensors - 输入张量数组（TensorC** 类型），包含多个待选择的张量。

  - index - 选择的索引（int 类型），指定从 input_tensors 数组中选择哪个张量。

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

输出：

  - output - 输出张量（TensorC* 类型），包含复制后的数据。输出张量的 size 和 type_size 应与选中的输入张量相同。

TensorC 结构体定义：

  - type_size - 数据类型大小（long long），单位字节，例如 float32 为 4，float16 为 2。

  - size - 元素个数（long long）。

  - data - 数据指针（void*）。

支持平台：

  `FT78NE` `MT7004`

备注

- 该算子不区分数据类型，适用于所有数据类型

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

- 调用前需要确保 output->data 指向的内存空间足够大（至少 size * type_size 字节）

- 选中的输入张量的 size 和 type_size 应与输出张量匹配

共享存储版本:

void switchlayer_s(TensorC **input_tensors, TensorC *output, int index, int core_mask)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <switchlayer.h>
     4
     5int main(int argc, char* argv[]) {
     6    // 假设在DDR空间
     7    TensorC input0, input1, input2;
     8    TensorC output;
     9
    10    // 初始化 input0
    11    input0.type_size = 4;  // float32
    12    input0.size = 1000;
    13    input0.data = (void *)0xA0000000;
    14
    15    // 初始化 input1
    16    input1.type_size = 4;  // float32
    17    input1.size = 1000;
    18    input1.data = (void *)0xA1000000;
    19
    20    // 初始化 input2
    21    input2.type_size = 4;  // float32
    22    input2.size = 1000;
    23    input2.data = (void *)0xA2000000;
    24
    25    // 初始化 output
    26    output.type_size = 4;  // float32
    27    output.size = 1000;
    28    output.data = (void *)0xB0000000;  // 需要预先分配足够的内存
    29
    30    // 创建输入张量数组
    31    TensorC* input_tensors[3] = {&input0, &input1, &input2};
    32
    33    int index = 1;  // 选择 input1
    34    int core_mask = 0xff;
    35
    36    switchlayer_s(input_tensors, &output, index, core_mask);
    37
    38    // 此时 output.data 包含 input1.data 的副本
    39
    40    return 0;
    41}

私有存储版本:

void switchlayer_p(TensorC **input_tensors, TensorC *output, int index)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <switchlayer.h>
     4
     5int main(int argc, char* argv[]) {
     6    // 假设在L2空间
     7    TensorC input0, input1, input2;
     8    TensorC output;
     9
    10    input0.type_size = 4;  // float32
    11    input0.size = 1000;
    12    input0.data = (void *)0x10000000;
    13
    14    input1.type_size = 4;
    15    input1.size = 1000;
    16    input1.data = (void *)0x10001000;
    17
    18    input2.type_size = 4;
    19    input2.size = 1000;
    20    input2.data = (void *)0x10002000;
    21
    22    output.type_size = 4;
    23    output.size = 1000;
    24    output.data = (void *)0x10003000;  // 需要预先分配足够的内存
    25
    26    TensorC* input_tensors[3] = {&input0, &input1, &input2};
    27
    28    int index = 0;  // 选择 input0
    29
    30    switchlayer_p(input_tensors, &output, index);
    31
    32    return 0;
    33}