DeconvGradFilter
=================



计算反卷积（Deconvolution / Transposed Convolution）算子的权重梯度，用于反向传播阶段。
该算子根据输出梯度 ``dy`` 与输入特征 ``x``，通过 ``im2row + GEMM`` 的方式累加得到卷积核梯度 ``dw``，并支持分组（group）计算。

.. math::

    \frac{\partial W}{\partial L}
    =
    \sum_{b=0}^{B-1}
    \text{Im2Row}(dY_b) \cdot X_b

其中每个 Group 独立计算，最终在 Group 维度上拼接。

输入：
    - **dy_data** - 输出特征梯度地址，形状为 ``[batch, out_h, out_w, out_c]``。
    - **x_data** - 输入特征地址，形状为 ``[batch, in_h, in_w, in_c]``。
    - **param** - 参数数组地址，用于描述反卷积计算相关参数与工作空间。
        - ``param[1]``  : in_h
        - ``param[2]``  : in_w
        - ``param[3]``  : in_c
        - ``param[4]``  : batch
        - ``param[5]``  : out_h
        - ``param[6]``  : out_w
        - ``param[7]``  : out_c
        - ``param[8]``  : kernel_h
        - ``param[9]``  : kernel_w
        - ``param[16]`` : group
        - ``param[17]`` : im2row 工作缓冲区地址
    - **core_mask** - 核掩码（仅适用于共享存储版本）。

输出：
    - **dw_data** - 权重梯度输出地址，布局为 ``[group, out_c/group * k_h * k_w, in_c/group]``。

支持平台：
    ``FT78NE``
    ``MT7004``

.. note::
    - FT78NE 仅支持 fp 类型
    - MT7004 支持 hp, fp 类型
    - 输入与输出数据格式为 NHWC

**共享存储版本:**

.. c:function:: void hp_deconvgradfilter_s(half* dy_data, half* x_data, half* dw_data, long long* param, int core_mask)
.. c:function:: void fp_deconvgradfilter_s(float* dy_data, float* x_data, float* dw_data, long long* param, int core_mask)

**C调用示例：**

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

    //FT78NE示例
    #include <stdio.h>
    #include <deconvgradfilter.h>

    int main(int argc, char* argv[]) {
        float *dy_data = (float *)0xA0000000;
        float *x_data  = (float *)0xA1000000;
        float *dw_data = (float *)0xC0000000;
        long long *param = (long long *)0xA2000000;
        int core_mask = 0xff;

        fp_deconvgradfilter_s(dy_data, x_data, dw_data, param, core_mask);
        return 0;
    }


**私有存储版本:**

.. c:function:: void hp_deconvgradfilter_p(half* dy_data, half* x_data, half* dw_data, long long* param)
.. c:function:: void fp_deconvgradfilter_p(float* dy_data, float* x_data, float* dw_data, long long* param)

**C调用示例：**

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

    //FT78NE示例
    #include <stdio.h>
    #include <deconvgradfilter.h>

    int main(int argc, char* argv[]) {
        float *dy_data = (float *)0x10810000;   // L2空间
        float *x_data  = (float *)0x10820000;
        float *dw_data = (float *)0x10830000;
        long long *param = (long long *)0x10840000;

        fp_deconvgradfilter_p(dy_data, x_data, dw_data, param);
        return 0;
    }
