AvgPoolingGrad
=================
根据输入梯度对平均池化前的特征图计算反向传播梯度。

    .. math::

        output_{b, x_h, x_w, c} += \frac{input_{b, y_h, y_w, c}}{\text{window}_h \cdot \text{window}_w}

    其中 :math:`(y_h, y_w)` 与 :math:`(x_h, x_w)` 之间满足窗口与步长的映射关系。

    输入：
        - **input** - 反向传播输入梯度张量首地址。
        - **output** - 反向传播输出梯度张量首地址。
        - **batch** - 批大小。
        - **output_h** - 池化输出高度。
        - **output_w** - 池化输出宽度。
        - **channel** - 通道数。
        - **input_w** - 池化输入宽度。
        - **input_h** - 池化输入高度。
        - **stride_w** - 水平步长。
        - **stride_h** - 垂直步长。
        - **pad_l** - 左侧填充大小。
        - **pad_u** - 上侧填充大小。
        - **window_w** - 池化窗口宽度。
        - **window_h** - 池化窗口高度。
        - **core_mask(int, 可选)** - 核掩码（仅适用于共享存储版本）。

    输出：
        - **output** - 原地累加平均池化反向传播梯度。

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

    .. note::
        - FT78NE 支持 fp32 数据类型。
        - MT7004 支持 fp16、fp32 数据类型。


**共享存储版本:**

.. c:function:: void hp_avgpoolinggrad_s(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask)
.. c:function:: void fp_avgpoolinggrad_s(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask)

    
    **C调用示例：**

    .. code-block:: c
        :linenos:
        :emphasize-lines: 20-25

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

        int main(void) {
            const float *input = (const float *)0xA0000000;  // DDR 存储
            float *output = (float *)0xB0000000;
            int batch = 16;
            int output_h = 7;
            int output_w = 7;
            int channel = 64;
            int input_w = 14;
            int input_h = 14;
            int stride_w = 2;
            int stride_h = 2;
            int pad_l = 0;
            int pad_u = 0;
            int window_w = 2;
            int window_h = 2;
            int core_mask = 0xff;
            fp_avgpoolinggrad_s(input, output, batch, output_h, output_w,
                                 channel, input_w, input_h,
                                 stride_w, stride_h,
                                 pad_l, pad_u,
                                 window_w, window_h,
                                 core_mask);
            return 0;
        }


**私有存储版本:**

.. c:function:: void hp_avgpoolinggrad_p(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx)
.. c:function:: void fp_avgpoolinggrad_p(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx)

    
    **C调用示例：**

    .. code-block:: c
        :linenos:
        :emphasize-lines: 21-26

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

        int main(void) {
            const half *input = (const half *)0x10000000;    // L2 存储
            half *output = (half *)0x10004000;
            int batch = 4;
            int output_h = 4;
            int output_w = 4;
            int channel = 128;
            int input_w = 8;
            int input_h = 8;
            int stride_w = 2;
            int stride_h = 2;
            int pad_l = 0;
            int pad_u = 0;
            int window_w = 2;
            int window_h = 2;
            int start_idx = 0;
            int end_idx = batch * output_h * output_w * channel;
            hp_avgpoolinggrad_p(input, output, batch, output_h, output_w,
                                channel, input_w, input_h,
                                stride_w, stride_h,
                                pad_l, pad_u,
                                window_w, window_h,
                                start_idx, end_idx);
            return 0;
        }
