void Mjoin(Mjoin(Mjoin(PATL,herk),UploNM),N) (const int N, const int K, const void *valpha, const void *A, const int lda, const void *vbeta, void *C, const int ldc) { void *vc; TYPE *c; TYPE alpha[2]; const TYPE beta = *( (const TYPE *)vbeta ); const TYPE zero[2] = {0.0, 0.0}; alpha[0] = *( (const TYPE *)valpha ); if (K > HERK_Xover) { alpha[1] = 0.0; vc = malloc(ATL_Cachelen+ATL_MulBySize(N)*N); ATL_assert(vc); c = ATL_AlignPtr(vc); CgemmNC(N, N, K, alpha, A, lda, A, lda, zero, c, N); if ( beta == 1.0 ) Mjoin(her_put,_b1)(N, c, vbeta, C, ldc); else if ( beta == 0.0 ) Mjoin(her_put,_b0)(N, c, vbeta, C, ldc); else Mjoin(her_put,_bXi0)(N, c, vbeta, C, ldc); free(vc); } else Mjoin(PATL,refherk)(Uplo_, AtlasNoTrans, N, K, *alpha, A, lda, beta, C, ldc); }
void Cgemm(const enum ATLAS_TRANS TA, const enum ATLAS_TRANS TB, const int M, const int N, const int K, const SCALAR alpha, const TYPE *A, const int lda, const TYPE *B, const int ldb, const SCALAR beta, TYPE *C, const int ldc) /* * Error checks have been done by interface routine */ { if (!M || !N) return; /* quick return */ if ( SCALAR_IS_ZERO(alpha) || !K) { #ifdef TREAL if (beta == ATL_rzero) Mjoin(PATL,gezero)(M, N, C, ldc); else if (beta != ATL_rone) Mjoin(PATL,gescal_bX)(M, N, beta, C, ldc); #else if (beta[1] == ATL_rzero) { if (*beta == ATL_rzero) Mjoin(PATL,gezero)(M, N, C, ldc); else if (*beta != ATL_rone) Mjoin(PATL,gescal_bXi0)(M, N, beta, C, ldc); } else Mjoin(PATL,gescal_bX)(M, N, beta, C, ldc); #endif return; } if (TA == AtlasNoTrans) { if (TB == AtlasNoTrans) CgemmNN(M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); #ifdef TCPLX else if (TB == AtlasConjTrans) CgemmNC(M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); #endif else CgemmNT(M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); } #ifdef TCPLX else if (TA == AtlasConjTrans) { if (TB == AtlasNoTrans) CgemmCN(M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); else if (TB == AtlasConjTrans) CgemmCC(M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); else CgemmCT(M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); } #endif else { if (TB == AtlasNoTrans) CgemmTN(M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); #ifdef TCPLX else if (TB == AtlasConjTrans) CgemmTC(M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); #endif else CgemmTT(M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); } }