mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 05:54:32 +00:00 
			
		
		
		
	Reproducing CG can be more useful now
This commit is contained in:
		@@ -30,27 +30,16 @@ Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
 | 
			
		||||
template<class d>
 | 
			
		||||
struct scal {
 | 
			
		||||
  d internal;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
  Gamma::Algebra Gmu [] = {
 | 
			
		||||
    Gamma::Algebra::GammaX,
 | 
			
		||||
    Gamma::Algebra::GammaY,
 | 
			
		||||
    Gamma::Algebra::GammaZ,
 | 
			
		||||
    Gamma::Algebra::GammaT
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  char hostname[HOST_NAME_MAX+1];
 | 
			
		||||
  gethostname(hostname, HOST_NAME_MAX+1);
 | 
			
		||||
  std::string host(hostname);
 | 
			
		||||
  
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
 | 
			
		||||
  const int Ls=12;
 | 
			
		||||
 | 
			
		||||
  std::cout << GridLogMessage << "::::: NB: to enable a quick bit reproducibility check use the --checksums flag. " << std::endl;
 | 
			
		||||
 | 
			
		||||
  { 
 | 
			
		||||
  GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexD::Nsimd()),GridDefaultMpi());
 | 
			
		||||
  GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
 | 
			
		||||
  GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
 | 
			
		||||
@@ -92,7 +81,14 @@ int main (int argc, char ** argv)
 | 
			
		||||
  SchurDiagMooeeOperator<DomainWallFermionD,LatticeFermionD> HermOpEO(Ddwf);
 | 
			
		||||
  SchurDiagMooeeOperator<DomainWallFermionF,LatticeFermionF> HermOpEO_f(Ddwf_f);
 | 
			
		||||
 | 
			
		||||
  std::cout << GridLogMessage << "::::::::::::: Starting mixed CG" << std::endl;
 | 
			
		||||
  int nsecs=600;
 | 
			
