Conv2DBackpropInputFusion
=========================
计算二维卷积反向传播的输入梯度（Conv2D backprop input fusion），支持普通卷积、Depthwise 卷积以及 1x1 优化路径，多个核心通过核掩码协同完成批次并行。

    .. math::

        dx = \text{Conv2D}^\top(dy, w)

    输入：
        - **dy** - 输出梯度张量首地址，形状 ``[batch, out_h, out_w, out_channel]``。
        - **w** - 卷积权重张量首地址，形状 ``[out_channel, kernel_h, kernel_w, in_channel/group]``。
        - **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, 可选)** - 核掩码（仅适用于共享存储版本）。

    输出：
        - **dx** - 输入梯度张量首地址，形状 ``[batch, in_h, in_w, in_channel]``。

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

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

**共享存储版本:**

.. c:function:: void hp_conv2dbackpropinputfusion_s(const half *dy, const half *w, half *dx, ConvParameter *conv_param, int core_mask)
.. c:function:: void fp_conv2dbackpropinputfusion_s(const float *dy, const float *w, float *dx, 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 *w = (const float *)0xB0000000;
            float *dx = (const float *)0xC0000000;
            ConvParameter *param = (ConvParameter *)0xB0001000;  // 卷积参数共享区域
            // 设置 ConvParameter 字段
            param->workspace_ = (void *)0xB0002000;               // 共享工作空间
            param->buffer_size_ = 0x20000;
            param->input_batch_ = 1;
            param->input_h_ = 5;
            param->input_w_ = 5;
            param->input_channel_ = 4;
            param->output_batch_ = 1;
            param->output_h_ = 3;
            param->output_w_ = 3;
            param->output_channel_ = 8;
            param->kernel_h_ = 3;
            param->kernel_w_ = 3;
            param->group_ = 1;
            param->pad_u_ = 1;
            param->pad_d_ = 1;
            param->pad_l_ = 1;
            param->pad_r_ = 1;
            param->dilation_h_ = 1;
            param->dilation_w_ = 1;
            param->stride_h_ = 2;
            param->stride_w_ = 2;
            param->nweights_ = 8 * 3 * 3 * 4;  // 示例值
            int core_mask = 0xff;
            fp_conv2dbackpropinputfusion_s(dy, w, dx, param, core_mask);
            return 0;
        }

**私有存储版本:**

.. c:function:: void hp_conv2dbackpropinputfusion_p(const half *dy, const half *w, half *dx, ConvParameter *conv_param)
.. c:function:: void fp_conv2dbackpropinputfusion_p(const float *dy, const float *w, float *dx, 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 *w = (const half *)0x10020000;
            half *dx = (half *)0x10040000;
            ConvParameter *param = (ConvParameter *)0x10060000;
            // 设置 ConvParameter 字段
            param->workspace_ = (void *)0x10070000;
            param->buffer_size_ = 0x10000;
            param->input_batch_ = 1;
            param->input_h_ = 5;
            param->input_w_ = 5;
            param->input_channel_ = 4;
            param->output_batch_ = 1;
            param->output_h_ = 3;
            param->output_w_ = 3;
            param->output_channel_ = 8;
            param->kernel_h_ = 3;
            param->kernel_w_ = 3;
            param->group_ = 1;
            param->pad_u_ = 1;
            param->pad_d_ = 1;
            param->pad_l_ = 1;
            param->pad_r_ = 1;
            param->dilation_h_ = 1;
            param->dilation_w_ = 1;
            param->stride_h_ = 2;
            param->stride_w_ = 2;
            param->nweights_ = 8 * 3 * 3 * 4;  // 示例值
            hp_conv2dbackpropinputfusion_p(dy, w, dx, param);
            return 0;
        }
