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

# PadFusion

通过指定的填充模式和大小对输入张量进行填充，支持常数填充、反射填充和对称填充三种模式。

输入：

  - input - 输入张量地址。

  - input_shape - 输入张量形状数组（不超过4维，不足时从后往前补0）。

  - output_shape - 输出张量形状数组（不超过4维，不足时从后往前补0）。

  - paddings - 填充大小数组（长度为 (2 × 输入张量维数)，不足时从后往前补0）。

  - padding_mode - 填充模式：Constant=0, Reflect=1, Symmetric=2。

  - constant_value - 常量填充时的填充值（仅Constant模式使用）。

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

输出：

  - output - 输出数据地址。

  - formated_input_shape - 格式化后的输入形状数组地址。

  - formated_output_shape - 格式化后的输出形状数组地址。

  - formated_paddings - 格式化后的填充数组地址。

  - in_strides - 输入张量步长数组地址。

  - out_strides - 输出张量步长数组地址。

支持平台：

  `FT78NE` `MT7004`

备注

- FT78NE 支持的数据类型：int8, int16, int32, fp32, fp64, cplx64, cplx128

- MT7004 支持的数据类型：fp16, fp32, int16, int32, cplx64

填充模式说明：

  - `kConstant = 0` - 常数填充，使用指定的 constant_value 进行填充

  - `kReflect = 1` - 反射填充，使用张量边缘的值(不包含边界值)填充输入张量。例如，向 [1, 2, 3, 4] 的两边分别填充2个元素，结果为 [3, 2, 1, 2, 3, 4, 3, 2]。

  - `kSymmetric = 2` - 对称填充，使用张量边缘的值(包含边界值)填充输入张量。例如，向 [1, 2, 3, 4] 的两边分别填充2个元素，结果为 [2, 1, 1, 2, 3, 4, 4, 3]。

共享存储版本：

void i8_padfusion_s(long long *params, int core_mask)

void i16_padfusion_s(long long *params, int core_mask)

void i32_padfusion_s(long long *params, int core_mask)

void fp_padfusion_s(long long *params, int core_mask)

void dp_padfusion_s(long long *params, int core_mask)

void c64_padfusion_s(long long *params, int core_mask)

void c128_padfusion_s(long long *params, int core_mask)

void hp_padfusion_s(long long *params, int core_mask)

参数数组结构：

     1long long params[12];
     2params[0] = (long long)input;                    // 输入数据地址
     3params[1] = (long long)output;                   // 输出数据地址
     4params[2] = (long long)input_shape;              // 输入形状数组
     5params[3] = (long long)output_shape;             // 输出形状数组
     6params[4] = (long long)paddings;                 // 填充数组
     7params[5] = (long long)padding_mode;             // 填充模式
     8params[6] = (long long)constant_value;           // 常数填充值的*地址*
     9params[7] = (long long)formated_input_shape;     // 格式化输入形状
    10params[8] = (long long)formated_output_shape;    // 格式化输出形状
    11params[9] = (long long)formated_paddings;        // 格式化填充数组
    12params[10] = (long long)in_strides;              // 输入步长数组
    13params[11] = (long long)out_strides;             // 输出步长数组

C调用示例：

