void AdjointAxpyContract ( T alpha, const BlockMatrix<T>& A, BlockMatrix<T>& B ) { EL_DEBUG_CSE TransposeAxpyContract( alpha, A, B, true ); }
void AdjointAxpyContract ( T alpha, const ElementalMatrix<T>& A, ElementalMatrix<T>& B ) { EL_DEBUG_CSE TransposeAxpyContract( alpha, A, B, true ); }
void AdjointAxpyContract ( T alpha, const AbstractBlockDistMatrix<T>& A, AbstractBlockDistMatrix<T>& B ) { DEBUG_ONLY(CallStackEntry cse("AdjointAxpyContract")) TransposeAxpyContract( alpha, A, B, true ); }
void AdjointAxpyContract ( T alpha, const AbstractDistMatrix<T>& A, AbstractDistMatrix<T>& B ) { DEBUG_ONLY(CSE cse("AdjointAxpyContract")) TransposeAxpyContract( alpha, A, B, true ); }
void SUMMA_TNB ( Orientation orientA, T alpha, const AbstractDistMatrix<T>& APre, const AbstractDistMatrix<T>& BPre, AbstractDistMatrix<T>& CPre ) { DEBUG_CSE const Int m = CPre.Height(); const Int bsize = Blocksize(); const Grid& g = APre.Grid(); const bool conjugate = ( orientA == ADJOINT ); DistMatrixReadProxy<T,T,MC,MR> AProx( APre ); DistMatrixReadProxy<T,T,MC,MR> BProx( BPre ); DistMatrixReadWriteProxy<T,T,MC,MR> CProx( CPre ); auto& A = AProx.GetLocked(); auto& B = BProx.GetLocked(); auto& C = CProx.Get(); // Temporary distributions DistMatrix<T,MC,STAR> A1_MC_STAR(g); DistMatrix<T,MR,STAR> D1Trans_MR_STAR(g); A1_MC_STAR.AlignWith( B ); D1Trans_MR_STAR.AlignWith( B ); for( Int k=0; k<m; k+=bsize ) { const Int nb = Min(bsize,m-k); auto A1 = A( ALL, IR(k,k+nb) ); auto C1 = C( IR(k,k+nb), ALL ); // D1[*,MR] := alpha (A1[MC,*])^[T/H] B[MC,MR] // = alpha (A1^[T/H])[*,MC] B[MC,MR] A1_MC_STAR = A1; // A1[MC,*] <- A1[MC,MR] LocalGemm( orientA, NORMAL, T(1), B, A1_MC_STAR, D1Trans_MR_STAR ); TransposeAxpyContract( alpha, D1Trans_MR_STAR, C1, conjugate ); } }