dgemm: Use the skylakex beta function also for haswell
it's more efficient for certain tall/skinny matrices
This commit is contained in:
parent
e8ca5a59a9
commit
c43331ad0a
|
@ -45,6 +45,7 @@ SGEMMOTCOPYOBJ = sgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||||
|
|
||||||
DTRMMKERNEL = dtrmm_kernel_4x8_haswell.c
|
DTRMMKERNEL = dtrmm_kernel_4x8_haswell.c
|
||||||
DGEMMKERNEL = dgemm_kernel_4x8_haswell.S
|
DGEMMKERNEL = dgemm_kernel_4x8_haswell.S
|
||||||
|
DGEMM_BETA = dgemm_beta_skylakex.c
|
||||||
DGEMMINCOPY = ../generic/gemm_ncopy_4.c
|
DGEMMINCOPY = ../generic/gemm_ncopy_4.c
|
||||||
DGEMMITCOPY = ../generic/gemm_tcopy_4.c
|
DGEMMITCOPY = ../generic/gemm_tcopy_4.c
|
||||||
DGEMMONCOPY = ../generic/gemm_ncopy_8.c
|
DGEMMONCOPY = ../generic/gemm_ncopy_8.c
|
||||||
|
|
|
@ -61,17 +61,17 @@ int CNAME(BLASLONG m, BLASLONG n, BLASLONG dummy1, FLOAT beta,
|
||||||
c_offset = c;
|
c_offset = c;
|
||||||
|
|
||||||
if (beta == ZERO){
|
if (beta == ZERO){
|
||||||
__m512d z_zero;
|
|
||||||
|
|
||||||
z_zero = _mm512_setzero_pd();
|
|
||||||
j = n;
|
j = n;
|
||||||
do {
|
do {
|
||||||
c_offset1 = c_offset;
|
c_offset1 = c_offset;
|
||||||
c_offset += ldc;
|
c_offset += ldc;
|
||||||
|
|
||||||
i = m;
|
i = m;
|
||||||
|
#ifdef __AVX2__
|
||||||
|
#ifdef __AVX512CD__
|
||||||
while (i >= 32) {
|
while (i >= 32) {
|
||||||
|
__m512d z_zero = _mm512_setzero_pd();
|
||||||
_mm512_storeu_pd(c_offset1, z_zero);
|
_mm512_storeu_pd(c_offset1, z_zero);
|
||||||
_mm512_storeu_pd(c_offset1 + 8, z_zero);
|
_mm512_storeu_pd(c_offset1 + 8, z_zero);
|
||||||
_mm512_storeu_pd(c_offset1 + 16, z_zero);
|
_mm512_storeu_pd(c_offset1 + 16, z_zero);
|
||||||
|
@ -79,12 +79,20 @@ int CNAME(BLASLONG m, BLASLONG n, BLASLONG dummy1, FLOAT beta,
|
||||||
c_offset1 += 32;
|
c_offset1 += 32;
|
||||||
i -= 32;
|
i -= 32;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
while (i >= 8) {
|
while (i >= 8) {
|
||||||
|
#ifdef __AVX512CD__
|
||||||
|
__m512d z_zero = _mm512_setzero_pd();
|
||||||
_mm512_storeu_pd(c_offset1, z_zero);
|
_mm512_storeu_pd(c_offset1, z_zero);
|
||||||
|
#else
|
||||||
|
__m256d y_zero = _mm256_setzero_pd();
|
||||||
|
_mm256_storeu_pd(c_offset1, y_zero);
|
||||||
|
_mm256_storeu_pd(c_offset1 + 4, y_zero);
|
||||||
|
#endif
|
||||||
c_offset1 += 8;
|
c_offset1 += 8;
|
||||||
i -= 8;
|
i -= 8;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
*c_offset1 = ZERO;
|
*c_offset1 = ZERO;
|
||||||
c_offset1 ++;
|
c_offset1 ++;
|
||||||
|
|
Loading…
Reference in New Issue