From 71bed532976c124af267363fa926defe186a51d8 Mon Sep 17 00:00:00 2001 From: Zhu Chuan <39799350+empowerszc@users.noreply.github.com> Date: Wed, 5 Apr 2023 21:14:43 +0800 Subject: [PATCH 1/2] [arm]fix exp's implementation(v_exp_f32) based on neon intrinsics --- src/ppl/kernel/arm_server/common/math_neon.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ppl/kernel/arm_server/common/math_neon.h b/src/ppl/kernel/arm_server/common/math_neon.h index 337d0430..4b6c7fee 100644 --- a/src/ppl/kernel/arm_server/common/math_neon.h +++ b/src/ppl/kernel/arm_server/common/math_neon.h @@ -41,10 +41,10 @@ inline float32x4_t v_exp_f32(const float32x4_t v_src) #else tmp = vrndmq_f32(fx); #endif - //TODO: compare is right? - uint32x4_t mask = vceqq_f32(tmp, fx); - mask = vandq_u32(mask, vcvtq_u32_f32(one)); - fx = vsubq_f32(tmp, vcvtq_f32_u32(mask)); + + float32x4_t mask = vreinterpret_f32_u32(vcgtq_f32(tmp, fx)); + mask = vreinterpret_f32_s32(vandq_s32(vreinterpret_s32_f32(mask), vreinterpret_s32_f32(one))); + fx = vsubq_f32(tmp, mask); tmp = vmulq_f32(fx, vdupq_n_f32(0.693359375)); float32x4_t z = vmulq_f32(fx, vdupq_n_f32(-2.12194440e-4)); @@ -61,10 +61,10 @@ inline float32x4_t v_exp_f32(const float32x4_t v_src) y = vfma(y, z, x); y = vaddq_f32(y, one); - int32x4_t imm0 = vcvtq_s32_f32(fx); - imm0 = vaddq_s32(imm0, vdupq_n_s32(0x7f)); - imm0 = vqrshlq_s32(imm0, vdupq_n_s32(23)); - float32x4_t pow2n = vcvtq_f32_s32(imm0); + int64x2_t imm0 = vreinterpretq_s64_s32(vcvtq_s32_f32(fx)); + imm0 = vreinterpretq_s64_s32(vaddq_s32(vreinterpretq_s32_s64(imm0), vdupq_n_s32(0x7f))); + imm0 = vreinterpretq_s64_s32(vshlq_s32(vreinterpretq_s32_s64(imm0), vdupq_n_s32(23))); + float32x4_t pow2n = vreinterpretq_f32_s32(vreinterpretq_s32_s64(imm0)); y = vmulq_f32(y, pow2n); return y; From bf3610cfa492db1834daa65c67acc11b94a77548 Mon Sep 17 00:00:00 2001 From: empowerszc <3150101351@zju.edu.cn> Date: Thu, 6 Apr 2023 22:03:42 +0800 Subject: [PATCH 2/2] . --- src/ppl/kernel/arm_server/common/math_neon.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ppl/kernel/arm_server/common/math_neon.h b/src/ppl/kernel/arm_server/common/math_neon.h index 4b6c7fee..02fbbaa4 100644 --- a/src/ppl/kernel/arm_server/common/math_neon.h +++ b/src/ppl/kernel/arm_server/common/math_neon.h @@ -42,8 +42,8 @@ inline float32x4_t v_exp_f32(const float32x4_t v_src) tmp = vrndmq_f32(fx); #endif - float32x4_t mask = vreinterpret_f32_u32(vcgtq_f32(tmp, fx)); - mask = vreinterpret_f32_s32(vandq_s32(vreinterpret_s32_f32(mask), vreinterpret_s32_f32(one))); + float32x4_t mask = vreinterpretq_f32_u32(vcgtq_f32(tmp, fx)); + mask = vreinterpretq_f32_s32(vandq_s32(vreinterpretq_s32_f32(mask), vreinterpretq_s32_f32(one))); fx = vsubq_f32(tmp, mask); tmp = vmulq_f32(fx, vdupq_n_f32(0.693359375));