From c7c045ccf06ffdd313cc9d7b8812de136ea204ed Mon Sep 17 00:00:00 2001 From: lixian Date: Fri, 16 Oct 2020 10:49:32 +0800 Subject: [PATCH] post deconv assembly for arm32 --- .../nnacl/assembly/arm32/PostFuncBiasReluC8.S | 439 ++++++++++++++++++ mindspore/lite/nnacl/fp32/common_func.c | 2 +- mindspore/lite/nnacl/fp32/common_func.h | 5 +- 3 files changed, 442 insertions(+), 4 deletions(-) create mode 100644 mindspore/lite/nnacl/assembly/arm32/PostFuncBiasReluC8.S diff --git a/mindspore/lite/nnacl/assembly/arm32/PostFuncBiasReluC8.S b/mindspore/lite/nnacl/assembly/arm32/PostFuncBiasReluC8.S new file mode 100644 index 0000000000..ae20ead629 --- /dev/null +++ b/mindspore/lite/nnacl/assembly/arm32/PostFuncBiasReluC8.S @@ -0,0 +1,439 @@ +#ifdef ENABLE_ARM32 + +.text +.align 5 +//.p2align 5,,15 +.global PostFuncBiasReluC8 +#ifndef __APPLE__ +.type PostFuncBiasReluC8, %function +#endif + +//void PostFuncBiasReluC8(float *dst, const float *src, const float *bias, size_t oc8div,size_t oc8mod +// size_t plane_size, size_t stride, int relu_type); +// r0 dst r1 srx r2 bias +// r3 oc8div r4 oc8mod r5 plane_size +// r6 stride r7 relu_type + +// v0 ~ v15 value +// v16 v17 bias data +// r10 r11 weite loop tmp buf +// r16 relu6 #6; r17 relu #0 +// lr oc8 loop control +// r8 hw loop control + +PostFuncBiasReluC8: + push {r4-r8, r10, r11, lr} + add sp, sp, #32 + + ldr r4, [sp] + ldr r5, [sp, #4] + ldr r6, [sp, #8] + ldr r7, [sp, #12] + + vmov.i32 q14, #6 + vcvt.f32.s32 q14, q14 + veor q15, q15, q15 + mov lr, #0 + +Loop_C8: + cmp lr, r3 + beq Loop_C1 + mov r11, #4 + mul r10, lr, r11 + add r11, r0, r10 + add lr, lr, #8 + mov r8, r5 + vld1.32 {q12-q13}, [r2]! + +Loop_4x8: + cmp r8, #4 + blt Loop_1x8 + sub r8, r8, #4 + vld1.32 {q0-q1}, [r1]! + vld1.32 {q2-q3}, [r1]! + vld1.32 {q8-q9}, [r1]! + vld1.32 {q10-q11}, [r1]! + + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vadd.f32 q2, q2, q12 + vadd.f32 q3, q3, q13 + vadd.f32 q8, q8, q12 + vadd.f32 q9, q9, q13 + vadd.f32 q10, q10, q12 + vadd.f32 q11, q11, q13 + + cmp r7, #3 + beq Relu6_4x8 + cmp r7, #1 + beq Relu_4x8 + b Write_4x8 +Relu6_4x8: + vmin.f32 q0, q0, q14 + vmin.f32 q1, q1, q14 + vmin.f32 q2, q2, q14 + vmin.f32 q3, q3, q14 + vmin.f32 q8, q8, q14 + vmin.f32 q9, q9, q14 + vmin.f32 q10, q10, q14 + vmin.f32 q11, q11, q14 +Relu_4x8: + vmax.f32 q0, q0, q15 + vmax.f32 q1, q1, q15 + vmax.f32 q2, q2, q15 + vmax.f32 q3, q3, q15 + vmax.f32 q8, q8, q15 + vmax.f32 q9, q9, q15 + vmax.f32 q10, q10, q15 + vmax.f32 q11, q11, q15 +Write_4x8: + vst1.32 {q0-q1}, [r11], r6 + vst1.32 {q2-q3}, [r11], r6 + vst1.32 {q8-q9}, [r11], r6 + vst1.32 {q10-q11}, [r11], r6 + b Loop_4x8 + +Loop_1x8: + cmp r7, #3 + beq Relu6_1x8 + cmp r7, #1 + beq Relu_1x8 + b Write_1x8 +Relu6_1x8: + cmp r8, #0 + beq Loop_C8 + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vmin.f32 q0, q0, q14 + vmin.f32 q1, q1, q14 + vmax.f32 q0, q0, q15 + vmax.f32 q1, q1, q15 + vst1.32 {q0-q1}, [r11], r6 + b Relu6_1x8 +Relu_1x8: + cmp r8, #0 + beq Loop_C8 + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vmax.f32 q0, q0, q15 + vmax.f32 q1, q1, q15 + vst1.32 {q0-q1}, [r11], r6 + b Relu_1x8 +Write_1x8: + cmp r8, #0 + beq Loop_C8 + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vst1.32 {q0-q1}, [r11], r6 + b Write_1x8 + +Loop_C1: + cmp r4, #0 + beq End + mov r8, r5 + vld1.32 {q12-q13}, [r2]! + mov r11, #4 + mul r10, lr, r11 + add r0, r0, r10 + + cmp r4, #1 + beq Loop_C1_1 + cmp r4, #2 + beq Loop_C1_2 + cmp r4, #3 + beq Loop_C1_3 + cmp r4, #4 + beq Loop_C1_4 + cmp r4, #5 + beq Loop_C1_5 + cmp r4, #6 + beq Loop_C1_6 + cmp r4, #7 + beq Loop_C1_7 + +Loop_C1_1: + cmp r7, #3 + beq Loop_C1_1_Relu6 + cmp r7, #1 + beq Loop_C1_1_Relu + b Loop_C1_1_Write +Loop_C1_1_Relu6: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vmin.f32 q0, q0, q14 + vmax.f32 q0, q0, q15 + vst1.32 {d0[0]}, [r0], r6 + b Loop_C1_1_Relu6 +Loop_C1_1_Relu: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vmax.f32 q0, q0, q15 + vst1.32 {d0[0]}, [r0], r6 + b Loop_C1_1_Relu +Loop_C1_1_Write: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vst1.32 {d0[0]}, [r0], r6 + b Loop_C1_1_Write + +Loop_C1_2: + cmp r7, #3 + beq Loop_C1_2_Relu6 + cmp r7, #1 + beq Loop_C1_2_Relu + b Loop_C1_2_Write +Loop_C1_2_Relu6: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vmin.f32 q0, q0, q14 + vmax.f32 q0, q0, q15 + vst1.32 {d0}, [r0], r6 + b Loop_C1_2_Relu6 +Loop_C1_2_Relu: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vmax.f32 q0, q0, q15 + vst1.32 {d0}, [r0], r6 + b Loop_C1_2_Relu +Loop_C1_2_Write: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vst1.32 {d0}, [r0], r6 + b Loop_C1_2_Write + +Loop_C1_3: + add r11, r0, #8 + cmp r7, #3 + beq Loop_C1_3_Relu6 + cmp r7, #1 + beq Loop_C1_3_Relu + b Loop_C1_3_Write +Loop_C1_3_Relu6: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vmin.f32 q0, q0, q14 + vmax.f32 q0, q0, q15 + vst1.32 {d0}, [r0], r6 + vst1.32 {d1[0]}, [r11], r6 + b Loop_C1_3_Relu6 +Loop_C1_3_Relu: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vmax.f32 q0, q0, q15 + vst1.32 {d0}, [r0], r6 + vst1.32 {d1[0]}, [r11], r6 + b Loop_C1_3_Relu +Loop_C1_3_Write: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vst1.32 {d0}, [r0], r6 + vst1.32 {d1[0]}, [r11], r6 + b Loop_C1_3_Write + +Loop_C1_4: + cmp r7, #3 + beq Loop_C1_4_Relu6 + cmp r7, #1 + beq Loop_C1_4_Relu + b Loop_C1_4_Write +Loop_C1_4_Relu6: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vmin.f32 q0, q0, q14 + vmax.f32 q0, q0, q15 + vst1.32 {q0}, [r0], r6 + b Loop_C1_4_Relu6 +Loop_C1_4_Relu: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vmax.f32 q0, q0, q15 + vst1.32 {q0}, [r0], r6 + b Loop_C1_4_Relu6 +Loop_C1_4_Write: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vst1.32 {q0}, [r0], r6 + b Loop_C1_4_Write + +Loop_C1_5: + add r11, r0, #16 + cmp r7, #3 + beq Loop_C1_5_Relu6 + cmp r7, #1 + beq Loop_C1_5_Relu + b Loop_C1_5_Write +Loop_C1_5_Relu6: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vmin.f32 q0, q0, q14 + vmin.f32 q1, q1, q14 + vmax.f32 q0, q0, q15 + vmax.f32 q1, q1, q15 + vst1.32 {q0}, [r0], r6 + vst1.32 {d2[0]}, [r11], r6 + b Loop_C1_5_Relu6 +Loop_C1_5_Relu: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vmax.f32 q0, q0, q15 + vmax.f32 q1, q1, q15 + vst1.32 {q0}, [r0], r6 + vst1.32 {d2[0]}, [r11], r6 + b Loop_C1_5_Relu +Loop_C1_5_Write: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vst1.32 {q0}, [r0], r6 + vst1.32 {d2[0]}, [r11], r6 + b Loop_C1_5_Write + +Loop_C1_6: + add r11, r0, #16 + cmp r7, #3 + beq Loop_C1_6_Relu6 + cmp r7, #1 + beq Loop_C1_6_Relu + b Loop_C1_6_Write +Loop_C1_6_Relu6: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vmin.f32 q0, q0, q14 + vmin.f32 q1, q1, q14 + vmax.f32 q0, q0, q15 + vmax.f32 q1, q1, q15 + vst1.32 {q0}, [r0], r6 + vst1.32 {d2}, [r11], r6 + b Loop_C1_6_Relu6 +Loop_C1_6_Relu: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vmax.f32 q0, q0, q15 + vmax.f32 q1, q1, q15 + vst1.32 {q0}, [r0], r6 + vst1.32 {d2}, [r11], r6 + b Loop_C1_6_Relu +Loop_C1_6_Write: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vst1.32 {q0}, [r0], r6 + vst1.32 {d2}, [r11], r6 + b Loop_C1_6_Write + +Loop_C1_7: + add r11, r0, #16 + add r10, r0, #24 + cmp r7, #3 + beq Loop_C1_7_Relu6 + cmp r7, #1 + beq Loop_C1_7_Relu + b Loop_C1_7_Write +Loop_C1_7_Relu6: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vmin.f32 q0, q0, q14 + vmin.f32 q1, q1, q14 + vmax.f32 q0, q0, q15 + vmax.f32 q1, q1, q15 + vst1.32 {q0}, [r0], r6 + vst1.32 {d2}, [r11], r6 + vst1.32 {d3[0]}, [r10], r6 + b Loop_C1_7_Relu6 +Loop_C1_7_Relu: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vmax.f32 q0, q0, q15 + vmax.f32 q1, q1, q15 + vst1.32 {q0}, [r0], r6 + vst1.32 {d2}, [r11], r6 + vst1.32 {d3[0]}, [r10], r6 + b Loop_C1_7_Relu +Loop_C1_7_Write: + cmp r8, #0 + beq End + sub r8, r8, #1 + vld1.32 {q0-q1}, [r1]! + vadd.f32 q0, q0, q12 + vadd.f32 q1, q1, q13 + vst1.32 {q0}, [r0], r6 + vst1.32 {d2}, [r11], r6 + vst1.32 {d3[0]}, [r10], r6 + b Loop_C1_7_Write + +End: + sub sp, sp, #32 + pop {r4-r8, r10, r11, pc} +#endif diff --git a/mindspore/lite/nnacl/fp32/common_func.c b/mindspore/lite/nnacl/fp32/common_func.c index 606e55e8a8..2ff8a4303f 100644 --- a/mindspore/lite/nnacl/fp32/common_func.c +++ b/mindspore/lite/nnacl/fp32/common_func.c @@ -42,7 +42,7 @@ void PostConvFuncComm(const float *src_ptr_, float *out_ptr, const float *bias_p void PostConvFuncFp32C8(const float *c8_out_ptr, float *out_ptr, const float *bias_ptr, size_t output_channel, size_t plane_size, size_t stride, bool is_relu, bool is_relu6) { -#ifndef ENABLE_ARM64 +#ifndef ENABLE_ARM PostConvFuncComm(c8_out_ptr, out_ptr, bias_ptr, output_channel, plane_size, stride, is_relu, is_relu6, C8NUM); #else size_t oc8mod = output_channel % C8NUM; diff --git a/mindspore/lite/nnacl/fp32/common_func.h b/mindspore/lite/nnacl/fp32/common_func.h index cb1fceeeac..4969851225 100644 --- a/mindspore/lite/nnacl/fp32/common_func.h +++ b/mindspore/lite/nnacl/fp32/common_func.h @@ -45,6 +45,8 @@ void ConvDwFp32Row(float *output_ptr, const float *input_ptr, const float *weigh void ConvDwFp32Border(float *dst, const float *src, const float *weight, const float *bias, size_t height, size_t width, size_t in_kh_step, size_t in_kw_step, size_t kernel_w, size_t relu, size_t relu6); +void PostFuncBiasReluC8(float *dst, const float *src, const float *bias, size_t oc8div, size_t oc8mod, + size_t plane_size, size_t stride, size_t relu_type); #endif #ifdef ENABLE_ARM64 @@ -57,9 +59,6 @@ void Relu(float *data, size_t element4); void DeconvDwFp32Border(float *dst, const float *src, const float *weight, size_t height, size_t width, size_t in_kh_step, size_t in_kw_step, size_t kernel_w); -void PostFuncBiasReluC8(float *dst, const float *src, const float *bias, size_t oc8div, size_t oc8mod, - size_t plane_size, size_t stride, size_t relu_type); - void ConvSwFp32Center(float *dst, const float *src, const float *weight, const float *bias, size_t height, size_t width, size_t kernel_h, size_t kernel_w, size_t out_h_step, size_t block_channel, size_t ic4, size_t in_sh_step, size_t in_sw_step, size_t in_kh_step, size_t in_kw_step, size_t relu,