DynamicQuant
=================

将浮点输入张量按给定的 scale 和 zero point 量化为 INT8 输出张量。

.. math::

    q_i = \mathrm{clip}\left( \mathrm{round}\left( x_i \times \frac{1}{scale} + zp \right), -128, 127 \right)

其中：

- :math:`x_i` 为输入浮点值
- :math:`scale` 为量化比例因子
- :math:`zp` 为零点（zero point）
- 当输入为 :math:`+\infty` 时，输出饱和到 127
- 当输入为 :math:`-\infty` 时，输出饱和到 -128

输入：
    - **real_values** - 输入浮点数据地址。
    - **quant_values** - 输出 INT8 量化结果地址。
    - **scale** - 量化比例因子（标量）。
    - **zp** - 量化零点（标量，int32 类型）。
    - **size** - 输入元素总数。
    - **min_value** - 量化下界（通常为 -128）。
    - **max_value** - 量化上界（通常为 127）。
    - **core_mask** - 核掩码（仅适用于共享存储版本）。

输出：
    - **quant_values** - 量化后的 INT8 结果。

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

.. note::
    - FT78NE 支持 fp32 → int8
    - MT7004 支持 fp32, fp16 → int8
    - 量化结果被限制在 ``[min_value, max_value]`` 范围内（通常为 ``[-128, 127]``）

**共享存储版本：**

.. c:function:: void fp_dynamic_quant_s(float* real_values, int8_t* quant_values, float scale, int32_t zp, int size, int32_t min_value, int32_t max_value, int core_mask)
.. c:function:: void hp_dynamic_quant_s(half* real_values, int8_t* quant_values, float scale, int32_t zp, int size, int32_t min_value, int32_t max_value, int core_mask)

**C调用示例：**

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

    #include <stdio.h>

    int main(int argc, char* argv[]) {
        float *input = (float *)0x81000000;
        int8_t *output = (int8_t *)0x82000000;
        float scale = 0.1f;
        int32_t zp = 0;
        int size = 1024;
        int32_t min_value = -128;
        int32_t max_value = 127;
        int core_mask = 0xff;

        fp_dynamic_quant_s(input, output, scale, zp, size, min_value, max_value, core_mask);
        return 0;
    }

**私有存储版本：**

.. c:function:: void fp_dynamic_quant_p(float* real_values, int8_t* quant_values, float scale, int32_t zp, int size, int32_t min_value, int32_t max_value)
.. c:function:: void hp_dynamic_quant_p(half* real_values, int8_t* quant_values, float scale, int32_t zp, int size, int32_t min_value, int32_t max_value)

**C调用示例：**

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

    #include <stdio.h>

    int main(int argc, char* argv[]) {
        float *input = (float *)0x10010000;
        int8_t *output = (int8_t *)0x10020000;
        float scale = 0.1f;
        int32_t zp = 0;
        int size = 1024;
        int32_t min_value = -128;
        int32_t max_value = 127;

        fp_dynamic_quant_p(input, output, scale, zp, size, min_value, max_value);
        return 0;
    }
