Files
2026-07-13 13:33:03 +08:00

32 lines
1.4 KiB
C++

#include <riscv_vector.h>
void MNNDynamicQuantFP32_RVV(const float* src, int8_t* dst, const float* scale, size_t src_depth_quad, size_t realSize,
int pack, const float* bias) {
size_t stride = pack * realSize;
const int int8_min = -128;
const int int8_max = 127;
const size_t RV_RNU = 0x4;
for (size_t i = 0; i < realSize; ++i) {
float scaleVal = scale[i];
float biasVal = (bias != nullptr) ? bias[i] : 0.0f;
for (size_t c = 0; c < src_depth_quad; ++c) {
const float* srcZ = src + c * stride + i * pack;
int8_t* dstZ = dst + c * stride + i * pack;
size_t n = pack;
size_t vl;
for (; n > 0; n -= vl, srcZ += vl, dstZ += vl) {
vl = __riscv_vsetvl_e32m4(n);
vfloat32m4_t v = __riscv_vle32_v_f32m4(srcZ, vl);
vfloat32m4_t vbias = __riscv_vfmv_v_f_f32m4(biasVal, vl);
v = __riscv_vfmadd_vf_f32m4(v, scaleVal, vbias, vl);
vint32m4_t vi = __riscv_vfcvt_x_f_v_i32m4_rm(v, RV_RNU, vl);
vi = __riscv_vmax_vx_i32m4(vi, int8_min, vl);
vi = __riscv_vmin_vx_i32m4(vi, int8_max, vl);
vint16m2_t v16 = __riscv_vncvt_x_x_w_i16m2(vi, vl);
vint8m1_t v8 = __riscv_vncvt_x_x_w_i8m1(v16, vl);
__riscv_vse8_v_i8m1(dstZ, v8, vl);
}
}
}
}