inline T DotuHelper( const DistMatrix<T,U,V>& x, const DistMatrix<T,STAR,STAR>& y ) { #ifndef RELEASE PushCallStack("internal::DotuHelper"); if( x.Grid() != y.Grid() ) throw std::logic_error("{x,y} must be distributed over the same grid"); if( (x.Height() != 1 && x.Width() != 1) || (y.Height() != 1 && y.Width() != 1) ) throw std::logic_error("Dotu requires x and y to be vectors"); int xLength = ( x.Width() == 1 ? x.Height() : x.Width() ); int yLength = ( y.Width() == 1 ? y.Height() : y.Width() ); if( xLength != yLength ) throw std::logic_error("Dotu requires x and y to be the same length"); #endif const Grid& g = x.Grid(); DistMatrix<T,STAR,STAR> xRedist(g); xRedist = x; T globalDotu = Dotu( xRedist.LockedLocalMatrix(), y.LockedLocalMatrix() ); #ifndef RELEASE PopCallStack(); #endif return globalDotu; }
inline void LocalTwoSidedTrsm ( UpperOrLower uplo, UnitOrNonUnit diag, DistMatrix<F,STAR,STAR>& A, const DistMatrix<F,STAR,STAR>& B ) { #ifndef RELEASE PushCallStack("internal::LocalTwoSidedTrsm"); #endif TwoSidedTrsm( uplo, diag, A.LocalMatrix(), B.LockedLocalMatrix() ); #ifndef RELEASE PopCallStack(); #endif }
inline const DistMatrix<T,MD,STAR,Int>& DistMatrix<T,MD,STAR,Int>::operator=( const DistMatrix<T,MD,STAR,Int>& A ) { #ifndef RELEASE PushCallStack("[MD,* ] = [MD,* ]"); this->AssertNotLockedView(); this->AssertSameGrid( A ); if( this->Viewing() ) this->AssertSameSize( A ); #endif if( !this->Viewing() ) { if( !this->ConstrainedColAlignment() ) { this->diagPath_ = A.diagPath_; this->colAlignment_ = A.colAlignment_; if( this->Participating() ) this->colShift_ = A.ColShift(); } this->ResizeTo( A.Height(), A.Width() ); } if( this->diagPath_ == A.diagPath_ && this->colAlignment_ == A.colAlignment_ ) { this->localMatrix_ = A.LockedLocalMatrix(); } else { #ifdef UNALIGNED_WARNINGS if( this->Grid().Rank() == 0 ) std::cerr << "Unaligned [MD,* ] <- [MD,* ]." << std::endl; #endif throw std::logic_error ("Unaligned [MD,* ] = [MD,* ] not yet implemented"); } #ifndef RELEASE PopCallStack(); #endif return *this; }
inline T DotuHelper( const DistMatrix<T,U,V>& x, const DistMatrix<T,MC,MR>& y ) { #ifndef RELEASE PushCallStack("internal::DotuHelper"); if( x.Grid() != y.Grid() ) throw std::logic_error("{x,y} must be distributed over the same grid"); if( (x.Height() != 1 && x.Width() != 1) || (y.Height() != 1 && y.Width() != 1) ) throw std::logic_error("Dotu requires x and y to be vectors"); int xLength = ( x.Width() == 1 ? x.Height() : x.Width() ); int yLength = ( y.Width() == 1 ? y.Height() : y.Width() ); if( xLength != yLength ) throw std::logic_error("Dotu requires x and y to be the same length"); #endif const Grid& g = x.Grid(); T globalDotu; if( x.Width() == 1 && y.Width() == 1 ) { DistMatrix<T,MC,MR> xRedist(g); xRedist.AlignWith( y ); xRedist = x; int ownerCol = y.RowAlignment(); if( g.Col() == ownerCol ) { T localDotu = Dotu( xRedist.LockedLocalMatrix(), y.LockedLocalMatrix() ); mpi::AllReduce( &localDotu, &globalDotu, 1, mpi::SUM, g.ColComm() ); } mpi::Broadcast( &globalDotu, 1, ownerCol, g.RowComm() ); } else if( x.Width() == 1 ) { DistMatrix<T,MR,MC> xRedist(g); xRedist.AlignWith( y ); xRedist = x; int ownerRow = y.ColAlignment(); if( g.Row() == ownerRow ) { T localDotu = Dotu( xRedist.LockedLocalMatrix(), y.LockedLocalMatrix() ); mpi::AllReduce( &localDotu, &globalDotu, 1, mpi::SUM, g.RowComm() ); } mpi::Broadcast( &globalDotu, 1, ownerRow, g.ColComm() ); } else if( y.Width() == 1 ) { DistMatrix<T,MR,MC> xRedist(g); xRedist.AlignWith( y ); xRedist = x; int ownerCol = y.RowAlignment(); if( g.Col() == ownerCol ) { T localDotu = Dotu( xRedist.LockedLocalMatrix(), y.LockedLocalMatrix() ); mpi::AllReduce( &localDotu, &globalDotu, 1, mpi::SUM, g.ColComm() ); } mpi::Broadcast( &globalDotu, 1, ownerCol, g.RowComm() ); } else { DistMatrix<T,MC,MR> xRedist(g); xRedist.AlignWith( y ); xRedist = x; int ownerRow = y.ColAlignment(); if( g.Row() == ownerRow ) { T localDotu = Dotu( xRedist.LockedLocalMatrix(), y.LockedLocalMatrix() ); mpi::AllReduce( &localDotu, &globalDotu, 1, mpi::SUM, g.RowComm() ); } mpi::Broadcast( &globalDotu, 1, ownerRow, g.ColComm() ); } #ifndef RELEASE PopCallStack(); #endif return globalDotu; }