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

# Stridedslice

对输入张量进行步长切片（Strided Slice）操作。该算子根据起始位置（begins）、结束位置（ends）和步长（strides）从输入张量中提取子张量。该算子不区分数据类型，适用于所有数据类型。

算法支持三种运行模式： 1. 全拷贝模式**（soft_copy_mode = 1）：当输出是输入的连续子区域时，使用内存拷贝。 2. **快速运行模式**（fast_run = 1）：优化的快速路径，适用于特定场景。 3. **普通模式：逐块拷贝模式，适用于一般情况。

对于每个维度 i，输出张量的索引范围由 begins[i]、ends[i] 和 strides[i] 决定：

\[\text{output\_shape}[i] = \left\lceil \frac{\text{ends}[i] - \text{begins}[i]}{\text{strides}[i]} \right\rceil\]

输入：

  - input - 输入数据指针（void*）。

  - in_shape - 输入张量的形状数组（int*），大小为 in_shape_size。

  - out_shape - 输出张量的形状数组（int*），大小为 out_shape_size。

  - in_shape_size - 输入张量的维度数（int）。

  - out_shape_size - 输出张量的维度数（int）。

  - begins - 起始位置数组（int*），每个维度切片开始的位置。

  - ends - 结束位置数组（int*），每个维度切片结束的位置。

  - strides - 步长数组（int*），每个维度的步长。

  - data_type_bytes - 数据类型所占字节数（int）。

  - soft_copy_mode - 全拷贝模式标志（int），1 表示启用，0 表示不启用。

  - fast_run - 快速运行模式标志（int），1 表示启用，0 表示不启用。

  - split_axis - 策略2：分割轴（int），当输入和输出张量只有1个维度不同时使用。

  - inner_size - 策略2：内部大小（int）。

  - outer - 策略2：外部大小（int）。

  - parallel_on_outer - 策略2：是否在外层并行（int）。

  - parallel_on_split_axis - 策略2：是否在分割轴并行（int）。

  - cal_num_per_thread - 策略2：每个线程的计算数量（int）。

  - caled_num - 策略2：已计算数量（int）。

  - temp_space - 临时空间指针（void*）。

  - inner - 策略2：内部大小（int），与 inner_size 类似。

输出：

  - output - 输出数据指针（void*）。

支持平台：

  `FT78NE` `MT7004`

备注

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

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

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

- 算子会根据 soft_copy_mode 和 fast_run 标志自动选择最优的执行路径

- 策略2相关参数用于优化特定场景（输入和输出张量只有1个维度不同）

共享存储版本:

void stridedslice(void *input, void *output, int *in_shape, int *out_shape, int in_shape_size, int out_shape_size, int *begins, int *ends, int *strides, int data_type_bytes, int soft_copy_mode, int fast_run, int split_axis, int inner_size, int outer, int parallel_on_outer, int parallel_on_split_axis, int cal_num_per_thread, int caled_num, void *temp_space, int inner, int core_mask)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <stridedslice.h>
     4
     5int main(int argc, char* argv[]) {
     6    // 假设在DDR空间
     7    // 输入张量形状 [2, 3, 4, 5]
     8    int in_shape[] = {2, 3, 4, 5};
     9    int in_shape_size = 4;
    10
    11    // 输出张量形状 [1, 2, 2, 3]
    12    // 从 [0, 1, 1, 2] 开始，到 [2, 3, 4, 5] 结束，步长为 [1, 1, 2, 1]
    13    int out_shape[] = {1, 2, 2, 3};
    14    int out_shape_size = 4;
    15
    16    // 切片参数
    17    int begins[] = {0, 1, 1, 2};  // 每个维度的起始位置
    18    int ends[] = {2, 3, 4, 5};     // 每个维度的结束位置
    19    int strides[] = {1, 1, 2, 1};  // 每个维度的步长
    20
    21    // 数据类型：float32，占4字节
    22    int data_type_bytes = 4;
    23
    24    // 输入输出数据指针
    25    float *input = (float *)0xA0000000;
    26    float *output = (float *)0xB0000000;
    27
    28    // 运行模式
    29    int soft_copy_mode = 0;  // 不启用全拷贝模式
    30    int fast_run = 0;         // 不启用快速运行模式
    31
    32    // 策略2参数（不使用时可设为0）
    33    int split_axis = 0;
    34    int inner_size = 0;
    35    int outer = 0;
    36    int parallel_on_outer = 0;
    37    int parallel_on_split_axis = 0;
    38    int cal_num_per_thread = 0;
    39    int caled_num = 0;
    40    int inner = 0;
    41
    42    // 临时空间
    43    void *temp_space = (void *)0xC0000000;
    44
    45    // 核掩码
    46
    47    stridedslice(input, output, in_shape, out_shape, in_shape_size, out_shape_size,
    48                   begins, ends, strides, data_type_bytes, soft_copy_mode, fast_run,
    49                   split_axis, inner_size, outer, parallel_on_outer, parallel_on_split_axis,
    50                   cal_num_per_thread, caled_num, temp_space, inner);
    51
    52    return 0;
    53}

私有存储版本:

void stridedslice(void *input, void *output, int *in_shape, int *out_shape, int in_shape_size, int out_shape_size, int *begins, int *ends, int *strides, int data_type_bytes, int soft_copy_mode, int fast_run, int split_axis, int inner_size, int outer, int parallel_on_outer, int parallel_on_split_axis, int cal_num_per_thread, int caled_num, void *temp_space, int inner)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <stridedslice.h>
     4
     5int main(int argc, char* argv[]) {
     6    // 假设在L2空间
     7    int in_shape[] = {2, 3, 4, 5};
     8    int in_shape_size = 4;
     9
    10    int out_shape[] = {1, 2, 2, 3};
    11    int out_shape_size = 4;
    12
    13    int begins[] = {0, 1, 1, 2};
    14    int ends[] = {2, 3, 4, 5};
    15    int strides[] = {1, 1, 2, 1};
    16
    17    int data_type_bytes = 4;
    18
    19    float *input = (float *)0x10000000;
    20    float *output = (float *)0x10010000;
    21
    22    int soft_copy_mode = 0;
    23    int fast_run = 0;
    24
    25    // 策略2参数（不使用）
    26    int split_axis = 0;
    27    int inner_size = 0;
    28    int outer = 0;
    29    int parallel_on_outer = 0;
    30    int parallel_on_split_axis = 0;
    31    int cal_num_per_thread = 0;
    32    int caled_num = 0;
    33    int inner = 0;
    34
    35    void *temp_space = (void *)0x10020000;
    36
    37    stridedslice(input, output, in_shape, out_shape, in_shape_size, out_shape_size,
    38                  begins, ends, strides, data_type_bytes, soft_copy_mode, fast_run,
    39                  split_axis, inner_size, outer, parallel_on_outer, parallel_on_split_axis,
    40                  cal_num_per_thread, caled_num, temp_space, inner);
    41
    42    return 0;
    43}