diff --git a/bootstrap.sh b/bootstrap.sh index bdf748df..12d257f1 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -EIGEN_URL='http://bitbucket.org/eigen/eigen/get/3.3.3.tar.bz2' +EIGEN_URL='http://bitbucket.org/eigen/eigen/get/3.3.5.tar.bz2' echo "-- deploying Eigen source..." wget ${EIGEN_URL} --no-check-certificate && ./scripts/update_eigen.sh `basename ${EIGEN_URL}` && rm `basename ${EIGEN_URL}` diff --git a/configure.ac b/configure.ac index 819253a0..1802033f 100644 --- a/configure.ac +++ b/configure.ac @@ -480,8 +480,8 @@ GRID_LIBS=$LIBS GRID_SHORT_SHA=`git rev-parse --short HEAD` GRID_SHA=`git rev-parse HEAD` GRID_BRANCH=`git rev-parse --abbrev-ref HEAD` -AM_CXXFLAGS="-I${abs_srcdir}/include $AM_CXXFLAGS" -AM_CFLAGS="-I${abs_srcdir}/include $AM_CFLAGS" +AM_CXXFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/EigenDist/ -I${abs_srcdir}/EigenDist/unsupported $AM_CXXFLAGS" +AM_CFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/EigenDist/ -I${abs_srcdir}/EigenDist/unsupported $AM_CFLAGS" AM_LDFLAGS="-L${cwd}/lib $AM_LDFLAGS" AC_SUBST([AM_CFLAGS]) AC_SUBST([AM_CXXFLAGS]) diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp index a13336ef..2cfd6dcb 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp @@ -137,7 +137,7 @@ void TA2AMeson::execute(void) result.corr.resize(nt); int Nl = par().Nl; - int N = par().N; + int N = par().N; LOG(Message) << "N for A2A cont: " << N << std::endl; envGetTmp(std::vector, MF_x); diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.cc b/extras/Hadrons/Modules/MContraction/A2AMesonField.cc new file mode 100644 index 00000000..5867b1dd --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MContraction; + +template class Grid::Hadrons::MContraction::TA2AMesonField; +template class Grid::Hadrons::MContraction::TA2AMesonField; diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp new file mode 100644 index 00000000..8ea7d9d7 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -0,0 +1,375 @@ +#ifndef Hadrons_MContraction_A2AMesonField_hpp_ +#define Hadrons_MContraction_A2AMesonField_hpp_ + +#include +#include +#include +#include + +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * A2AMesonField * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MContraction) + +typedef std::pair GammaPair; + + +class A2AMesonFieldPar : Serializable +{ + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonFieldPar, + int, cacheBlock, + int, schurBlock, + int, N, + int, Nl, + std::string, A2A, + std::string, output); +}; + +template +class TA2AMesonField : public Module +{ + public: + FERM_TYPE_ALIASES(FImpl, ); + SOLVER_TYPE_ALIASES(FImpl, ); + + typedef A2AModesSchurDiagTwo A2ABase; + + public: + // constructor + TA2AMesonField(const std::string name); + // destructor + virtual ~TA2AMesonField(void){}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); + + // Arithmetic help. Move to Grid?? + virtual void MesonField(Eigen::Tensor &mat, + const std::vector &lhs, + const std::vector &rhs, + std::vector gammas, + const std::vector &mom, + int orthogdim) ; + +}; + +MODULE_REGISTER(A2AMesonField, ARG(TA2AMesonField), MContraction); +MODULE_REGISTER(ZA2AMesonField, ARG(TA2AMesonField), MContraction); + +/****************************************************************************** +* TA2AMesonField implementation * +******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TA2AMesonField::TA2AMesonField(const std::string name) + : Module(name) +{ +} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TA2AMesonField::getInput(void) +{ + std::vector in = {par().A2A + "_class"}; + in.push_back(par().A2A + "_w_high_4d"); + in.push_back(par().A2A + "_v_high_4d"); + + return in; +} + +template +std::vector TA2AMesonField::getOutput(void) +{ + std::vector out = {}; + + return out; +} + + +// setup /////////////////////////////////////////////////////////////////////// +template +void TA2AMesonField::setup(void) +{ + auto &a2a = envGet(A2ABase, par().A2A + "_class"); + int nt = env().getDim(Tp); + int Nl = par().Nl; + int N = par().N; + int Ls_ = env().getObjectLs(par().A2A + "_class"); + + // Four D fields + envTmp(std::vector, "w", 1, par().schurBlock, FermionField(env().getGrid(1))); + envTmp(std::vector, "v", 1, par().schurBlock, FermionField(env().getGrid(1))); + + // 5D tmp + envTmpLat(FermionField, "tmp_5d", Ls_); +} + + +////////////////////////////////////////////////////////////////////////////////// +// Cache blocked arithmetic routine +// Could move to Grid ??? +////////////////////////////////////////////////////////////////////////////////// +template +void TA2AMesonField::MesonField(Eigen::Tensor &mat, + const std::vector &lhs, + const std::vector &rhs, + std::vector gammas, + const std::vector &mom, + int orthogdim) +{ + typedef typename FImpl::SiteSpinor vobj; + + typedef typename vobj::scalar_object sobj; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + typedef iSpinMatrix SpinMatrix_v; + typedef iSpinMatrix SpinMatrix_s; + + int Lblock = lhs.size(); + int Rblock = rhs.size(); + + GridBase *grid = lhs[0]._grid; + + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); + + int Nt = grid->GlobalDimensions()[orthogdim]; + int Ngamma = gammas.size(); + int Nmom = mom.size(); + + int fd=grid->_fdimensions[orthogdim]; + int ld=grid->_ldimensions[orthogdim]; + int rd=grid->_rdimensions[orthogdim]; + + // will locally sum vectors first + // sum across these down to scalars + // splitting the SIMD + int MFrvol = rd*Lblock*Rblock*Nmom; + int MFlvol = ld*Lblock*Rblock*Nmom; + + Vector lvSum(MFrvol); + parallel_for (int r = 0; r < MFrvol; r++){ + lvSum[r] = zero; + } + + Vector lsSum(MFlvol); + parallel_for (int r = 0; r < MFlvol; r++){ + lsSum[r]=scalar_type(0.0); + } + + int e1= grid->_slice_nblock[orthogdim]; + int e2= grid->_slice_block [orthogdim]; + int stride=grid->_slice_stride[orthogdim]; + + std::cout << GridLogMessage << " Entering first parallel loop "<_ostride[orthogdim]; // base offset for start of plane + + for(int n=0;n > phase(Nmom); + + for(int m=0;m icoor(Nd); + std::vector extracted(Nsimd); + + + for(int i=0;iiCoorFromIindex(icoor,idx); + + int ldx = rt+icoor[orthogdim]*rd; + + int ij_ldx = m+Nmom*i+Nmom*Lblock*j+Nmom*Lblock*Rblock*ldx; + + lsSum[ij_ldx]=lsSum[ij_ldx]+extracted[idx]; + + } + }}} + } + + assert(mat.dimension(0) == Nt); + assert(mat.dimension(1) == Nmom); + assert(mat.dimension(2) == Ngamma); + assert(mat.dimension(3) == Lblock); + assert(mat.dimension(4) == Rblock); + mat.setZero(); + parallel_for(int t=0;t_processor_coor[orthogdim]){ + for(int i=0;iGlobalSumVector(&mat(0,0,0,0,0),Nmom*Rblock*Lblock*Nt*Ngamma); + + return; +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TA2AMesonField::execute(void) +{ + LOG(Message) << "Computing A2A meson field" << std::endl; + + auto &a2a = envGet(A2ABase, par().A2A + "_class"); + + // 2+6+4+4 = 16 gammas + // Ordering defined here + std::vector gammas ( { + Gamma::Algebra::Identity, + Gamma::Algebra::Gamma5, + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT, + Gamma::Algebra::GammaXGamma5, + Gamma::Algebra::GammaYGamma5, + Gamma::Algebra::GammaZGamma5, + Gamma::Algebra::GammaTGamma5, + Gamma::Algebra::SigmaXY, + Gamma::Algebra::SigmaXZ, + Gamma::Algebra::SigmaXT, + Gamma::Algebra::SigmaYZ, + Gamma::Algebra::SigmaYT, + Gamma::Algebra::SigmaZT + }); + + /////////////////////////////////////////////// + // Square assumption for now Nl = Nr = N + /////////////////////////////////////////////// + int nt = env().getDim(Tp); + int N = par().N; + int Nl = par().Nl; + int ngamma = gammas.size(); + + /////////////////////////////////////////////// + // Momentum setup + /////////////////////////////////////////////// + std::vector phases(1,env().getGrid(1)); + int nmom = phases.size(); + phases[0] = Complex(1.0); + + Eigen::Tensor mesonField (nmom,ngamma,nt,N,N); + + LOG(Message) << "N = Nh+Nl for A2A MesonField is " << N << std::endl; + + envGetTmp(std::vector, w); + envGetTmp(std::vector, v); + envGetTmp(FermionField, tmp_5d); + + LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; + + int schurBlock = par().schurBlock; + int cacheBlock = par().cacheBlock; + for(int i_base=0;i_base mesonFieldBlocked(nmom,ngamma,nt,N_i,N_j); + + MesonField(mesonFieldBlocked, w, v, gammas, phases,Tp); + + /////////////////////////////////////////////////////////////// + // Copy out to full meson field tensor + /////////////////////////////////////////////////////////////// + for(int ii =0;ii< N_i;ii++) { + for(int jj =0;jj< N_j;jj++) { + for(int m =0;m< nmom;m++) { + for(int g =0;g< ngamma;g++) { + for(int t =0;t< nt;t++) { + mesonField(m,g,t,i_base+ii,j_base+jj) = mesonFieldBlocked(m,g,t,ii,jj); + }}}}} + + LOG(Message) << "Contracted MesonFields " < +#include #if defined __GNUC__ #pragma GCC diagnostic pop #endif diff --git a/lib/Makefile.am b/lib/Makefile.am index dc33e7cf..6c94e2d6 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -34,4 +34,4 @@ HFILES += $(extra_headers) libGrid_a_SOURCES = $(CCFILES) libGrid_adir = $(pkgincludedir) -nobase_dist_pkginclude_HEADERS = $(HFILES) $(eigen_files) Config.h +nobase_dist_pkginclude_HEADERS = $(HFILES) $(eigen_files) $(eigen_unsupp_files) Config.h diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 3c082446..ed06c673 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -27,7 +27,7 @@ *************************************************************************************/ /* END LEGAL */ #include -#include +//#include #include namespace Grid diff --git a/scripts/update_eigen.sh b/scripts/update_eigen.sh index d1338e4d..442a2477 100755 --- a/scripts/update_eigen.sh +++ b/scripts/update_eigen.sh @@ -7,13 +7,42 @@ fi ARC=$1 INITDIR=`pwd` -rm -rf lib/Eigen -ARCDIR=`tar -tf ${ARC} | head -n1 | sed -e 's@/.*@@'` + +################## +#untar +################## + tar -xf ${ARC} -cd ${ARCDIR} -(tar -cf - Eigen --exclude='*.txt' 2>/dev/null) | tar -xf - -C ../lib/ -cd ../lib -echo 'eigen_files =\' > Eigen.inc -find Eigen -type f -print | sed 's/^/ /;$q;s/$/ \\/' >> Eigen.inc +ARCDIR=`tar -tf ${ARC} | head -n1 | sed -e 's@/.*@@'` +rm -f ${ARC} + +############################### +# Link to a deterministic name +############################### + +mv ${ARCDIR} Eigen + +# Eigen source headers +cd ${INITDIR}/Eigen + +echo 'eigen_files =\' > ${INITDIR}/lib/Eigen.inc +find Eigen -name "*.h" -print | sed 's/^/ /;$q;s/$/ \\/' >> ${INITDIR}/lib/Eigen.inc + cd ${INITDIR} -rm -rf ${ARCDIR} +echo 'eigen_unsupp_files =\' >> ${INITDIR}/lib/Eigen.inc +find Eigen/unsupported/Eigen -name "*.h" -print | sed 's/^/ /;$q;s/$/ \\/' >> ${INITDIR}/lib/Eigen.inc + + + +################################### +# back to home +################################### +cd ${INITDIR} + +######################################### +# Make grid includes happy +######################################### +mkdir ${INITDIR}/lib/Eigen/ + +ln -s ${INITDIR}/Eigen/Eigen/* ${INITDIR}/lib/Eigen/ +ln -s ${INITDIR}/Eigen/unsupported ${INITDIR}/lib/Eigen/