ggml-cpu:add RISC-V RVV (Zvfh) optimization for FP16 vector scaling (#17314)
* ggml-cpu:add RISC-V RVV (Zvfh) optimization for FP16 vector scaling Signed-off-by: Wang Yang <yangwang@iscas.ac.cn> * fix comment * fix comment 2 --------- Signed-off-by: Wang Yang <yangwang@iscas.ac.cn>
This commit is contained in:
+10
-9
@@ -698,8 +698,7 @@ inline static void ggml_vec_scale_f32(const int n, float * y, const float v) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline static void ggml_vec_scale_f16(const int n, ggml_fp16_t * y, const float v) {
|
inline static void ggml_vec_scale_f16(const int n, ggml_fp16_t * y, const float v) {
|
||||||
#if defined(GGML_SIMD)
|
#if defined(GGML_SIMD) && defined(__ARM_FEATURE_SVE)
|
||||||
#if defined(__ARM_FEATURE_SVE)
|
|
||||||
const int sve_register_length = svcntb() * 8;
|
const int sve_register_length = svcntb() * 8;
|
||||||
const int ggml_f16_epr = sve_register_length / 16;
|
const int ggml_f16_epr = sve_register_length / 16;
|
||||||
const int ggml_f16_step = 2 * ggml_f16_epr;
|
const int ggml_f16_step = 2 * ggml_f16_epr;
|
||||||
@@ -725,13 +724,16 @@ inline static void ggml_vec_scale_f16(const int n, ggml_fp16_t * y, const float
|
|||||||
svfloat16_t out = svmul_f16_m(pg, hy, vx);
|
svfloat16_t out = svmul_f16_m(pg, hy, vx);
|
||||||
svst1_f16(pg, (__fp16 *)(y + np), out);
|
svst1_f16(pg, (__fp16 *)(y + np), out);
|
||||||
}
|
}
|
||||||
#elif defined(__riscv_v_intrinsic)
|
#elif defined(__riscv_v_intrinsic) && defined(__riscv_zvfh)
|
||||||
// todo: RVV impl
|
for (int i = 0, vl; i < n; i += vl) {
|
||||||
// scalar
|
vl = __riscv_vsetvl_e16m2(n - i);
|
||||||
for (int i = 0; i < n; ++i) {
|
vfloat16m2_t vy = __riscv_vle16_v_f16m2((_Float16 *)&y[i], vl);
|
||||||
y[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(y[i])*v);
|
vfloat32m4_t vy32 = __riscv_vfwcvt_f_f_v_f32m4(vy, vl);
|
||||||
|
vy32 = __riscv_vfmul_vf_f32m4(vy32, v, vl);
|
||||||
|
vy = __riscv_vfncvt_f_f_w_f16m2(vy32, vl);
|
||||||
|
__riscv_vse16_v_f16m2((_Float16 *)&y[i], vy, vl);
|
||||||
}
|
}
|
||||||
#else
|
#elif defined(GGML_SIMD)
|
||||||
const int np = (n & ~(GGML_F16_STEP - 1));
|
const int np = (n & ~(GGML_F16_STEP - 1));
|
||||||
|
|
||||||
GGML_F16_VEC vx = GGML_F16_VEC_SET1(v);
|
GGML_F16_VEC vx = GGML_F16_VEC_SET1(v);
|
||||||
@@ -751,7 +753,6 @@ inline static void ggml_vec_scale_f16(const int n, ggml_fp16_t * y, const float
|
|||||||
for (int i = np; i < n; ++i) {
|
for (int i = np; i < n; ++i) {
|
||||||
y[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(y[i])*v);
|
y[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(y[i])*v);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
// scalar
|
// scalar
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
|
|||||||
Reference in New Issue
Block a user