mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 14:04:32 +00:00 
			
		
		
		
	physical fermion interface, cshift benchmark in SU3.
This commit is contained in:
		@@ -35,7 +35,8 @@ using namespace Grid::QCD;
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
#define LMAX (64)
 | 
			
		||||
#define LMAX (40)
 | 
			
		||||
#define LINC (4)
 | 
			
		||||
 | 
			
		||||
  int64_t Nloop=20;
 | 
			
		||||
 | 
			
		||||
@@ -51,7 +52,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl;
 | 
			
		||||
 | 
			
		||||
  for(int lat=2;lat<=LMAX;lat+=2){
 | 
			
		||||
  for(int lat=2;lat<=LMAX;lat+=LINC){
 | 
			
		||||
 | 
			
		||||
      std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]});
 | 
			
		||||
      int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3];
 | 
			
		||||
@@ -83,7 +84,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl;
 | 
			
		||||
 | 
			
		||||
  for(int lat=2;lat<=LMAX;lat+=2){
 | 
			
		||||
  for(int lat=2;lat<=LMAX;lat+=LINC){
 | 
			
		||||
 | 
			
		||||
      std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]});
 | 
			
		||||
      int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3];
 | 
			
		||||
@@ -114,7 +115,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl;
 | 
			
		||||
 | 
			
		||||
  for(int lat=2;lat<=LMAX;lat+=2){
 | 
			
		||||
  for(int lat=2;lat<=LMAX;lat+=LINC){
 | 
			
		||||
 | 
			
		||||
      std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]});
 | 
			
		||||
      int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3];
 | 
			
		||||
@@ -145,7 +146,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl;
 | 
			
		||||
 | 
			
		||||
  for(int lat=2;lat<=LMAX;lat+=2){
 | 
			
		||||
  for(int lat=2;lat<=LMAX;lat+=LINC){
 | 
			
		||||
 | 
			
		||||
      std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]});
 | 
			
		||||
      int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3];
 | 
			
		||||
