diff --git a/src/layer/riscv/riscv_v_071_fix.h b/src/layer/riscv/riscv_v_071_fix.h index a81f11a3e..62cc5cf4c 100644 --- a/src/layer/riscv/riscv_v_071_fix.h +++ b/src/layer/riscv/riscv_v_071_fix.h @@ -457,6 +457,43 @@ static inline vfloat32m1_t vfredsum_vs_f32m8_f32m1(vfloat32m1_t dst, vfloat32m8_ return vfaddvv_float32xm1(vfaddvv_float32xm1(vfaddvv_float32xm1(b8.m1[0], b8.m1[1], vl), vfaddvv_float32xm1(b8.m1[2], b8.m1[3], vl), vl), vfaddvv_float32xm1(vfaddvv_float32xm1(b8.m1[4], b8.m1[5], vl), vfaddvv_float32xm1(b8.m1[6], b8.m1[7], vl), vl), vl); } +static inline vfloat32m1_t vfredmax_vs_f32m1_f32m1(vfloat32m1_t dst, vfloat32m1_t a, vfloat32m1_t b, word_type vl) +{ + return vfredmaxvs_float32xm1(a, b, vl); +} +static inline vfloat32m1_t vfredmax_vs_f32m2_f32m1(vfloat32m1_t dst, vfloat32m2_t a, vfloat32m1_t b, word_type vl) +{ + float32xm2_u b2; + b2.m1[0] = b; + b2.m1[1] = vfmvvf_float32xm1(0.f, vl); + b2.v = vfredmaxvs_float32xm2(a, b2.v, vl); + return vfmaxvv_float32xm1(b2.m1[0], b2.m1[1], vl); +} +static inline vfloat32m1_t vfredmax_vs_f32m4_f32m1(vfloat32m1_t dst, vfloat32m4_t a, vfloat32m1_t b, word_type vl) +{ + float32xm4_u b4; + b4.m1[0] = b; + b4.m1[1] = vfmvvf_float32xm1(0.f, vl); + b4.m1[2] = vfmvvf_float32xm1(0.f, vl); + b4.m1[3] = vfmvvf_float32xm1(0.f, vl); + b4.v = vfredmaxvs_float32xm4(a, b4.v, vl); + return vfmaxvv_float32xm1(vfmaxvv_float32xm1(b4.m1[0], b4.m1[1], vl), vfmaxvv_float32xm1(b4.m1[2], b4.m1[3], vl), vl); +} +static inline vfloat32m1_t vfredmax_vs_f32m8_f32m1(vfloat32m1_t dst, vfloat32m8_t a, vfloat32m1_t b, word_type vl) +{ + float32xm8_u b8; + b8.m1[0] = b; + b8.m1[1] = vfmvvf_float32xm1(0.f, vl); + b8.m1[2] = vfmvvf_float32xm1(0.f, vl); + b8.m1[3] = vfmvvf_float32xm1(0.f, vl); + b8.m1[4] = vfmvvf_float32xm1(0.f, vl); + b8.m1[5] = vfmvvf_float32xm1(0.f, vl); + b8.m1[6] = vfmvvf_float32xm1(0.f, vl); + b8.m1[7] = vfmvvf_float32xm1(0.f, vl); + b8.v = vfredmaxvs_float32xm8(a, b8.v, vl); + return vfmaxvv_float32xm1(vfmaxvv_float32xm1(vfmaxvv_float32xm1(b8.m1[0], b8.m1[1], vl), vfmaxvv_float32xm1(b8.m1[2], b8.m1[3], vl), vl), vfmaxvv_float32xm1(vfmaxvv_float32xm1(b8.m1[4], b8.m1[5], vl), vfmaxvv_float32xm1(b8.m1[6], b8.m1[7], vl), vl), vl); +} + #define vmfeq_vv_f32m1_b32 vmfeqvv_e32xm1_float32xm1 #define vmfeq_vv_f32m2_b16 vmfeqvv_e32xm2_float32xm2 #define vmfeq_vv_f32m4_b8 vmfeqvv_e32xm4_float32xm4 diff --git a/src/layer/riscv/softmax_riscv.cpp b/src/layer/riscv/softmax_riscv.cpp index fe06bfbde..a70caef0d 100644 --- a/src/layer/riscv/softmax_riscv.cpp +++ b/src/layer/riscv/softmax_riscv.cpp @@ -224,7 +224,7 @@ int Softmax_riscv::forward_inplace(Mat& bottom_top_blob, const Option& opt) cons vfloat32m1_t _s = vfmv_s_f_f32m1(vundefined_f32m1(), s, vl); _p = exp_ps(vfsub_vf_f32m8(_p, m, vl), vl); - _s = vfredosum_vs_f32m8_f32m1(_s, _p, _s, vl); + _s = vfredsum_vs_f32m8_f32m1(_s, _p, _s, vl); vse32_v_f32m8(ptr2, _p, vl); s = vfmv_f_s_f32m1_f32(_s); @@ -517,4 +517,4 @@ int Softmax_riscv::forward_inplace(Mat& bottom_top_blob, const Option& opt) cons return Softmax::forward_inplace(bottom_top_blob, opt); } -} // namespace ncnn \ No newline at end of file +} // namespace ncnn