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

# SpaceToDepth

将输入张量的空间维按块(block)重组到深度通道（channel）中。

> 假设输入形状为: [N, H, W, C]，块大小为 B，则输出形状为:

> \[\text{out\_shape} = [N, H/ B, W / B, C * B * B]\]

> 对应元素映射为：

> \[output[n, h_{out}, w_{out}, c * B * B + (l * B + m)] = input[n, h_{out} * B + l, w_{out} * B + m, c]\]
> 输入：

>   - input - 输入数据地址，按 NHWC 存储。

>   - in_shape - 指向长度为4的数组，表示输入维度 [N, H, W, C]。

>   - block - block 大小。

>   - data_size - 每个元素的字节大小。

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

> 输出：

>   - output - 输出数据地址。

> 支持平台：

>   `FT78NE` `MT7004`

> 备注

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

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

共享存储版本:

void i8_spacetodepth_s(int8_t *input, int8_t *output, const int *in_shape, int block, int data_size, int core_mask)

void i16_spacetodepth_s(int16_t *input, int16_t *output, const int *in_shape, int block, int data_size, int core_mask)

void i32_spacetodepth_s(int32_t *input, int32_t *output, const int *in_shape, int block, int data_size, int core_mask)

void hp_spacetodepth_s(half *input, half *output, const int *in_shape, int block, int data_size, int core_mask)

void fp_spacetodepth_s(float *input, float *output, const int *in_shape, int block, int data_size, int core_mask)

void dp_spacetodepth_s(double *input, double *output, const int *in_shape, int block, int data_size, int core_mask)

void c64_spacetodepth_s(float *input, float *output, const int *in_shape, int block, int data_size, int core_mask)

void c128_spacetodepth_s(double *input, double *output, const int *in_shape, int block, int data_size, int core_mask)

  C调用示例：

       1#include <stdio.h>
       2
       3int main(int argc, char* argv[]) {
       4    float *input = (float *)0xA0000000;   // 多核版：输入在 DDR 区域
       5    float *output = (float *)0xB0000000;  // 多核版：输出在 DDR 区域
       6    int in_shape[4] = {1, 8, 8, 1};       // N,H,W,C
       7    int block = 2;
       8    int core_mask = 0xff;
       9    fp_spacetodepth_s(input, output, in_shape, block, sizeof(float), core_mask);
      10    return 0;
      11}

私有存储版本:

void i8_spacetodepth_p(int8_t *input, int8_t *output, const int *in_shape, int block, int data_size)

void i16_spacetodepth_p(int16_t *input, int16_t *output, const int *in_shape, int block, int data_size)

void i32_spacetodepth_p(int32_t *input, int32_t *output, const int *in_shape, int block, int data_size)

void hp_spacetodepth_p(half *input, half *output, const int *in_shape, int block, int data_size)

void fp_spacetodepth_p(float *input, float *output, const int *in_shape, int block, int data_size)

void dp_spacetodepth_p(double *input, double *output, const int *in_shape, int block, int data_size)

void c64_spacetodepth_p(float *input, float *output, const int *in_shape, int block, int data_size)

void c128_spacetodepth_p(double *input, double *output, const int *in_shape, int block, int data_size)

  C调用示例：

       1#include <stdio.h>
       2
       3int main(int argc, char* argv[]) {
       4    float *input = (float *)0x10000000;   // 单核版：输入在 L2
       5    float *output = (float *)0x10010000;  // 单核版：输出在 L2
       6    int in_shape[4] = {1, 8, 8, 1};
       7    int block = 2;
       8    fp_spacetodepth_p(input, output, in_shape, block, sizeof(float));
       9    return 0;
      10}