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 );
}
Exemple #5
0
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 );
    }
}