diff --git a/src/layer/riscv/convolution_sgemm_packn_fp16s.h b/src/layer/riscv/convolution_sgemm_packn_fp16s.h index 3a8ef2c39..82086acea 100644 --- a/src/layer/riscv/convolution_sgemm_packn_fp16s.h +++ b/src/layer/riscv/convolution_sgemm_packn_fp16s.h @@ -55,20 +55,35 @@ static void im2col_sgemm_packn_fp16sa_rvv(const Mat& bottom_im2col, Mat& top_blo for (int k = 0; k < maxk; k++) { #if RVV_SPEC_0_7 - for (int l = 0; l < packn; l++) - { - tmpptr[0] = img0[l]; - tmpptr[1] = img0[l + packn]; - tmpptr[2] = img0[l + packn * 2]; - tmpptr[3] = img0[l + packn * 3]; - tmpptr[4] = img0[l + packn * 4]; - tmpptr[5] = img0[l + packn * 5]; - tmpptr[6] = img0[l + packn * 6]; - tmpptr[7] = img0[l + packn * 7]; - tmpptr += 8; - } + asm volatile( + "mv t3, %[LEN] \n\t" + "mv t1, %[SRC] \n\t" + "mv t2, %[TMP] \n\t" + "slli t3, t3, 1 \n\t" + "vle.v v0, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vle.v v1, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vle.v v2, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vle.v v3, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vle.v v4, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vle.v v5, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vle.v v6, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vle.v v7, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vsseg8e.v v0, (t2) \n\t" + : + : [LEN] "r"(packn), [SRC] "r"(img0), [TMP] "r"(tmpptr) + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "t1", "t2", "t3"); img0 += size * packn; + tmpptr += packn * 8; + #else vfloat16m1_t _val0 = vle16_v_f16m1(img0, vl); vfloat16m1_t _val1 = vle16_v_f16m1(img0 + packn, vl); @@ -104,16 +119,25 @@ static void im2col_sgemm_packn_fp16sa_rvv(const Mat& bottom_im2col, Mat& top_blo for (int k = 0; k < maxk; k++) { #if RVV_SPEC_0_7 - for (int l = 0; l < packn; l++) - { - tmpptr[0] = img0[l]; - tmpptr[1] = img0[l + packn]; - tmpptr[2] = img0[l + packn * 2]; - tmpptr[3] = img0[l + packn * 3]; - tmpptr += 4; - } + asm volatile( + "mv t3, %[LEN] \n\t" + "mv t1, %[SRC] \n\t" + "mv t2, %[TMP] \n\t" + "slli t3, t3, 1 \n\t" + "vle.v v0, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vle.v v1, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vle.v v2, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vle.v v3, (t1) \n\t" + "vsseg4e.v v0, (t2) \n\t" + : + : [LEN] "r"(packn), [SRC] "r"(img0), [TMP] "r"(tmpptr) + : "cc", "memory", "v0", "v1", "v2", "v3", "t1", "t2", "t3"); img0 += size * packn; + tmpptr += packn * 4; #else vfloat16m1_t _val0 = vle16_v_f16m1(img0, vl); vfloat16m1_t _val1 = vle16_v_f16m1(img0 + packn, vl); @@ -146,14 +170,21 @@ static void im2col_sgemm_packn_fp16sa_rvv(const Mat& bottom_im2col, Mat& top_blo for (int k = 0; k < maxk; k++) { #if RVV_SPEC_0_7 - for (int l = 0; l < packn; l++) - { - tmpptr[0] = img0[l]; - tmpptr[1] = img0[l + packn]; - tmpptr += 2; - } + asm volatile( + "mv t3, %[LEN] \n\t" + "mv t1, %[SRC] \n\t" + "mv t2, %[TMP] \n\t" + "slli t3, t3, 1 \n\t" + "vle.v v0, (t1) \n\t" + "add t1, t1, t3 \n\t" + "vle.v v1, (t1) \n\t" + "add t1, t1, t3 \n\t" + : + : [LEN] "r"(packn), [SRC] "r"(img0), [TMP] "r"(tmpptr) + : "cc", "memory", "v0", "v1", "t1", "t2", "t3"); img0 += size * packn; + tmpptr += packn * 2; #else vfloat16m1_t _val0 = vle16_v_f16m1(img0, vl); vfloat16m1_t _val1 = vle16_v_f16m1(img0 + packn, vl);