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
* 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,257 +123,122 @@ 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
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
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
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
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
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
fmacd d10 , d2, d24
fmacd d11 , d3, d24
fmacd d18 , d2, d25
fmacd d19 , d3, d25
pld [AO , #A_PRE1]
pld [AO , #A_PRE-32]
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
fmacd d12 , d4, d24
fmacd d13 , d5, d24
fmacd d20 , d4, d25
fmacd d21 , d5, d25
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 }
vldm CO1, { 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
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
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
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 }
vstm CO2!, { d8 , d9 , d10 , d11 , d12, d13 , d14 , d15 }
.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:
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