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,209 +123,73 @@ 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
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 }
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
vstm CO2!, { d8 , d9 , d10 , d11 , d12, d13 , d14 , d15 }
.endm
.macro SAVE8x2_BAD
vldr d0, ALPHA vldr d0, ALPHA
vldm CO2, { d24, d25, d26 , d27 , d28 , d29 , d30 , d31 } vldm CO2, { d24, d25, d26 , d27 , d28 , d29 , d30 , d31 }
@ -390,6 +239,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.endm .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