inline void LocalTrrkKernel ( UpperOrLower uplo, T alpha, const DistMatrix<T,MC, STAR>& A, const DistMatrix<T,STAR,MR >& B, T beta, DistMatrix<T,MC, MR >& C ) { #ifndef RELEASE PushCallStack("LocalTrrkKernel"); CheckInput( A, B, C ); #endif const Grid& g = C.Grid(); DistMatrix<T,MC,STAR> AT(g), AB(g); DistMatrix<T,STAR,MR> BL(g), BR(g); DistMatrix<T,MC,MR> CTL(g), CTR(g), CBL(g), CBR(g); DistMatrix<T,MC,MR> DTL(g), DBR(g); const int half = C.Height()/2; ScaleTrapezoid( beta, LEFT, uplo, 0, C ); LockedPartitionDown ( A, AT, AB, half ); LockedPartitionRight( B, BL, BR, half ); PartitionDownDiagonal ( C, CTL, CTR, CBL, CBR, half ); DTL.AlignWith( CTL ); DBR.AlignWith( CBR ); DTL.ResizeTo( CTL.Height(), CTL.Width() ); DBR.ResizeTo( CBR.Height(), CBR.Width() ); //------------------------------------------------------------------------// if( uplo == LOWER ) internal::LocalGemm( NORMAL, NORMAL, alpha, AB, BL, T(1), CBL ); else internal::LocalGemm( NORMAL, NORMAL, alpha, AT, BR, T(1), CTR ); internal::LocalGemm( NORMAL, NORMAL, alpha, AT, BL, T(0), DTL ); AxpyTriangle( uplo, T(1), DTL, CTL ); internal::LocalGemm( NORMAL, NORMAL, alpha, AB, BR, T(0), DBR ); AxpyTriangle( uplo, T(1), DBR, CBR ); //------------------------------------------------------------------------// #ifndef RELEASE PopCallStack(); #endif }
Symbol() { refcount = 0; DBR(delegated = 0); }