		||||
  if( GridCmdOptionExists(argv,argv+argc,"--seconds") ){
 | 
			
		||||
    std::string arg = GridCmdOptionPayload(argv,argv+argc,"--seconds");
 | 
			
		||||
    GridCmdOptionInt(arg,nsecs);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  std::cout << GridLogMessage << "::::::::::::: Starting mixed CG for "<<nsecs <<" seconds" << std::endl;
 | 
			
		||||
 | 
			
		||||
  MixedPrecisionConjugateGradient<LatticeFermionD,LatticeFermionF> mCG(1.0e-8, 10000, 50, FrbGrid_f, HermOpEO_f, HermOpEO);
 | 
			
		||||
  double t1,t2,flops;
 | 
			
		||||
  double MdagMsiteflops = 1452; // Mobius (real coeffs)
 | 
			
		||||
@@ -101,7 +97,14 @@ int main (int argc, char ** argv)
 | 
			
		||||
  std:: cout << " MdagM site flops = "<< 4*MdagMsiteflops<<std::endl;
 | 
			
		||||
  std:: cout << " CG    site flops = "<< CGsiteflops <<std::endl;
 | 
			
		||||
  int iters;
 | 
			
		||||
  for(int i=0;i<10;i++){
 | 
			
		||||
 | 
			
		||||
  time_t start = time(NULL);
 | 
			
		||||
 | 
			
		||||
  uint32_t csum, csumref;
 | 
			
		||||
  csumref=0;
 | 
			
		||||
  int iter=0;
 | 
			
		||||
  do {
 | 
			
		||||
    std::cerr << "******************* SINGLE PRECISION SOLVE "<<iter<<std::endl;
 | 
			
		||||
    result_o = Zero();
 | 
			
		||||
    t1=usecond();
 | 
			
		||||
    mCG(src_o,result_o);
 | 
			
		||||
@@ -111,10 +114,28 @@ int main (int argc, char ** argv)
 | 
			
		||||
    flops+= CGsiteflops*FrbGrid->gSites()*iters;
 | 
			
		||||
    std::cout << " SinglePrecision iterations/sec "<< iters/(t2-t1)*1000.*1000.<<std::endl;
 | 
			
		||||
    std::cout << " SinglePrecision GF/s "<< flops/(t2-t1)/1000.<<std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  std::cout << GridLogMessage << "::::::::::::: Starting regular CG" << std::endl;
 | 
			
		||||
 | 
			
		||||
    csum = crc(result_o);
 | 
			
		||||
 | 
			
		||||
    if ( csumref == 0 ) {
 | 
			
		||||
      csumref = csum;
 | 
			
		||||
    } else {
 | 
			
		||||
      if ( csum != csumref ) { 
 | 
			
		||||
	std::cerr << host<<" FAILURE " <<iter <<" csum "<<std::hex<<csum<< " != "<<csumref <<std::dec<<std::endl;
 | 
			
		||||
	assert(0);
 | 
			
		||||
      } else {
 | 
			
		||||
	std::cout << host <<" OK " <<iter <<" csum "<<std::hex<<csum<<std::dec<<" -- OK! "<<std::endl;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    iter ++;
 | 
			
		||||
  } while (time(NULL) < (start + nsecs/2) );
 | 
			
		||||
    
 | 
			
		||||
  std::cout << GridLogMessage << "::::::::::::: Starting double precision CG" << std::endl;
 | 
			
		||||
  ConjugateGradient<LatticeFermionD> CG(1.0e-8,10000);
 | 
			
		||||
  for(int i=0;i<1;i++){
 | 
			
		||||
  csumref=0;
 | 
			
		||||
  int i=0;
 | 
			
		||||
  do { 
 | 
			
		||||
    std::cerr << "******************* DOUBLE PRECISION SOLVE "<<i<<std::endl;
 | 
			
		||||
    result_o_2 = Zero();
 | 
			
		||||
    t1=usecond();
 | 
			
		||||
    CG(HermOpEO,src_o,result_o_2);
 | 
			
		||||
@@ -122,46 +143,30 @@ int main (int argc, char ** argv)
 | 
			
		||||
    iters = CG.IterationsToComplete;
 | 
			
		||||
    flops = MdagMsiteflops*4*FrbGrid->gSites()*iters; 
 | 
			
		||||
    flops+= CGsiteflops*FrbGrid->gSites()*iters;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    std::cout << " DoublePrecision iterations/sec "<< iters/(t2-t1)*1000.*1000.<<std::endl;
 | 
			
		||||
    std::cout << " DoublePrecision GF/s "<< flops/(t2-t1)/1000.<<std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  //  MemoryManager::Print();
 | 
			
		||||
 | 
			
		||||
    csum = crc(result_o);
 | 
			
		||||
 | 
			
		||||
    if ( csumref == 0 ) {
 | 
			
		||||
      csumref = csum;
 | 
			
		||||
    } else {
 | 
			
		||||
      if ( csum != csumref ) { 
 | 
			
		||||
	std::cerr << i <<" csum "<<std::hex<<csum<< " != "<<csumref <<std::dec<<std::endl;
 | 
			
		||||
	assert(0);
 | 
			
		||||
      } else {
 | 
			
		||||
	std::cout << i <<" csum "<<std::hex<<csum<<std::dec<<" -- OK! "<<std::endl;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    i++;
 | 
			
		||||
  } while (time(NULL) < (start + nsecs) );
 | 
			
		||||
 | 
			
		||||
  LatticeFermionD diff_o(FrbGrid);
 | 
			
		||||
  RealD diff = axpy_norm(diff_o, -1.0, result_o, result_o_2);
 | 
			
		||||
 | 
			
		||||
  std::cout << GridLogMessage << "::::::::::::: Diff between mixed and regular CG: " << diff << std::endl;
 | 
			
		||||
 | 
			
		||||
  #ifdef HAVE_LIME
 | 
			
		||||
  if( GridCmdOptionExists(argv,argv+argc,"--checksums") ){
 | 
			
		||||
  assert(diff < 1e-4);
 | 
			
		||||
  
 | 
			
		||||
  std::string file1("./Propagator1");
 | 
			
		||||
  emptyUserRecord record;
 | 
			
		||||
  uint32_t nersc_csum;
 | 
			
		||||
  uint32_t scidac_csuma;
 | 
			
		||||
  uint32_t scidac_csumb;
 | 
			
		||||
  typedef SpinColourVectorD   FermionD;
 | 
			
		||||
  typedef vSpinColourVectorD vFermionD;
 | 
			
		||||
 | 
			
		||||
  BinarySimpleMunger<FermionD,FermionD> munge;
 | 
			
		||||
  std::string format = getFormatString<vFermionD>();
 | 
			
		||||
  
 | 
			
		||||
  BinaryIO::writeLatticeObject<vFermionD,FermionD>(result_o,file1,munge, 0, format,
 | 
			
		||||
						   nersc_csum,scidac_csuma,scidac_csumb);
 | 
			
		||||
 | 
			
		||||
  std::cout << GridLogMessage << " Mixed checksums "<<std::hex << scidac_csuma << " "<<scidac_csumb<<std::endl;
 | 
			
		||||
 | 
			
		||||
  BinaryIO::writeLatticeObject<vFermionD,FermionD>(result_o_2,file1,munge, 0, format,
 | 
			
		||||
						   nersc_csum,scidac_csuma,scidac_csumb);
 | 
			
		||||
 | 
			
		||||
  std::cout << GridLogMessage << " CG checksums "<<std::hex << scidac_csuma << " "<<scidac_csumb<<std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  #endif
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  MemoryManager::Print();
 | 
			
		||||
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user