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

# Conv2DBackpropFilterFusion

计算二维卷积反向传播的权重梯度（Conv2D backprop filter fusion），支持常规卷积、Depthwise 卷积以及 1x1 优化路径，多核按批次与空间维度分块协同完成。

> \[dw = \text{Conv2DGradFilter}(x, dy)\]
> 输入：

>   - dy - 输出梯度张量首地址，形状 `[batch, out_h, out_w, out_channel]`。

>   - x - 正向输入张量首地址，形状 `[batch, in_h, in_w, in_channel]`。

>   - conv_param - 卷积参数结构体地址，包含 `stride`、`pad`、`dilation`、`group`、输入输出维度及共享工作空间指针等信息。

>   ConvParameter 字段说明：

>   - `workspace_` - 指向算子运行时使用的临时工作空间，需满足对齐与容量要求。

>   - `output_batch_` - 输出梯度 `dy` 的批次数（通常等于输入批次数）。

>   - `input_batch_` - 正向输入 `x` 的批次数，用于与 `output_batch_` 校验。

>   - `input_h_` / `input_w_` - 正向输入特征图的高度与宽度。

>   - `output_h_` / `output_w_` - 输出梯度特征图的高度与宽度。

>   - `input_channel_` / `output_channel_` - 输入与输出通道数，需与 `group_` 配合满足整除关系。

>   - `kernel_h_` / `kernel_w_` - 卷积核的高与宽。

>   - `group_` - 组卷积数量，`group_ = 1` 表示普通卷积。

>   - `pad_l_` / `pad_r_` / `pad_u_` / `pad_d_` - 分别表示左右上下方向的填充大小。

>   - `dilation_h_` / `dilation_w_` - 核心采样间隔（膨胀系数）。

>   - `stride_h_` / `stride_w_` - 滑动窗口在高、宽方向的步长。

>   - `buffer_size_` - 分配给 `workspace_` 的缓冲区字节数，在运行前需要正确设置。

>   - `nweights_` - 卷积权重 `w` 的元素总数，用于内部分块和校验。

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

> 输出：

>   - dw - 卷积核梯度张量首地址，形状 `[out_channel, in_channel/group, kernel_h, kernel_w]`。

> 支持平台：

>   `FT78NE` `MT7004`

> 备注

> - FT78NE 支持 fp32 数据类型。

> - MT7004 支持 fp16、fp32 数据类型。

> - 需在 `conv_param->workspace_` 中预先分配共享工作空间，长度不少于 `conv_param->buffer_size_`。

共享存储版本:

void hp_conv2dbackpropfilterfusion_s(const half *dy, const half *x, half *dw, ConvParameter *conv_param, int core_mask)

void fp_conv2dbackpropfilterfusion_s(const float *dy, const float *x, float *dw, ConvParameter *conv_param, int core_mask)

  C调用示例：

       1// FT78NE 多核示例
       2#include <stdio.h>
       3#include "conv_parameter.h"
       4
       5int main(void) {
       6    const float *dy = (const float *)0xA0000000;   // DDR 存储
       7    const float *x = (const float *)0xB0000000;
       8    float *dw = (float *)0xC0000000;
       9    ConvParameter *param = (ConvParameter *)0xB0001000;
      10    // 设置 ConvParameter 字段
      11    param->workspace_ = (void *)0xB0002000;
      12    param->buffer_size_ = 0x20000;
      13    param->input_batch_ = 1;
      14    param->input_h_ = 3;
      15    param->input_w_ = 3;
      16    param->input_channel_ = 4;
      17    param->output_batch_ = 1;
      18    param->output_h_ = 3;
      19    param->output_w_ = 3;
      20    param->output_channel_ = 4;
      21    param->kernel_h_ = 2;
      22    param->kernel_w_ = 2;
      23    param->group_ = 2;
      24    param->pad_u_ = 1;
      25    param->pad_d_ = 0;
      26    param->pad_l_ = 1;
      27    param->pad_r_ = 0;
      28    param->dilation_h_ = 1;
      29    param->dilation_w_ = 1;
      30    param->stride_h_ = 1;
      31    param->stride_w_ = 1;
      32    param->nweights_ = 4 * 2 * 2 * 2;  // 示例值
      33    int core_mask = 0xff;
      34    fp_conv2dbackpropfilterfusion_s(dy, x, dw, param, core_mask);
      35    return 0;
      36}

私有存储版本:

void hp_conv2dbackpropfilterfusion_p(const half *dy, const half *x, half *dw, ConvParameter *conv_param)

void fp_conv2dbackpropfilterfusion_p(const float *dy, const float *x, float *dw, ConvParameter *conv_param)

  C调用示例：

       1// MT7004 单核示例
       2#include <stdio.h>
       3#include "conv_parameter.h"
       4
       5int main(void) {
       6    const half *dy = (const half *)0x10000000;   // L2 存储
       7    const half *x = (const half *)0x10020000;
       8    half *dw = (half *)0x10040000;
       9    ConvParameter *param = (ConvParameter *)0x10060000;
      10    // 设置 ConvParameter 字段
      11    param->workspace_ = (void *)0x10070000;
      12    param->buffer_size_ = 0x10000;
      13    param->input_batch_ = 1;
      14    param->input_h_ = 3;
      15    param->input_w_ = 3;
      16    param->input_channel_ = 4;
      17    param->output_batch_ = 1;
      18    param->output_h_ = 3;
      19    param->output_w_ = 3;
      20    param->output_channel_ = 4;
      21    param->kernel_h_ = 2;
      22    param->kernel_w_ = 2;
      23    param->group_ = 2;
      24    param->pad_u_ = 1;
      25    param->pad_d_ = 0;
      26    param->pad_l_ = 1;
      27    param->pad_r_ = 0;
      28    param->dilation_h_ = 1;
      29    param->dilation_w_ = 1;
      30    param->stride_h_ = 1;
      31    param->stride_w_ = 1;
      32    param->nweights_ = 4 * 2 * 2 * 2;  // 示例值
      33    hp_conv2dbackpropfilterfusion_p(dy, x, dw, param);
      34    return 0;
      35}