本文整理匯總了C++中DistMatrix類的典型用法代碼示例。如果您正苦於以下問題:C++ DistMatrix類的具體用法?C++ DistMatrix怎麽用?C++ DistMatrix使用的例子?那麽, 這裏精選的類代碼示例或許可以為您提供幫助。
在下文中一共展示了DistMatrix類的6個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的C++代碼示例。
示例1: InfinityNorm
void TestCorrectness
( UpperOrLower uplo,
const DistMatrix<F>& A,
const DistMatrix<F,STAR,STAR>& t,
DistMatrix<F>& AOrig,
bool print,
bool display )
{
typedef Base<F> Real;
const Grid& g = A.Grid();
const Int n = AOrig.Height();
const Real infNormAOrig = InfinityNorm( AOrig );
const Real frobNormAOrig = FrobeniusNorm( AOrig );
if( g.Rank() == 0 )
Output("Testing error...");
// Set H to the appropriate Hessenberg portion of A
DistMatrix<F> H( A );
if( uplo == LOWER )
MakeTrapezoidal( LOWER, H, 1 );
else
MakeTrapezoidal( UPPER, H, -1 );
if( print )
Print( H, "Hessenberg" );
if( display )
Display( H, "Hessenberg" );
if( print || display )
{
DistMatrix<F> Q(g);
Identity( Q, n, n );
hessenberg::ApplyQ( LEFT, uplo, NORMAL, A, t, Q );
if( print )
Print( Q, "Q" );
if( display )
Display( Q, "Q" );
}
// Reverse the accumulated Householder transforms
hessenberg::ApplyQ( LEFT, uplo, ADJOINT, A, t, AOrig );
hessenberg::ApplyQ( RIGHT, uplo, NORMAL, A, t, AOrig );
if( print )
Print( AOrig, "Manual Hessenberg" );
if( display )
Display( AOrig, "Manual Hessenberg" );
// Compare the appropriate portion of AOrig and B
if( uplo == LOWER )
MakeTrapezoidal( LOWER, AOrig, 1 );
else
MakeTrapezoidal( UPPER, AOrig, -1 );
H -= AOrig;
if( print )
Print( H, "Error in rotated Hessenberg" );
if( display )
Display( H, "Error in rotated Hessenberg" );
const Real infNormError = InfinityNorm( H );
const Real frobNormError = FrobeniusNorm( H );
if( g.Rank() == 0 )
Output
(" ||A||_oo = ",infNormAOrig,"\n",
" ||A||_F = ",frobNormAOrig,"\n",
" ||H - Q^H A Q||_oo = ",infNormError,"\n",
" ||H - Q^H A Q||_F = ",frobNormError);
}
示例2: logic_error
// Reduce across depth to get end result C
void SumContributions
( mpi::Comm& depthComm,
const DistMatrix<double,MC,MR>& APartial,
DistMatrix<double,MC,MR>& A )
{
const int rank = mpi::CommRank( mpi::COMM_WORLD );
const Grid& meshGrid = APartial.Grid();
A.Empty();
A.AlignWith( APartial );
A.ResizeTo( APartial.Height(), APartial.Width() );
if( APartial.LocalHeight() != APartial.LocalLDim() )
throw std::logic_error
("APartial did not have matching local height/ldim");
if( A.LocalHeight() != A.LocalLDim() )
throw std::logic_error("A did not have matching local height/ldim");
const int dataSize = APartial.LocalHeight()*APartial.LocalWidth();
mpi::AllReduce
( APartial.LockedLocalBuffer(), A.LocalBuffer(), dataSize,
mpi::SUM, depthComm );
}
示例3: PushCallStack
inline void HermitianSVD
( UpperOrLower uplo,
DistMatrix<F>& A, DistMatrix<typename Base<F>::type,VR,STAR>& s,
DistMatrix<F>& U, DistMatrix<F>& V )
{
#ifndef RELEASE
PushCallStack("HermitianSVD");
#endif
typedef typename Base<F>::type R;
// Grab an eigenvalue decomposition of A
HermitianEig( uplo, A, s, V );
// Redistribute the singular values into an [MR,* ] distribution
const Grid& grid = A.Grid();
DistMatrix<R,MR,STAR> s_MR_STAR( grid );
s_MR_STAR.AlignWith( V );
s_MR_STAR = s;
// Set the singular values to the absolute value of the eigenvalues
const int numLocalVals = s.LocalHeight();
for( int iLocal=0; iLocal<numLocalVals; ++iLocal )
{
const R sigma = s.GetLocal(iLocal,0);
s.SetLocal(iLocal,0,Abs(sigma));
}
// Copy V into U (flipping the sign as necessary)
U.AlignWith( V );
U.ResizeTo( V.Height(), V.Width() );
const int localHeight = V.LocalHeight();
const int localWidth = V.LocalWidth();
for( int jLocal=0; jLocal<localWidth; ++jLocal )
{
const R sigma = s_MR_STAR.GetLocal( jLocal, 0 );
F* UCol = U.LocalBuffer( 0, jLocal );
const F* VCol = V.LockedLocalBuffer( 0, jLocal );
if( sigma >= 0 )
for( int iLocal=0; iLocal<localHeight; ++iLocal )
UCol[iLocal] = VCol[iLocal];
else
for( int iLocal=0; iLocal<localHeight; ++iLocal )
UCol[iLocal] = -VCol[iLocal];
}
#ifndef RELEASE
PopCallStack();
#endif
}
示例4: MemZero
/*
* Distributes A in such a way that
* Layer 0 <- A(0:(m/h - 1), :)
* Layer 1 <- A((m/h):(2m/h - 1), :)
* .
* .
* .
* Layer h-1 <- A(((h-1)m/h):m, :)
*/
void DistributeRows
( const mpi::Comm& depthComm,
const DistMatrix<double,MC,MR>& A,
DistMatrix<double,MC,MR>& B )
{
const int rank = mpi::CommRank( mpi::COMM_WORLD );
const int depthRank = mpi::CommRank( depthComm );
const int depthSize = mpi::CommSize( depthComm );
const Grid& meshGrid = A.Grid();
const int meshSize = meshGrid.Size();
const int sendCount = A.LocalHeight()*A.LocalWidth();
const int recvCount = sendCount / depthSize;
// Have the root mesh pack the data for scattering
std::vector<double> sendBuf;
const int blockSize = A.Height() / depthSize;
if( depthRank == 0 )
{
sendBuf.resize( sendCount );
MemZero( &sendBuf[0], sendCount ); // TODO: Is this necessary?!?
DistMatrix<double,MC,MR>
AT(meshGrid), A0(meshGrid),
AB(meshGrid), A1(meshGrid),
A2(meshGrid);
// Pack rows block by block for each layer
LockedPartitionDown
( A, AT,
AB, 0 );
for( int i=0; i<depthSize; ++i )
{
LockedRepartitionDown
( AT, A0,
/**/ /**/
A1,
AB, A2, blockSize );
const int dataSize = A1.LocalWidth()*A1.LocalHeight();
const int offset = i*dataSize;
// TODO: Avoid the extra copy...
DistMatrix<double,MC,MR> A1Contig( A1 );
MemCopy
( &(sendBuf[offset]), A1Contig.LockedLocalBuffer(), dataSize );
SlideLockedPartitionDown
( AT, A0,
A1,
/**/ /**/
AB, A2 );
}
}
// Scatter the packed data
std::vector<double> recvBuf( recvCount );
mpi::Scatter
( &sendBuf[0], recvCount, &recvBuf[0], recvCount, 0, depthComm );
// Pad received data by zero
DistMatrix<double,MC,MR>
dataBlock( blockSize, A.Width(), 0, 0, &recvBuf[0],
blockSize/meshGrid.Height(), meshGrid );
// TODO: We can probably heavily simplify this...
//
// dataBlock_T <- transpose(dataBlock)
// tmp_T <- padWithZeros(dataBlockT)
// tmp <- transpose(tmp_T)
// Layer x <- M((x*Mm/h):((x+1)*Mm/h - 1), :)
DistMatrix<double,MC,MR> dataBlockTrans( meshGrid );
Transpose( dataBlock, dataBlockTrans );
std::vector<double> newData( sendCount );
MemZero( &newData[0], sendCount );
const int offset = depthRank*recvCount;
MemCopy
( &(newData[offset]), dataBlockTrans.LockedLocalBuffer(), recvCount );
DistMatrix<double,MC,MR>
tmpTrans
( A.Width(), A.Height(), 0, 0, &newData[0],
A.Width()/meshGrid.Width(), meshGrid );
DistMatrix<double,MC,MR> tmp( meshGrid );
Transpose( tmpTrans, tmp );
Transpose( tmpTrans, B );
}
示例5: PushCallStack
inline void
SymmRUC
( T alpha, const DistMatrix<T>& A, const DistMatrix<T>& B,
T beta, DistMatrix<T>& C,
bool conjugate=false )
{
#ifndef RELEASE
PushCallStack("internal::SymmRUC");
if( A.Grid() != B.Grid() || B.Grid() != C.Grid() )
throw std::logic_error("{A,B,C} must be distributed on the same grid");
#endif
const Grid& g = A.Grid();
const Orientation orientation = ( conjugate ? ADJOINT : TRANSPOSE );
// Matrix views
DistMatrix<T>
ATL(g), ATR(g), A00(g), A01(g), A02(g), AColPan(g),
ABL(g), ABR(g), A10(g), A11(g), A12(g), ARowPan(g),
A20(g), A21(g), A22(g);
DistMatrix<T> BL(g), BR(g),
B0(g), B1(g), B2(g);
DistMatrix<T> CL(g), CR(g),
C0(g), C1(g), C2(g),
CLeft(g), CRight(g);
// Temporary distributions
DistMatrix<T,MC, STAR> B1_MC_STAR(g);
DistMatrix<T,VR, STAR> AColPan_VR_STAR(g);
DistMatrix<T,STAR,MR > AColPanTrans_STAR_MR(g);
DistMatrix<T,MR, STAR> ARowPanTrans_MR_STAR(g);
B1_MC_STAR.AlignWith( C );
// Start the algorithm
Scale( beta, C );
LockedPartitionDownDiagonal
( A, ATL, ATR,
ABL, ABR, 0 );
LockedPartitionRight( B, BL, BR, 0 );
PartitionRight( C, CL, CR, 0 );
while( CR.Width() > 0 )
{
LockedRepartitionDownDiagonal
( ATL, /**/ ATR, A00, /**/ A01, A02,
/*************/ /******************/
/**/ A10, /**/ A11, A12,
ABL, /**/ ABR, A20, /**/ A21, A22 );
LockedRepartitionRight
( BL, /**/ BR,
B0, /**/ B1, B2 );
RepartitionRight
( CL, /**/ CR,
C0, /**/ C1, C2 );
LockedView1x2( ARowPan, A11, A12 );
LockedView2x1
( AColPan, A01,
A11 );
View1x2( CLeft, C0, C1 );
View1x2( CRight, C1, C2 );
AColPan_VR_STAR.AlignWith( CLeft );
AColPanTrans_STAR_MR.AlignWith( CLeft );
ARowPanTrans_MR_STAR.AlignWith( CRight );
//--------------------------------------------------------------------//
B1_MC_STAR = B1;
AColPan_VR_STAR = AColPan;
AColPanTrans_STAR_MR.TransposeFrom( AColPan_VR_STAR, conjugate );
ARowPanTrans_MR_STAR.TransposeFrom( ARowPan, conjugate );
MakeTriangular( LOWER, ARowPanTrans_MR_STAR );
MakeTrapezoidal( RIGHT, LOWER, -1, AColPanTrans_STAR_MR );
LocalGemm
( NORMAL, orientation,
alpha, B1_MC_STAR, ARowPanTrans_MR_STAR, T(1), CRight );
LocalGemm
( NORMAL, NORMAL,
alpha, B1_MC_STAR, AColPanTrans_STAR_MR, T(1), CLeft );
//--------------------------------------------------------------------//
AColPan_VR_STAR.FreeAlignments();
AColPanTrans_STAR_MR.FreeAlignments();
ARowPanTrans_MR_STAR.FreeAlignments();
SlideLockedPartitionDownDiagonal
( ATL, /**/ ATR, A00, A01, /**/ A02,
/**/ A10, A11, /**/ A12,
/*************/ /******************/
ABL, /**/ ABR, A20, A21, /**/ A22 );
SlideLockedPartitionRight
( BL, /**/ BR,
B0, B1, /**/ B2 );
SlidePartitionRight
( CL, /**/ CR,
//.........這裏部分代碼省略.........
示例6: entry
inline void
RUVB
( Conjugation conjugation, int offset,
const DistMatrix<Complex<R> >& H,
const DistMatrix<Complex<R>,MD,STAR>& t,
DistMatrix<Complex<R> >& A )
{
#ifndef RELEASE
CallStackEntry entry("apply_packed_reflectors::RUVB");
if( H.Grid() != t.Grid() || t.Grid() != A.Grid() )
throw std::logic_error
("{H,t,A} must be distributed over the same grid");
if( offset < 0 || offset > H.Height() )
throw std::logic_error("Transforms out of bounds");
if( H.Height() != A.Width() )
throw std::logic_error
("Height of transforms must equal width of target matrix");
if( t.Height() != H.DiagonalLength( offset ) )
throw std::logic_error("t must be the same length as H's offset diag");
if( !t.AlignedWithDiagonal( H, offset ) )
throw std::logic_error("t must be aligned with H's 'offset' diagonal");
#endif
typedef Complex<R> C;
const Grid& g = H.Grid();
DistMatrix<C>
HTL(g), HTR(g), H00(g), H01(g), H02(g), HPan(g), HPanCopy(g),
HBL(g), HBR(g), H10(g), H11(g), H12(g),
H20(g), H21(g), H22(g);
DistMatrix<C> ALeft(g);
DistMatrix<C,MD,STAR>
tT(g), t0(g),
tB(g), t1(g),
t2(g);
DistMatrix<C,VC, STAR> HPan_VC_STAR(g);
DistMatrix<C,MR, STAR> HPan_MR_STAR(g);
DistMatrix<C,STAR,STAR> t1_STAR_STAR(g);
DistMatrix<C,STAR,STAR> SInv_STAR_STAR(g);
DistMatrix<C,STAR,MC > ZAdj_STAR_MC(g);
DistMatrix<C,STAR,VC > ZAdj_STAR_VC(g);
LockedPartitionUpDiagonal
( H, HTL, HTR,
HBL, HBR, 0 );
LockedPartitionUp
( t, tT,
tB, 0 );
while( HBR.Height() < H.Height() && HBR.Width() < H.Width() )
{
LockedRepartitionUpDiagonal
( HTL, /**/ HTR, H00, H01, /**/ H02,
/**/ H10, H11, /**/ H12,
/*************/ /******************/
HBL, /**/ HBR, H20, H21, /**/ H22 );
const int HPanHeight = H01.Height() + H11.Height();
const int HPanOffset =
std::min( H11.Width(), std::max(offset-H00.Width(),0) );
const int HPanWidth = H11.Width()-HPanOffset;
LockedView( HPan, H, 0, H00.Width()+HPanOffset, HPanHeight, HPanWidth );
LockedRepartitionUp
( tT, t0,
t1,
/**/ /**/
tB, t2, HPanWidth );
View( ALeft, A, 0, 0, A.Height(), HPanHeight );
HPan_MR_STAR.AlignWith( ALeft );
ZAdj_STAR_MC.AlignWith( ALeft );
ZAdj_STAR_VC.AlignWith( ALeft );
//--------------------------------------------------------------------//
HPanCopy = HPan;
MakeTrapezoidal( RIGHT, UPPER, offset, HPanCopy );
SetDiagonal( RIGHT, offset, HPanCopy, C(1) );
HPan_VC_STAR = HPanCopy;
Zeros( SInv_STAR_STAR, HPan.Width(), HPan.Width() );
Herk
( LOWER, ADJOINT,
C(1), HPan_VC_STAR.LockedMatrix(),
C(0), SInv_STAR_STAR.Matrix() );
SInv_STAR_STAR.SumOverGrid();
t1_STAR_STAR = t1;
FixDiagonal( conjugation, t1_STAR_STAR, SInv_STAR_STAR );
HPan_MR_STAR = HPan_VC_STAR;
LocalGemm( ADJOINT, ADJOINT, C(1), HPan_MR_STAR, ALeft, ZAdj_STAR_MC );
ZAdj_STAR_VC.SumScatterFrom( ZAdj_STAR_MC );
LocalTrsm
( LEFT, LOWER, ADJOINT, NON_UNIT, C(1), SInv_STAR_STAR, ZAdj_STAR_VC );
ZAdj_STAR_MC = ZAdj_STAR_VC;
LocalGemm
( ADJOINT, ADJOINT, C(-1), ZAdj_STAR_MC, HPan_MR_STAR, C(1), ALeft );
//--------------------------------------------------------------------//
HPan_MR_STAR.FreeAlignments();
//.........這裏部分代碼省略.........