changed dgemm_kernel to use fused multiply add

This commit is contained in:
wernsaar 2013-09-29 17:46:23 +02:00
parent 69ce737cc5
commit 4a474ea7dc
1 changed files with 115 additions and 265 deletions

View File

@ -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 * BLASTEST : OK
* CTEST : OK * CTEST : OK
* TEST : 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: * 2013/09/29 Saar
*
* 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
* UNROLL_N 2 * UNROLL_N 2
* UNROLL_M 8 * UNROLL_M 8
* DGEMM_P 128 * DGEMM_P 128
* DGEMM_Q 128 * DGEMM_Q 128
* DGEMM_R 2048 * DGEMM_R 2048
* A_PRE 128 * A_PRE 192
* B_PRE 128 * B_PRE 32
* C_PRE 32 * C_PRE 64
* *
* Performance on Odroid U2: * Performance on Odroid U2:
* *
* 1 Core: 0.99 GFLOPS ATLAS: 0.82 GFLOPS * 1 Core: 1.48 GFLOPS ATLAS: 1.52 GFLOPS
* 2 Cores: 1.97 GFLOPS ATLAS: 1.59 GFLOPS * 2 Cores: 2.92 GFLOPS ATLAS: - GFLOPS
* 3 Cores: 2.86 GFLOPS ATLAS: 1.59 GFLOPS * 3 Cores: 4.08 GFLOPS ATLAS: - GFLOPS
* 4 Cores: 3.79 GFLOPS ATLAS: 1.59 GFLOPS * 4 Cores: 4.80 GFLOPS ATLAS: 3.80 GFLOPS
**************************************************************************************/ **************************************************************************************/
#define ASSEMBLER #define ASSEMBLER
@ -108,10 +93,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define K1 r7 #define K1 r7
#define BC r12 #define BC r12
#define A_PRE 128 #define A_PRE 192
#define A_PRE1 160 #define A_PRE1 224
#define B_PRE 128 #define B_PRE 32
#define C_PRE 32 #define C_PRE 64
/************************************************************************************** /**************************************************************************************
* Macro definitions * Macro definitions
@ -138,257 +123,122 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.endm .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
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_END
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
.endm
.macro KERNEL8x2 .macro KERNEL8x2
vldm BO!, { d24 , d25} fldmiad 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] pld [AO , #A_PRE]
fldmiad AO!, { d0, d1 }
vadd.f64 d8 , d8 , d26 fmacd d8 , d0, d24
vadd.f64 d16 , d16, d29 fldmiad AO!, { d2, d3 }
vadd.f64 d9 , d9 , d27 fmacd d9 , d1, d24
vadd.f64 d17 , d17, d30 fldmiad AO!, { d4, d5 }
vadd.f64 d10 , d10, d28 fmacd d16 , d0, d25
vadd.f64 d18 , d18, d31 fldmiad AO!, { d6, d7 }
fmacd d17 , d1, d25
vmul.f64 d26 , d3 , d24 fmacd d10 , d2, d24
vmul.f64 d27 , d4 , d24 fmacd d11 , d3, d24
vmul.f64 d28 , d5 , d24 fmacd d18 , d2, d25
vmul.f64 d29 , d3 , d25 fmacd d19 , d3, d25
vmul.f64 d30 , d4 , d25
vmul.f64 d31 , d5 , d25
pld [AO , #A_PRE1] pld [AO , #A_PRE-32]
vadd.f64 d11 , d11, d26 fmacd d12 , d4, d24
vadd.f64 d12 , d12, d27 fmacd d13 , d5, d24
vadd.f64 d13 , d13, d28 fmacd d20 , d4, d25
vadd.f64 d19 , d19, d29 fmacd d21 , d5, d25
vadd.f64 d20 , d20, d30
vadd.f64 d21 , d21, d31
vmul.f64 d26 , d6 , d24 fmacd d14 , d6, d24
vmul.f64 d27 , d7 , d24 fmacd d15 , d7, d24
vmul.f64 d29 , d6 , d25 fmacd d22 , d6, d25
vmul.f64 d30 , d7 , d25 fmacd d23 , d7, d25
vadd.f64 d14 , d14, d26
vadd.f64 d15 , d15, d27
vadd.f64 d22 , d22, d29
vadd.f64 d23 , d23, d30
.endm .endm
.macro SAVE8x2 .macro SAVE8x2
vldr d0, ALPHA vldr d0, ALPHA
vldm CO2, { d24, d25, d26 , d27 , d28 , d29 , d30 , d31 } vldm CO1, { d24, d25, d26 , d27 , d28 , d29 , d30 , d31 }
vmul.f64 d8 , d0 , d8 vmla.f64 d24, d0 , d8
vmul.f64 d9 , d0 , d9 vmla.f64 d25, d0 , d9
vmul.f64 d10, d0 , d10 vmla.f64 d26, d0 , d10
vmul.f64 d11, d0 , d11 vmla.f64 d27, d0 , d11
vmul.f64 d12, d0 , d12 vmla.f64 d28, d0 , d12
vmul.f64 d13, d0 , d13 vmla.f64 d29, d0 , d13
vmul.f64 d14, d0 , d14 vmla.f64 d30, d0 , d14
vmul.f64 d15, d0 , d15 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 vmla.f64 d8 , d0 , d16
vmul.f64 d17, d0 , d17 vmla.f64 d9 , d0 , d17
vmul.f64 d18, d0 , d18 vmla.f64 d10, d0 , d18
vmul.f64 d19, d0 , d19 vmla.f64 d11, d0 , d19
vmul.f64 d20, d0 , d20 vmla.f64 d12, d0 , d20
vmul.f64 d21, d0 , d21 vmla.f64 d13, d0 , d21
vmul.f64 d22, d0 , d22 vmla.f64 d14, d0 , d22
vmul.f64 d23, d0 , d23 vmla.f64 d15, d0 , d23
vldm CO1, { d0 , d1 , d2 , d3 , d4 , d5 , d6 , d7 } vstm CO2!, { d8 , d9 , d10 , d11 , d12, d13 , d14 , d15 }
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 .endm
.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: _L2_M8_22:
pld [BO , #B_PRE] pld [BO , #B_PRE]
KERNEL8x2_START KERNEL8x2
KERNEL8x2_M KERNEL8x2
pld [BO , #B_PRE] pld [BO , #B_PRE]
KERNEL8x2_M KERNEL8x2
KERNEL8x2_M KERNEL8x2
pld [BO , #B_PRE] pld [BO , #B_PRE]
KERNEL8x2_M KERNEL8x2
KERNEL8x2_M KERNEL8x2
pld [BO , #B_PRE] pld [BO , #B_PRE]
KERNEL8x2_M KERNEL8x2
KERNEL8x2_END KERNEL8x2
subs L, L, #1 subs L, L, #1
bgt _L2_M8_22 bgt _L2_M8_22