From 4a474ea7dc21f68267442b89e1fa88c04d9187a0 Mon Sep 17 00:00:00 2001 From: wernsaar Date: Sun, 29 Sep 2013 17:46:23 +0200 Subject: [PATCH] changed dgemm_kernel to use fused multiply add --- kernel/arm/dgemm_kernel_8x2_vfpv3.S | 380 +++++++++++------------------------- 1 file changed, 115 insertions(+), 265 deletions(-) diff --git a/kernel/arm/dgemm_kernel_8x2_vfpv3.S b/kernel/arm/dgemm_kernel_8x2_vfpv3.S index 3c474a1..e4b2568 100644 --- a/kernel/arm/dgemm_kernel_8x2_vfpv3.S +++ b/kernel/arm/dgemm_kernel_8x2_vfpv3.S @@ -26,43 +26,28 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ /************************************************************************************** -* 2013/09/28 Saar +* 2013/09/29 Saar * BLASTEST : OK * CTEST : OK * TEST : OK * -* 2013/09/22 Saar -* UNROLL_N 2 -* UNROLL_M 8 -* DGEMM_P 64 -* DGEMM_Q 64 -* DGEMM_R 512 -* A_PRE 128 -* B_PRE 128 -* -* Performance on Odroid U2: -* -* 1 Core: 0.92 GFLOPS ATLAS: 0.81 GFLOPS -* 2 Cores: 1.83 GFLOPS ATLAS: 1.51 GFLOPS -* 3 Cores: 2.67 GFLOPS ATLAS: 1.51 GFLOPS -* 4 Cores: 3.52 GFLOPS ATLAS: 1.51 GFLOPS * -* 2013/09/28 Saar +* 2013/09/29 Saar * UNROLL_N 2 * UNROLL_M 8 * DGEMM_P 128 * DGEMM_Q 128 * DGEMM_R 2048 -* A_PRE 128 -* B_PRE 128 -* C_PRE 32 +* A_PRE 192 +* B_PRE 32 +* C_PRE 64 * * Performance on Odroid U2: * -* 1 Core: 0.99 GFLOPS ATLAS: 0.82 GFLOPS -* 2 Cores: 1.97 GFLOPS ATLAS: 1.59 GFLOPS -* 3 Cores: 2.86 GFLOPS ATLAS: 1.59 GFLOPS -* 4 Cores: 3.79 GFLOPS ATLAS: 1.59 GFLOPS +* 1 Core: 1.48 GFLOPS ATLAS: 1.52 GFLOPS +* 2 Cores: 2.92 GFLOPS ATLAS: - GFLOPS +* 3 Cores: 4.08 GFLOPS ATLAS: - GFLOPS +* 4 Cores: 4.80 GFLOPS ATLAS: 3.80 GFLOPS **************************************************************************************/ #define ASSEMBLER @@ -108,10 +93,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define K1 r7 #define BC r12 -#define A_PRE 128 -#define A_PRE1 160 -#define B_PRE 128 -#define C_PRE 32 +#define A_PRE 192 +#define A_PRE1 224 +#define B_PRE 32 +#define C_PRE 64 /************************************************************************************** * Macro definitions @@ -138,258 +123,123 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .endm -.macro KERNEL8x2_START - - vldm BO!, { d24 , d25} - vldm AO!, { d0, d1 , d2, d3, d4 , d5 , d6 , d7 } - - vmul.f64 d26 , d0 , d24 - vmul.f64 d29 , d0 , d25 - vmul.f64 d27 , d1 , d24 - vmul.f64 d30 , d1 , d25 - vmul.f64 d28 , d2 , d24 - vmul.f64 d31 , d2 , d25 - - pld [AO , #A_PRE] - - vadd.f64 d8 , d8 , d26 - vadd.f64 d16 , d16, d29 - vadd.f64 d9 , d9 , d27 - vadd.f64 d17 , d17, d30 - vadd.f64 d10 , d10, d28 - vadd.f64 d18 , d18, d31 - - vmul.f64 d26 , d3 , d24 - vmul.f64 d27 , d4 , d24 - vmul.f64 d28 , d5 , d24 - vmul.f64 d29 , d3 , d25 - vmul.f64 d30 , d4 , d25 - vmul.f64 d31 , d5 , d25 - - pld [AO , #A_PRE1] - - vadd.f64 d11 , d11, d26 - vadd.f64 d12 , d12, d27 - vadd.f64 d13 , d13, d28 - vadd.f64 d19 , d19, d29 - vadd.f64 d20 , d20, d30 - vadd.f64 d21 , d21, d31 - - vmul.f64 d26 , d6 , d24 - vmul.f64 d27 , d7 , d24 - vmul.f64 d29 , d6 , d25 - vmul.f64 d30 , d7 , d25 - - vldm BO!, { d24 , d25} - vldm AO!, { d0, d1 , d2, d3, d4 , d5 , d6 , d7 } - - vadd.f64 d14 , d14, d26 - vadd.f64 d15 , d15, d27 - vadd.f64 d22 , d22, d29 - vadd.f64 d23 , d23, d30 - -.endm - -.macro KERNEL8x2_M - vmul.f64 d26 , d0 , d24 - vmul.f64 d29 , d0 , d25 - vmul.f64 d27 , d1 , d24 - vmul.f64 d30 , d1 , d25 - vmul.f64 d28 , d2 , d24 - vmul.f64 d31 , d2 , d25 +.macro KERNEL8x2 + fldmiad BO!, { d24 , d25} pld [AO , #A_PRE] + fldmiad AO!, { d0, d1 } - vadd.f64 d8 , d8 , d26 - vadd.f64 d16 , d16, d29 - vadd.f64 d9 , d9 , d27 - vadd.f64 d17 , d17, d30 - vadd.f64 d10 , d10, d28 - vadd.f64 d18 , d18, d31 - - vmul.f64 d26 , d3 , d24 - vmul.f64 d27 , d4 , d24 - vmul.f64 d28 , d5 , d24 - vmul.f64 d29 , d3 , d25 - vmul.f64 d30 , d4 , d25 - vmul.f64 d31 , d5 , d25 - - pld [AO , #A_PRE1] - - vadd.f64 d11 , d11, d26 - vadd.f64 d12 , d12, d27 - vadd.f64 d13 , d13, d28 - vadd.f64 d19 , d19, d29 - vadd.f64 d20 , d20, d30 - vadd.f64 d21 , d21, d31 - - vmul.f64 d26 , d6 , d24 - vmul.f64 d27 , d7 , d24 - vmul.f64 d29 , d6 , d25 - vmul.f64 d30 , d7 , d25 - - vldm BO!, { d24 , d25} - vldm AO!, { d0, d1 , d2, d3, d4 , d5 , d6 , d7 } - - vadd.f64 d14 , d14, d26 - vadd.f64 d15 , d15, d27 - vadd.f64 d22 , d22, d29 - vadd.f64 d23 , d23, d30 - -.endm - + fmacd d8 , d0, d24 + fldmiad AO!, { d2, d3 } + fmacd d9 , d1, d24 + fldmiad AO!, { d4, d5 } + fmacd d16 , d0, d25 + fldmiad AO!, { d6, d7 } + fmacd d17 , d1, d25 -.macro KERNEL8x2_END + fmacd d10 , d2, d24 + fmacd d11 , d3, d24 + fmacd d18 , d2, d25 + fmacd d19 , d3, d25 - vmul.f64 d26 , d0 , d24 - vmul.f64 d29 , d0 , d25 - vmul.f64 d27 , d1 , d24 - vmul.f64 d30 , d1 , d25 - vmul.f64 d28 , d2 , d24 - vmul.f64 d31 , d2 , d25 + pld [AO , #A_PRE-32] - pld [AO , #A_PRE] + fmacd d12 , d4, d24 + fmacd d13 , d5, d24 + fmacd d20 , d4, d25 + fmacd d21 , d5, d25 - vadd.f64 d8 , d8 , d26 - vadd.f64 d16 , d16, d29 - vadd.f64 d9 , d9 , d27 - vadd.f64 d17 , d17, d30 - vadd.f64 d10 , d10, d28 - vadd.f64 d18 , d18, d31 - - vmul.f64 d26 , d3 , d24 - vmul.f64 d27 , d4 , d24 - vmul.f64 d28 , d5 , d24 - vmul.f64 d29 , d3 , d25 - vmul.f64 d30 , d4 , d25 - vmul.f64 d31 , d5 , d25 - - pld [AO , #A_PRE1] - - vadd.f64 d11 , d11, d26 - vadd.f64 d12 , d12, d27 - vadd.f64 d13 , d13, d28 - vadd.f64 d19 , d19, d29 - vadd.f64 d20 , d20, d30 - vadd.f64 d21 , d21, d31 - - vmul.f64 d26 , d6 , d24 - vmul.f64 d27 , d7 , d24 - vmul.f64 d29 , d6 , d25 - vmul.f64 d30 , d7 , d25 - - vadd.f64 d14 , d14, d26 - vadd.f64 d15 , d15, d27 - vadd.f64 d22 , d22, d29 - vadd.f64 d23 , d23, d30 - -.endm - - - - -.macro KERNEL8x2 - - vldm BO!, { d24 , d25} - vldm AO!, { d0, d1 , d2, d3, d4 , d5 , d6 , d7 } - - vmul.f64 d26 , d0 , d24 - vmul.f64 d29 , d0 , d25 - vmul.f64 d27 , d1 , d24 - vmul.f64 d30 , d1 , d25 - vmul.f64 d28 , d2 , d24 - vmul.f64 d31 , d2 , d25 - - pld [AO , #A_PRE] - - vadd.f64 d8 , d8 , d26 - vadd.f64 d16 , d16, d29 - vadd.f64 d9 , d9 , d27 - vadd.f64 d17 , d17, d30 - vadd.f64 d10 , d10, d28 - vadd.f64 d18 , d18, d31 - - vmul.f64 d26 , d3 , d24 - vmul.f64 d27 , d4 , d24 - vmul.f64 d28 , d5 , d24 - vmul.f64 d29 , d3 , d25 - vmul.f64 d30 , d4 , d25 - vmul.f64 d31 , d5 , d25 - - pld [AO , #A_PRE1] - - vadd.f64 d11 , d11, d26 - vadd.f64 d12 , d12, d27 - vadd.f64 d13 , d13, d28 - vadd.f64 d19 , d19, d29 - vadd.f64 d20 , d20, d30 - vadd.f64 d21 , d21, d31 - - vmul.f64 d26 , d6 , d24 - vmul.f64 d27 , d7 , d24 - vmul.f64 d29 , d6 , d25 - vmul.f64 d30 , d7 , d25 - - vadd.f64 d14 , d14, d26 - vadd.f64 d15 , d15, d27 - vadd.f64 d22 , d22, d29 - vadd.f64 d23 , d23, d30 + fmacd d14 , d6, d24 + fmacd d15 , d7, d24 + fmacd d22 , d6, d25 + fmacd d23 , d7, d25 .endm .macro SAVE8x2 vldr d0, ALPHA - vldm CO2, { d24, d25, d26 , d27 , d28 , d29 , d30 , d31 } - - vmul.f64 d8 , d0 , d8 - vmul.f64 d9 , d0 , d9 - vmul.f64 d10, d0 , d10 - vmul.f64 d11, d0 , d11 - vmul.f64 d12, d0 , d12 - vmul.f64 d13, d0 , d13 - vmul.f64 d14, d0 , d14 - vmul.f64 d15, d0 , d15 + vldm CO1, { d24, d25, d26 , d27 , d28 , d29 , d30 , d31 } + + vmla.f64 d24, d0 , d8 + vmla.f64 d25, d0 , d9 + vmla.f64 d26, d0 , d10 + vmla.f64 d27, d0 , d11 + vmla.f64 d28, d0 , d12 + vmla.f64 d29, d0 , d13 + vmla.f64 d30, d0 , d14 + vmla.f64 d31, d0 , d15 + + vstm CO1!, { d24, d25, d26 , d27 , d28 , d29 , d30 , d31 } + vldm CO2, { d8 , d9 , d10 , d11 , d12, d13 , d14 , d15 } - vmul.f64 d16, d0 , d16 - vmul.f64 d17, d0 , d17 - vmul.f64 d18, d0 , d18 - vmul.f64 d19, d0 , d19 - vmul.f64 d20, d0 , d20 - vmul.f64 d21, d0 , d21 - vmul.f64 d22, d0 , d22 - vmul.f64 d23, d0 , d23 - - vldm CO1, { d0 , d1 , d2 , d3 , d4 , d5 , d6 , d7 } - - vadd.f64 d16, d16, d24 - vadd.f64 d17, d17, d25 - vadd.f64 d18, d18, d26 - vadd.f64 d19, d19, d27 - - vadd.f64 d20, d20, d28 - vadd.f64 d21, d21, d29 - vadd.f64 d22, d22, d30 - vadd.f64 d23, d23, d31 + vmla.f64 d8 , d0 , d16 + vmla.f64 d9 , d0 , d17 + vmla.f64 d10, d0 , d18 + vmla.f64 d11, d0 , d19 + vmla.f64 d12, d0 , d20 + vmla.f64 d13, d0 , d21 + vmla.f64 d14, d0 , d22 + vmla.f64 d15, d0 , d23 - vadd.f64 d8 , d8 , d0 - vadd.f64 d9 , d9 , d1 - vadd.f64 d10, d10, d2 - vadd.f64 d11, d11, d3 + vstm CO2!, { d8 , d9 , d10 , d11 , d12, d13 , d14 , d15 } - vadd.f64 d12, d12, d4 - vadd.f64 d13, d13, d5 - vadd.f64 d14, d14, d6 - vadd.f64 d15, d15, d7 +.endm - vstm CO2!, { d16, d17, d18 , d19 , d20 , d21 , d22 , d23 } - vstm CO1!, { d8 , d9 , d10 , d11 , d12, d13 , d14 , d15 } +.macro SAVE8x2_BAD + + vldr d0, ALPHA + vldm CO2, { d24, d25, d26 , d27 , d28 , d29 , d30 , d31 } + + vmul.f64 d8 , d0 , d8 + vmul.f64 d9 , d0 , d9 + vmul.f64 d10, d0 , d10 + vmul.f64 d11, d0 , d11 + vmul.f64 d12, d0 , d12 + vmul.f64 d13, d0 , d13 + vmul.f64 d14, d0 , d14 + vmul.f64 d15, d0 , d15 + + vmul.f64 d16, d0 , d16 + vmul.f64 d17, d0 , d17 + vmul.f64 d18, d0 , d18 + vmul.f64 d19, d0 , d19 + vmul.f64 d20, d0 , d20 + vmul.f64 d21, d0 , d21 + vmul.f64 d22, d0 , d22 + vmul.f64 d23, d0 , d23 + + vldm CO1, { d0 , d1 , d2 , d3 , d4 , d5 , d6 , d7 } + + vadd.f64 d16, d16, d24 + vadd.f64 d17, d17, d25 + vadd.f64 d18, d18, d26 + vadd.f64 d19, d19, d27 + + vadd.f64 d20, d20, d28 + vadd.f64 d21, d21, d29 + vadd.f64 d22, d22, d30 + vadd.f64 d23, d23, d31 + + vadd.f64 d8 , d8 , d0 + vadd.f64 d9 , d9 , d1 + vadd.f64 d10, d10, d2 + vadd.f64 d11, d11, d3 + + vadd.f64 d12, d12, d4 + vadd.f64 d13, d13, d5 + vadd.f64 d14, d14, d6 + vadd.f64 d15, d15, d7 + + vstm CO2!, { d16, d17, d18 , d19 , d20 , d21 , d22 , d23 } + vstm CO1!, { d8 , d9 , d10 , d11 , d12, d13 , d14 , d15 } .endm + /*************************************************************************************/ @@ -814,18 +664,18 @@ _L2_M8_20: _L2_M8_22: pld [BO , #B_PRE] - KERNEL8x2_START - KERNEL8x2_M + KERNEL8x2 + KERNEL8x2 pld [BO , #B_PRE] - KERNEL8x2_M - KERNEL8x2_M + KERNEL8x2 + KERNEL8x2 pld [BO , #B_PRE] - KERNEL8x2_M - KERNEL8x2_M + KERNEL8x2 + KERNEL8x2 pld [BO , #B_PRE] - KERNEL8x2_M - KERNEL8x2_END + KERNEL8x2 + KERNEL8x2 subs L, L, #1 bgt _L2_M8_22 -- 2.7.4