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

    .. math::

        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``

    .. note::
        - FT78NE 支持 fp32 数据类型。
        - MT7004 支持 fp16、fp32 数据类型。
        - 需在 ``conv_param->workspace_`` 中预先分配共享工作空间，长度不少于 ``conv_param->buffer_size_``。


**共享存储版本:**

.. c:function:: void hp_conv2dbackpropfilterfusion_s(const half *dy, const half *x, half *dw, ConvParameter *conv_param, int core_mask)
.. c:function:: void fp_conv2dbackpropfilterfusion_s(const float *dy, const float *x, float *dw, ConvParameter *conv_param, int core_mask)

    **C调用示例：**

    .. code-block:: c
        :linenos:
        :emphasize-lines: 34

        // FT78NE 多核示例
        #include <stdio.h>
        #include "conv_parameter.h"

        int main(void) {
            const float *dy = (const float *)0xA0000000;   // DDR 存储
            const float *x = (const float *)0xB0000000;
            float *dw = (float *)0xC0000000;
            ConvParameter *param = (ConvParameter *)0xB0001000;
            // 设置 ConvParameter 字段
            param->workspace_ = (void *)0xB0002000;
            param->buffer_size_ = 0x20000;
            param->input_batch_ = 1;
            param->input_h_ = 3;
            param->input_w_ = 3;
            param->input_channel_ = 4;
            param->output_batch_ = 1;
            param->output_h_ = 3;
            param->output_w_ = 3;
            param->output_channel_ = 4;
            param->kernel_h_ = 2;
            param->kernel_w_ = 2;
            param->group_ = 2;
            param->pad_u_ = 1;
            param->pad_d_ = 0;
            param->pad_l_ = 1;
            param->pad_r_ = 0;
            param->dilation_h_ = 1;
            param->dilation_w_ = 1;
            param->stride_h_ = 1;
            param->stride_w_ = 1;
            param->nweights_ = 4 * 2 * 2 * 2;  // 示例值
            int core_mask = 0xff;
            fp_conv2dbackpropfilterfusion_s(dy, x, dw, param, core_mask);
            return 0;
        }


**私有存储版本:**

.. c:function:: void hp_conv2dbackpropfilterfusion_p(const half *dy, const half *x, half *dw, ConvParameter *conv_param)
.. c:function:: void fp_conv2dbackpropfilterfusion_p(const float *dy, const float *x, float *dw, ConvParameter *conv_param)

    **C调用示例：**

    .. code-block:: c
        :linenos:
        :emphasize-lines: 33

        // MT7004 单核示例
        #include <stdio.h>
        #include "conv_parameter.h"

        int main(void) {
            const half *dy = (const half *)0x10000000;   // L2 存储
            const half *x = (const half *)0x10020000;
            half *dw = (half *)0x10040000;
            ConvParameter *param = (ConvParameter *)0x10060000;
            // 设置 ConvParameter 字段
            param->workspace_ = (void *)0x10070000;
            param->buffer_size_ = 0x10000;
            param->input_batch_ = 1;
            param->input_h_ = 3;
            param->input_w_ = 3;
            param->input_channel_ = 4;
            param->output_batch_ = 1;
            param->output_h_ = 3;
            param->output_w_ = 3;
            param->output_channel_ = 4;
            param->kernel_h_ = 2;
            param->kernel_w_ = 2;
            param->group_ = 2;
            param->pad_u_ = 1;
            param->pad_d_ = 0;
            param->pad_l_ = 1;
            param->pad_r_ = 0;
            param->dilation_h_ = 1;
            param->dilation_w_ = 1;
            param->stride_h_ = 1;
            param->stride_w_ = 1;
            param->nweights_ = 4 * 2 * 2 * 2;  // 示例值
            hp_conv2dbackpropfilterfusion_p(dy, x, dw, param);
            return 0;
        }
