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

    .. 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** - 反向传播输入梯度张量首地址。
        - **params** - 参数数组，包含12个int类型数据，按顺序赋值以下元素：
            - **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_avg_pool_grad_s(half *input, half *output, int *params, int core_mask)
.. c:function:: void fp_avg_pool_grad_s(float *input, float *output, int *params, int core_mask)

    
    **C调用示例：**

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

        // 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 params[12] = {batch, output_h, output_w, channel, input_w, input_h, stride_w, stride_h, pad_l, pad_u, window_w, window_h};
            int core_mask = 0xff;
            fp_avg_pool_grad_s(input, output, params, core_mask);
            return 0;
        }


**私有存储版本:**

.. c:function:: void hp_avg_pool_grad_p(half *input, half *output, int *params)
.. c:function:: void fp_avg_pool_grad_p(float *input, float *output, int *params)

    
    **C调用示例：**

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

        // 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 params[12] = {batch, output_h, output_w, channel, input_w, input_h, stride_w, stride_h, pad_l, pad_u, window_w, window_h};
            hp_avg_pool_grad_p(input, output, params);
            return 0;
        }
