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,209 +123,73 @@ 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 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
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
/*************************************************************************************/
@ -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