量化工具¶
参考实现方法¶
-
template<typename T, layout_t LAYOUT = layout_t::KCX>
void QuantizeGroupwise(const float *src, int K, int C, int X, int G, const float *scales, const std::int32_t *zero_points, T *dst)¶ 将
src
中的浮点数据量化为类型T
。- 模板参数:
**T** - 输出量化数据类型 (
int8_t
、uint8_t
和int32_t
受支持)**LAYOUT** -
src
中输入张量的布局。 (KCX
和KXC
受支持)KCX
对应于KCRS
或KCTRS
(对于具有时间维度的权重张量)KXC
对应于KRSC
或KTRSC
(对于具有时间维度的权重张量)
- 参数:
**K** - 权重张量的输出通道数
**C** - 通道数
**X** -
R*S
或T*R*S
**G** - 组(如果
G == C
,则该函数执行逐通道量化;如果1 < G < C
,则该函数执行逐组量化;如果G == 1
,则该函数执行逐张量量化;)**scales** - 浮点比例。大小应等于
G
**zero_points** - 零点(应在类型
T
中表示)。大小应等于G
-
template<typename T>
void FusedQuantizeDequantize(const float *src, float *dst, std::int64_t len, const TensorQuantizationParams &qparams, int thread_id = 0, int num_threads = 1, float noise_ratio = 0.0f)¶ 融合整数量化反量化内核,用于加速量化感知训练。使用提供的 qparams 将 src 中的
fp32
值量化为(u)int8
,并将量化的整数返回值反量化为fp32
。
AVX-2 实现方法¶
-
void FindMinMax(const float *m, float *min, float *max, int64_t len)¶
查找浮点型矩阵中的最小值和最大值。
-
template<bool A_SYMMETRIC, bool B_SYMMETRIC, QuantizationGranularity Q_GRAN, bool HAS_BIAS, bool FUSE_RELU, typename BIAS_TYPE = std::int32_t, bool DIRECT = false>
void requantizeOutputProcessingAvx2(std::uint8_t *out, const std::int32_t *inp, const block_type_t &block, int ld_out, int ld_in, const requantizationParams_t<BIAS_TYPE> &r)¶ 使用 avx2 进行重量化,偏差已融合。
AVX-512 实现方法¶
-
template<bool A_SYMMETRIC, bool B_SYMMETRIC, QuantizationGranularity Q_GRAN, bool HAS_BIAS, bool FUSE_RELU, int C_PER_G, typename BIAS_TYPE = std::int32_t>
void requantizeOutputProcessingGConvAvx512(std::uint8_t *out, const std::int32_t *inp, const block_type_t &block, int ld_out, int ld_in, const requantizationParams_t<BIAS_TYPE> &r)¶ 使用 AVX512 进行重量化。