From cfe3cd76d1543d1f13b3b53c6b029f154347cc1a Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Mon, 19 Jun 2017 14:04:21 +0100 Subject: [PATCH] Block solver improvements --- .../iterative/BlockConjugateGradient.h | 19 +- lib/lattice/Lattice_reduction.h | 189 +++++++++++++++++- .../solver/Test_staggered_block_cg_unprec.cc | 7 +- 3 files changed, 192 insertions(+), 23 deletions(-) diff --git a/lib/algorithms/iterative/BlockConjugateGradient.h b/lib/algorithms/iterative/BlockConjugateGradient.h index d90194ae..53e11fa7 100644 --- a/lib/algorithms/iterative/BlockConjugateGradient.h +++ b/lib/algorithms/iterative/BlockConjugateGradient.h @@ -42,7 +42,7 @@ class BlockConjugateGradient : public OperatorFunction { typedef typename Field::scalar_type scomplex; - const int blockDim = 0; + int blockDim ; int Nblock; bool ErrorOnNoConverge; // throw an assert when the CG fails to converge. @@ -51,14 +51,15 @@ class BlockConjugateGradient : public OperatorFunction { Integer MaxIterations; Integer IterationsToComplete; //Number of iterations the CG took to finish. Filled in upon completion - BlockConjugateGradient(RealD tol, Integer maxit, bool err_on_no_conv = true) + BlockConjugateGradient(int _Orthog,RealD tol, Integer maxit, bool err_on_no_conv = true) : Tolerance(tol), + blockDim(_Orthog), MaxIterations(maxit), ErrorOnNoConverge(err_on_no_conv){}; void operator()(LinearOperatorBase &Linop, const Field &Src, Field &Psi) { - int Orthog = 0; // First dimension is block dim + int Orthog = blockDim; // First dimension is block dim; this is an assumption Nblock = Src._grid->_fdimensions[Orthog]; std::cout< &Linop, const Field &Src, Field &Psi) Linop.HermOp(Psi, AP); AP = AP-Src; - std::cout << GridLogMessage <<"\tTrue residual is " << std::sqrt(norm2(AP)/norm2(Src)) < { typedef typename Field::scalar_type scomplex; - const int blockDim = 0; - + int blockDim; int Nblock; bool ErrorOnNoConverge; // throw an assert when the CG fails to converge. // Defaults true. @@ -218,14 +218,15 @@ class MultiRHSConjugateGradient : public OperatorFunction { Integer MaxIterations; Integer IterationsToComplete; //Number of iterations the CG took to finish. Filled in upon completion - MultiRHSConjugateGradient(RealD tol, Integer maxit, bool err_on_no_conv = true) + MultiRHSConjugateGradient(int Orthog,RealD tol, Integer maxit, bool err_on_no_conv = true) : Tolerance(tol), + blockDim(Orthog), MaxIterations(maxit), ErrorOnNoConverge(err_on_no_conv){}; void operator()(LinearOperatorBase &Linop, const Field &Src, Field &Psi) { - int Orthog = 0; // First dimension is block dim + int Orthog = blockDim; // First dimension is block dim Nblock = Src._grid->_fdimensions[Orthog]; std::cout< &Linop, const Field &Src, Field &Psi) MatrixTimer.Stop(); // Alpha - // sliceInnerProductVectorTest(v_pAp_test,P,AP,Orthog); sliceInnerTimer.Start(); sliceInnerProductVector(v_pAp,P,AP,Orthog); sliceInnerTimer.Stop(); for(int b=0;b &R,Eigen::MatrixXcd &aa,const Lattice typedef typename vobj::vector_type vector_type; int Nblock = X._grid->GlobalDimensions()[Orthog]; - + GridBase *FullGrid = X._grid; GridBase *SliceGrid = makeSubSliceGrid(FullGrid,Orthog); - + Lattice Xslice(SliceGrid); Lattice Rslice(SliceGrid); - + +#if 0 + // R[i] = Y[i] + X[j] a(j,i) for(int i=0;i &R,Eigen::MatrixXcd &aa,const Lattice } InsertSlice(Rslice,R,i,Orthog); } +#endif +#if 0 + int nh = FullGrid->_ndimension; + int nl = SliceGrid->_ndimension; + +#pragma omp parallel +{ + + std::vector lcoor(nl); // sliced coor + std::vector hcoor(nh); // unsliced coor + std::vector s_x(Nblock); + +#pragma omp for + for(int idx=0;idxlSites();idx++){ + + SliceGrid->LocalIndexToLocalCoor(idx,lcoor); + + int ddl=0; + for(int d=0;d_simd_layout[Orthog]==1); + int nh = FullGrid->_ndimension; + int nl = SliceGrid->_ndimension; + + + //FIXME package in a convenient iterator + //Should loop over a plane orthogonal to direction "Orthog" + int stride=FullGrid->_slice_stride[Orthog]; + int block =FullGrid->_slice_block [Orthog]; + int nblock=FullGrid->_slice_nblock[Orthog]; + int ostride=FullGrid->_ostride[Orthog]; +#pragma omp parallel + { + + std::vector s_x(Nblock); + +#pragma omp for collapse(2) + for(int n=0;n static void sliceInnerProductMatrix( Eigen::MatrixXcd &mat, const Lattice &lhs,const Lattice &rhs,int Orthog) { @@ -497,7 +581,8 @@ static void sliceInnerProductMatrix( Eigen::MatrixXcd &mat, const Lattice Lattice Rslice(SliceGrid); mat = Eigen::MatrixXcd::Zero(Nblock,Nblock); - + +#if 0 for(int i=0;i mat(i,j) = innerProduct(Lslice,Rslice); } } -#undef FORCE_DIAG -#ifdef FORCE_DIAG - for(int i=0;i_ndimension; + int nl = SliceGrid->_ndimension; + +#pragma omp parallel +{ + std::vector lcoor(nl); // sliced coor + std::vector hcoor(nh); // unsliced coor + std::vector Left(Nblock); + std::vector Right(Nblock); + Eigen::MatrixXcd mat_thread = Eigen::MatrixXcd::Zero(Nblock,Nblock); + +#pragma omp for + for(int idx=0;idxlSites();idx++){ + + SliceGrid->LocalIndexToLocalCoor(idx,lcoor); + + int ddl=0; + for(int d=0;d ip = innerProduct(Left[i],Right[j]); + mat_thread(i,j) += ip; + }} + } + +#pragma omp critical + { + mat += mat_thread; + } + +} +#endif + +#if 1 + assert( FullGrid->_simd_layout[Orthog]==1); + int nh = FullGrid->_ndimension; + int nl = SliceGrid->_ndimension; + + //FIXME package in a convenient iterator + //Should loop over a plane orthogonal to direction "Orthog" + int stride=FullGrid->_slice_stride[Orthog]; + int block =FullGrid->_slice_block [Orthog]; + int nblock=FullGrid->_slice_nblock[Orthog]; + int ostride=FullGrid->_ostride[Orthog]; + + typedef typename vobj::vector_typeD vector_typeD; + +#pragma omp parallel + { + std::vector Left(Nblock); + std::vector Right(Nblock); + Eigen::MatrixXcd mat_thread = Eigen::MatrixXcd::Zero(Nblock,Nblock); + +#pragma omp for collapse(2) + for(int n=0;n HermOp(Ds); ConjugateGradient CG(1.0e-8,10000); - BlockConjugateGradient BCG(1.0e-8,10000); - MultiRHSConjugateGradient mCG(1.0e-8,10000); + int blockDim = 0; + BlockConjugateGradient BCG(blockDim,1.0e-8,10000); + MultiRHSConjugateGradient mCG(blockDim,1.0e-8,10000); std::cout << GridLogMessage << "************************************************************************ "<