changed dgemm_kernel to use fused multiply add
This commit is contained in:
parent
69ce737cc5
commit
4a474ea7dc
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue