void Mjoin(Mjoin(PATL,symmR),UploNM) (const int M, const int N, const void *valpha, const void *A, const int lda, const void *B, const int ldb, const void *vbeta, void *C, const int ldc) { #ifdef TREAL const SCALAR alpha=*( (const SCALAR *)valpha ); const SCALAR beta =*( (const SCALAR *)vbeta ); const SCALAR one=1.0; #else #define alpha valpha #define beta vbeta #endif void *va; TYPE *a; if (M > SYMM_Xover) { va = malloc(ATL_Cachelen + ATL_MulBySize(N)*N); ATL_assert(va); a = ATL_AlignPtr(va); #ifdef TREAL if ( SCALAR_IS_ONE(alpha) ) Mjoin(Mjoin(Mjoin(PATL,sycopy),UploNM),_a1)(N, alpha, A, lda, a); else Mjoin(Mjoin(Mjoin(PATL,sycopy),UploNM),_aX)(N, alpha, A, lda, a); CgemmNN(M, N, N, one, B, ldb, a, N, beta, C, ldc); #else Mjoin(Mjoin(PATL,sycopy),UploNM)(N, A, lda, a); CgemmNN(M, N, N, valpha, B, ldb, a, N, vbeta, C, ldc); #endif free(va); } else Mjoin(PATL,refsymm)(AtlasRight, Uplo_, M, N, alpha, A, lda, B, ldb, 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); } }