>      1// FT78NE 多核示例
>      2#include <stdio.h>
>      3#include <padfusion.h>
>      4
>      5int main(void) {
>      6    srand(time(0));
>      7
>      8    // 输入参数设置
>      9    int input_shape[4] = {23, 31, 29, 28};
>     10    int paddings[8] = {3, 2, 3, 2, 1, 2, 0, 2};
>     11    int padding_mode = 2;  // kSymmetric
>     12    double constant_value[2] = {1.0, 0.0};
>     13    int core_mask = 0xff;
>     14
>     15    // 内存分配（DDR空间）
>     16    double* input = (double*)0x81000000;
>     17    double* output = (double*)0x82000000;
>     18    int* formated_input_shape = (int*)0x84000000;
>     19    int* formated_output_shape = (int*)0x85000000;
>     20    int* formated_paddings = (int*)0x86000000;
>     21    int* in_strides = (int*)0x87000000;
>     22    int* out_strides = (int*)0x88000000;
>     23    int* output_shape = (int*)0x89000000;
>     24
>     25    // 计算输出形状
>     26    for (int i = 0; i < 4; ++i) {
>     27        output_shape[i] = input_shape[i] + paddings[i * 2] + paddings[i * 2 + 1];
>     28    }
>     29
>     30    // 初始化input
>     31    // ... 省略初始化input数据代码 ...
>     32
>     33    // 准备参数数组
>     34    long long params[12];
>     35    params[0] = (long long)input;
>     36    params[1] = (long long)output;
>     37    params[2] = (long long)input_shape;
>     38    params[3] = (long long)output_shape;
>     39    params[4] = (long long)paddings;
>     40    params[5] = (long long)padding_mode;
>     41    params[6] = (long long)constant_value;
>     42    params[7] = (long long)formated_input_shape;
>     43    params[8] = (long long)formated_output_shape;
>     44    params[9] = (long long)formated_paddings;
>     45    params[10] = (long long)in_strides;
>     46    params[11] = (long long)out_strides;
>     47
>     48    // 执行 PadFusion 操作
>     49    c128_padfusion_s(params, core_mask);
>     50    return 0;
>     51}

私有存储版本：

void i8_padfusion_p(long long *params)

void i16_padfusion_p(long long *params)

void i32_padfusion_p(long long *params)

void fp_padfusion_p(long long *params)

void dp_padfusion_p(long long *params)

void c64_padfusion_p(long long *params)

void c128_padfusion_p(long long *params)

void hp_padfusion_p(long long *params)

C调用示例：

>      1// MT7004 单核示例
>      2#include <stdio.h>
>      3#include <padfusion.h>
>      4
>      5
>      6int main(void) {
>      7    // 输入参数设置
>      8    int input_shape[4] = {4, 8, 4, 8};
>      9    int paddings[8] = {1, 1, 1, 1, 1, 1, 1, 1};
>     10    int padding_mode = 0;  // kConstant
>     11    float constant_value = 0.0f;
>     12
>     13    // 内存分配（L2空间）
>     14    float* input = (float*)0x10000000;
>     15    float* output = (float*)0x10100000;
>     16    int* output_shape = (int*)0x10200000;
>     17    int* formated_input_shape = (int*)0x10300000;
>     18    int* formated_output_shape = (int*)0x10400000;
>     19    int* formated_paddings = (int*)0x10500000;
>     20    int* in_strides = (int*)0x10600000;
>     21    int* out_strides = (int*)0x10700000;
>     22
>     23    // 计算输出形状
>     24    for (int i = 0; i < 4; ++i) {
>     25        output_shape[i] = input_shape[i] + paddings[i * 2] + paddings[i * 2 + 1];
>     26    }
>     27
>     28    // 初始化input
>     29    // ... 省略初始化input数据代码 ...
>     30
>     31    // 准备参数数组
>     32    long long params[12];
>     33    params[0] = (long long)input;
>     34    params[1] = (long long)output;
>     35    params[2] = (long long)input_shape;
>     36    params[3] = (long long)output_shape;
>     37    params[4] = (long long)paddings;
>     38    params[5] = (long long)padding_mode;
>     39    params[6] = (long long)&constant_value;
>     40    params[7] = (long long)formated_input_shape;
>     41    params[8] = (long long)formated_output_shape;
>     42    params[9] = (long long)formated_paddings;
>     43    params[10] = (long long)in_strides;
>     44    params[11] = (long long)out_strides;
>     45
>     46    // 执行 PadFusion 操作
>     47    fp_padfusion_p(params);
>     48    return 0;
>     49}