@@ -170,5 +171,38 @@ int main (int argc, char ** argv)
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage << "===================================================================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "= Benchmarking SU3xSU3  CovShiftForward(z,x,y)"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "===================================================================================================="<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl;
 | 
			
		||||
 | 
			
		||||
  for(int lat=2;lat<=LMAX;lat+=LINC){
 | 
			
		||||
 | 
			
		||||
      std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]});
 | 
			
		||||
      int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3];
 | 
			
		||||
 | 
			
		||||
      GridCartesian     Grid(latt_size,simd_layout,mpi_layout);
 | 
			
		||||
      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
 | 
			
		||||
 | 
			
		||||
      LatticeColourMatrix z(&Grid); random(pRNG,z);
 | 
			
		||||
      LatticeColourMatrix x(&Grid); random(pRNG,x);
 | 
			
		||||
      LatticeColourMatrix y(&Grid); random(pRNG,y);
 | 
			
		||||
 | 
			
		||||
      for(int mu=0;mu<=4;mu++){
 | 
			
		||||
	double start=usecond();
 | 
			
		||||
	for(int64_t i=0;i<Nloop;i++){
 | 
			
		||||
	  z = PeriodicBC::CovShiftForward(x,mu,y);
 | 
			
		||||
	}
 | 
			
		||||
	double stop=usecond();
 | 
			
		||||
	double time = (stop-start)/Nloop*1000.0;
 | 
			
		||||
	
 | 
			
		||||
	double bytes=3*vol*Nc*Nc*sizeof(Complex);
 | 
			
		||||
	double flops=Nc*Nc*(8+8+8)*vol;
 | 
			
		||||
	std::cout<<GridLogMessage<<std::setprecision(3) << lat<<"\t\t"<<bytes<<"   \t\t"<<bytes/time<<"\t\t" << flops/time<<std::endl;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -52,6 +52,35 @@ namespace QCD {
 | 
			
		||||
 { 
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////////
 | 
			
		||||
// Physical surface field utilities
 | 
			
		||||
///////////////////////////////////////////////////////////////
 | 
			
		||||
template<class Impl>  
 | 
			
		||||
void CayleyFermion5D<Impl>::ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d)
 | 
			
		||||
{
 | 
			
		||||
  int Ls = this->Ls;
 | 
			
		||||
  FermionField tmp(this->FermionGrid());
 | 
			
		||||
  tmp = solution5d;
 | 
			
		||||
  conformable(solution5d._grid,this->FermionGrid());
 | 
			
		||||
  conformable(exported4d._grid,this->GaugeGrid());
 | 
			
		||||
  axpby_ssp_pminus(tmp, 0., solution5d, 1., solution5d, 0, 0);
 | 
			
		||||
  axpby_ssp_pplus (tmp, 1., tmp       , 1., solution5d, 0, Ls-1);
 | 
			
		||||
  ExtractSlice(exported4d, tmp, 0, 0);
 | 
			
		||||
}
 | 
			
		||||
template<class Impl>  
 | 
			
		||||
void CayleyFermion5D<Impl>::ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d)
 | 
			
		||||
{
 | 
			
		||||
  int Ls = this->Ls;
 | 
			
		||||
  FermionField tmp(this->FermionGrid());
 | 
			
		||||
  conformable(imported5d._grid,this->FermionGrid());
 | 
			
		||||
  conformable(input4d._grid   ,this->GaugeGrid());
 | 
			
		||||
  tmp = zero;
 | 
			
		||||
  InsertSlice(input4d, tmp, 0   , 0);
 | 
			
		||||
  InsertSlice(input4d, tmp, Ls-1, 0);
 | 
			
		||||
  axpby_ssp_pplus (tmp, 0., tmp, 1., tmp, 0, 0);
 | 
			
		||||
  axpby_ssp_pminus(tmp, 0., tmp, 1., tmp, Ls-1, Ls-1);
 | 
			
		||||
  Dminus(tmp,imported5d);
 | 
			
		||||
}
 | 
			
		||||
template<class Impl>  
 | 
			
		||||
void CayleyFermion5D<Impl>::Dminus(const FermionField &psi, FermionField &chi)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -83,8 +83,13 @@ namespace Grid {
 | 
			
		||||
      virtual void   M5D   (const FermionField &psi, FermionField &chi);
 | 
			
		||||
      virtual void   M5Ddag(const FermionField &psi, FermionField &chi);
 | 
			
		||||
 | 
			
		||||
      ///////////////////////////////////////////////////////////////
 | 
			
		||||
      // Physical surface field utilities
 | 
			
		||||
      ///////////////////////////////////////////////////////////////
 | 
			
		||||
      virtual void   Dminus(const FermionField &psi, FermionField &chi);
 | 
			
		||||
      virtual void   DminusDag(const FermionField &psi, FermionField &chi);
 | 
			
		||||
      virtual void ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d);
 | 
			
		||||
      virtual void ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d);
 | 
			
		||||
 | 
			
		||||
      /////////////////////////////////////////////////////
 | 
			
		||||
      // Instantiate different versions depending on Impl
 | 
			
		||||
 
 | 
			
		||||
@@ -128,6 +128,19 @@ namespace Grid {
 | 
			
		||||
                                       std::vector<Real> mom,
 | 
			
		||||
                                       unsigned int tmin, 
 | 
			
		||||
                                       unsigned int tmax)=0;
 | 
			
		||||
      ///////////////////////////////////////////////
 | 
			
		||||
      // Physical field import/export
 | 
			
		||||
      ///////////////////////////////////////////////
 | 
			
		||||
      virtual void Dminus(const FermionField &psi, FermionField &chi)    { chi=psi; }
 | 
			
		||||
      virtual void DminusDag(const FermionField &psi, FermionField &chi) { chi=psi; }
 | 
			
		||||
      virtual void ImportPhysicalFermionSource(const FermionField &input,FermionField &imported)
 | 
			
		||||
      {
 | 
			
		||||
	imported = input;
 | 
			
		||||
      };
 | 
			
		||||
      virtual void ExportPhysicalFermionSolution(const FermionField &solution,FermionField &exported)
 | 
			
		||||
      {
 | 
			
		||||
	exported=solution;
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user