/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: ./benchmarks/Benchmark_dwf.cc Copyright (C) 2015 Author: Peter Boyle Author: paboyle This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ #include #ifdef GRID_CUDA #define CUDA_PROFILE #endif #ifdef CUDA_PROFILE #include #endif using namespace std; using namespace Grid; //////////////////////// /// Move to domains //// //////////////////////// Gamma::Algebra Gmu [] = { Gamma::Algebra::GammaX, Gamma::Algebra::GammaY, Gamma::Algebra::GammaZ, Gamma::Algebra::GammaT }; void Benchmark(int Ls, Coordinate Dirichlet); int main (int argc, char ** argv) { Grid_init(&argc,&argv); int threads = GridThread::GetThreads(); int Ls=16; for(int i=0;i> Ls; } } ////////////////// // With comms ////////////////// Coordinate Dirichlet(Nd+1,0); std::cout << "\n\n\n\n\n\n" <1 ? 1 : 0; // Dirichlet[0] = 0; // Dirichlet[1] = CommDim[0]*latt4[0]/mpi[0] * shm[0]; // Dirichlet[2] = CommDim[1]*latt4[1]/mpi[1] * shm[1]; // Dirichlet[3] = CommDim[2]*latt4[2]/mpi[2] * shm[2]; // Dirichlet[4] = CommDim[3]*latt4[3]/mpi[3] * shm[3]; Benchmark(Ls,Dirichlet); std::cout << "\n\n\n\n\n\n" <1 ? 1 : 0; // Dirichlet[0] = 0; // Dirichlet[1] = CommDim[0]*latt4[0]/mpi[0]; // Dirichlet[2] = CommDim[1]*latt4[1]/mpi[1]; // Dirichlet[3] = CommDim[2]*latt4[2]/mpi[2]; // Dirichlet[4] = CommDim[3]*latt4[3]/mpi[3]; Benchmark(Ls,Dirichlet); Grid_finalize(); exit(0); } void Benchmark(int Ls, Coordinate Dirichlet) { Coordinate latt4 = GridDefaultLatt(); GridLogLayout(); long unsigned int single_site_flops = 8*Nc*(7+16*Nc); std::vector seeds4({1,2,3,4}); std::vector seeds5({5,6,7,8}); #define SINGLE #ifdef SINGLE typedef vComplexF Simd; typedef LatticeFermionF FermionField; typedef LatticeGaugeFieldF GaugeField; typedef LatticeColourMatrixF ColourMatrixField; typedef DomainWallFermionF FermionAction; #endif #ifdef DOUBLE typedef vComplexD Simd; typedef LatticeFermionD FermionField; typedef LatticeGaugeFieldD GaugeField; typedef LatticeColourMatrixD ColourMatrixField; typedef DomainWallFermionD FermionAction; #endif #ifdef DOUBLE2 typedef vComplexD2 Simd; typedef LatticeFermionD2 FermionField; typedef LatticeGaugeFieldD2 GaugeField; typedef LatticeColourMatrixD2 ColourMatrixField; typedef DomainWallFermionD2 FermionAction; #endif GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,Simd::Nsimd()),GridDefaultMpi()); GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid); std::cout << GridLogMessage << "Initialising 4d RNG" << std::endl; GridParallelRNG RNG4(UGrid); RNG4.SeedUniqueString(std::string("The 4D RNG")); std::cout << GridLogMessage << "Initialising 5d RNG" << std::endl; GridParallelRNG RNG5(FGrid); RNG5.SeedUniqueString(std::string("The 5D RNG")); FermionField src (FGrid); random(RNG5,src); #if 0 src = Zero(); { Coordinate origin({0,0,0,latt4[2]-1,0}); SpinColourVectorF tmp; tmp=Zero(); tmp()(0)(0)=Complex(-2.0,0.0); std::cout << " source site 0 " << tmp<::HotConfiguration(RNG4,Umu); // SU::ColdConfiguration(Umu); UmuCopy=Umu; std::cout << GridLogMessage << "Random gauge initialised " << std::endl; //////////////////////////////////// // Apply BCs //////////////////////////////////// Coordinate Block(4); for(int d=0;d<4;d++) Block[d]= Dirichlet[d+1]; std::cout << GridLogMessage << "Applying BCs for Dirichlet Block5 " << Dirichlet << std::endl; std::cout << GridLogMessage << "Applying BCs for Dirichlet Block4 " << Block << std::endl; DirichletFilter Filter(Block); Filter.applyFilter(Umu); //////////////////////////////////// // Naive wilson implementation //////////////////////////////////// std::vector U(4,UGrid); for(int mu=0;mu(Umu,mu); } std::cout << GridLogMessage << "Setting up Cshift based reference " << std::endl; if (1) { ref = Zero(); for(int mu=0;muoSites();ss++){ for(int s=0;soSites();ss++){ for(int s=0;s_Nprocessors; RealD NN = UGrid->NodeCount(); std::cout << GridLogMessage<< "*****************************************************************" <Barrier(); Dw.Dhop(src,result,0); std::cout<Barrier(); double volume=Ls; for(int mu=0;mu1.0e-4) ) { std::cout<Barrier(); std::cout<Barrier(); exit(-1); } assert (n2e< 1.0e-4 ); } if (1) { // Naive wilson dag implementation ref = Zero(); for(int mu=0;muoSites();ss++){ for(int s=0;soSites();ss++){ for(int s=0;sBarrier(); Dw.DhopEO(src_o,r_e,DaggerNo); double t0=usecond(); for(int i=0;iBarrier(); double volume=Ls; for(int mu=0;mu