From d9b5fbd374fa08d700d52a054786d6ecd70b4e9d Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 4 Oct 2016 11:24:08 +0100 Subject: [PATCH] In the middle of adding a general binary writer --- lib/parallelIO/BinaryIO.h | 6 ++ lib/parallelIO/NerscIO.h | 86 +++++++++++----------- lib/qcd/hmc/BinaryCheckpointer.h | 106 +++++++++++++++++++++++++++ lib/qcd/hmc/integrators/Integrator.h | 20 ++--- 4 files changed, 163 insertions(+), 55 deletions(-) create mode 100644 lib/qcd/hmc/BinaryCheckpointer.h diff --git a/lib/parallelIO/BinaryIO.h b/lib/parallelIO/BinaryIO.h index 5eddb57d..6e2bbb67 100644 --- a/lib/parallelIO/BinaryIO.h +++ b/lib/parallelIO/BinaryIO.h @@ -539,6 +539,12 @@ class BinaryIO { int ieee64big = (format == std::string("IEEE64BIG")); int ieee64 = (format == std::string("IEEE64")); + if(!(ieee32big || ieee32 || ieee64big || ieee64)){ + std::cout << GridLogError << "Unrecognized file format " << format << std::endl; + std::cout << GridLogError << "Allowed: IEEE32BIG | IEEE32 | IEEE64BIG | IEEE64" << std::endl; + exit(0); + } + int nd = grid->_ndimension; for(int d=0;dCheckerBoarded(d) == 0); diff --git a/lib/parallelIO/NerscIO.h b/lib/parallelIO/NerscIO.h index 79572539..945c6571 100644 --- a/lib/parallelIO/NerscIO.h +++ b/lib/parallelIO/NerscIO.h @@ -137,51 +137,53 @@ inline void NerscMachineCharacteristics(NerscField &header) const int y=1; const int z=2; for(int mu=0;mu<4;mu++){ - cm(mu)()(2,x) = adj(cm(mu)()(0,y)*cm(mu)()(1,z)-cm(mu)()(0,z)*cm(mu)()(1,y)); //x= yz-zy - cm(mu)()(2,y) = adj(cm(mu)()(0,z)*cm(mu)()(1,x)-cm(mu)()(0,x)*cm(mu)()(1,z)); //y= zx-xz - cm(mu)()(2,z) = adj(cm(mu)()(0,x)*cm(mu)()(1,y)-cm(mu)()(0,y)*cm(mu)()(1,x)); //z= xy-yx + cm(mu)()(2,x) = adj(cm(mu)()(0,y)*cm(mu)()(1,z)-cm(mu)()(0,z)*cm(mu)()(1,y)); //x= yz-zy + cm(mu)()(2,y) = adj(cm(mu)()(0,z)*cm(mu)()(1,x)-cm(mu)()(0,x)*cm(mu)()(1,z)); //y= zx-xz + cm(mu)()(2,z) = adj(cm(mu)()(0,x)*cm(mu)()(1,y)-cm(mu)()(0,y)*cm(mu)()(1,x)); //z= xy-yx } } template struct NerscSimpleMunger{ - - void operator() (fobj &in,sobj &out,uint32_t &csum){ - - for(int mu=0;mu<4;mu++){ - for(int i=0;i<3;i++){ - for(int j=0;j<3;j++){ - out(mu)()(i,j) = in(mu)()(i,j); - }}} - NerscChecksum((uint32_t *)&in,sizeof(in),csum); + void operator()(fobj &in, sobj &out, uint32_t &csum) { + for (int mu = 0; mu < Nd; mu++) { + for (int i = 0; i < Nc; i++) { + for (int j = 0; j < Nc; j++) { + out(mu)()(i, j) = in(mu)()(i, j); + } + } + } + NerscChecksum((uint32_t *)&in, sizeof(in), csum); }; }; - template - struct NerscSimpleUnmunger{ - void operator() (sobj &in,fobj &out,uint32_t &csum){ - for(int mu=0;mu + struct NerscSimpleUnmunger { + void operator()(sobj &in, fobj &out, uint32_t &csum) { + for (int mu = 0; mu < Nd; mu++) { + for (int i = 0; i < Nc; i++) { + for (int j = 0; j < Nc; j++) { + out(mu)()(i, j) = in(mu)()(i, j); + } + } + } + NerscChecksum((uint32_t *)&out, sizeof(out), csum); }; }; - + template struct Nersc3x2munger{ void operator() (fobj &in,sobj &out,uint32_t &csum){ - NerscChecksum((uint32_t *)&in,sizeof(in),csum); + NerscChecksum((uint32_t *)&in,sizeof(in),csum); - for(int mu=0;mu<4;mu++){ - for(int i=0;i<2;i++){ - for(int j=0;j<3;j++){ - out(mu)()(i,j) = in(mu)(i)(j); - }} - } - reconstruct3(out); + for(int mu=0;mu<4;mu++){ + for(int i=0;i<2;i++){ + for(int j=0;j<3;j++){ + out(mu)()(i,j) = in(mu)(i)(j); + }} + } + reconstruct3(out); } }; @@ -191,14 +193,14 @@ inline void NerscMachineCharacteristics(NerscField &header) void operator() (sobj &in,fobj &out,uint32_t &csum){ - for(int mu=0;mu<4;mu++){ - for(int i=0;i<2;i++){ - for(int j=0;j<3;j++){ - out(mu)(i)(j) = in(mu)()(i,j); - }} - } + for(int mu=0;mu<4;mu++){ + for(int i=0;i<2;i++){ + for(int j=0;j<3;j++){ + out(mu)(i)(j) = in(mu)()(i,j); + }} + } - NerscChecksum((uint32_t *)&out,sizeof(out),csum); + NerscChecksum((uint32_t *)&out,sizeof(out),csum); } }; @@ -346,24 +348,24 @@ static inline void readConfiguration(Lattice > &Umu, if ( header.data_type == std::string("4D_SU3_GAUGE") ) { if ( ieee32 || ieee32big ) { // csum=BinaryIO::readObjectSerial, LorentzColour2x3F> - csum=BinaryIO::readObjectParallel, LorentzColour2x3F> - (Umu,file,Nersc3x2munger(), offset,format); + csum=BinaryIO::readObjectParallel, LorentzColour2x3F> + (Umu,file,Nersc3x2munger(), offset,format); } if ( ieee64 || ieee64big ) { //csum=BinaryIO::readObjectSerial, LorentzColour2x3D> csum=BinaryIO::readObjectParallel, LorentzColour2x3D> - (Umu,file,Nersc3x2munger(),offset,format); + (Umu,file,Nersc3x2munger(),offset,format); } } else if ( header.data_type == std::string("4D_SU3_GAUGE_3x3") ) { if ( ieee32 || ieee32big ) { //csum=BinaryIO::readObjectSerial,LorentzColourMatrixF> csum=BinaryIO::readObjectParallel,LorentzColourMatrixF> - (Umu,file,NerscSimpleMunger(),offset,format); + (Umu,file,NerscSimpleMunger(),offset,format); } if ( ieee64 || ieee64big ) { // csum=BinaryIO::readObjectSerial,LorentzColourMatrixD> csum=BinaryIO::readObjectParallel,LorentzColourMatrixD> - (Umu,file,NerscSimpleMunger(),offset,format); + (Umu,file,NerscSimpleMunger(),offset,format); } } else { assert(0); diff --git a/lib/qcd/hmc/BinaryCheckpointer.h b/lib/qcd/hmc/BinaryCheckpointer.h new file mode 100644 index 00000000..fb48201c --- /dev/null +++ b/lib/qcd/hmc/BinaryCheckpointer.h @@ -0,0 +1,106 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./lib/qcd/hmc/NerscCheckpointer.h + + Copyright (C) 2015 + +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 */ +#ifndef NERSC_CHECKPOINTER +#define NERSC_CHECKPOINTER + +#include +#include +#include + + +namespace Grid{ + namespace QCD{ + + template + struct BinarySimpleUnmunger{ + void operator() (sobj &in,fobj &out,uint32_t &csum){ + fobj = sobj; + csum =0; + }; + + + // Only for gauge fields + template + class BinaryHmcCheckpointer : public HmcObservable { + private: + std::string configStem; + std::string rngStem; + int SaveInterval; + public: + INHERIT_FIELD_TYPES(Impl); // The Field is a Lattice object + + typedef typename Field::vector_object vobj; + typedef typename vobj::scalar_object sobj; + + + BinaryHmcCheckpointer(std::string cf, std::string rn,int savemodulo) { + configStem = cf; + rngStem = rn; + SaveInterval= savemodulo; + }; + + void TrajectoryComplete(int traj, Field &U, GridSerialRNG &sRNG, + GridParallelRNG &pRNG) { + if ((traj % SaveInterval) == 0) { + std::string rng; + { + std::ostringstream os; + os << rngStem << "." << traj; + rng = os.str(); + } + std::string config; + { + std::ostringstream os; + os << configStem << "." << traj; + config = os.str(); + } + + int prec = getPrecision::value; //get precision of oject + std::string floating_point = "IEEE64BIG"; //default precision + if (prec == 1) + floating_point = "IEEE32BIG" + + BinarySimpleUnmunger munge; + BinaryIO::writeRNGSerial(sRNG, pRNG, rng, 0); + BinaryIO::writeObjectParallel(U, config, munge, 0 ,floating_point); + } + }; + + void CheckpointRestore(int traj, GaugeField &U, GridSerialRNG &sRNG, GridParallelRNG & pRNG ){ + + std::string rng; { std::ostringstream os; os << rngStem <<"."<< traj; rng = os.str(); } + std::string config;{ std::ostringstream os; os << configStem <<"."<< traj; config = os.str();} + + NerscField header; + NerscIO::readRNGState(sRNG,pRNG,header,rng); + NerscIO::readConfiguration(U,header,config); + }; + + }; +}} +#endif diff --git a/lib/qcd/hmc/integrators/Integrator.h b/lib/qcd/hmc/integrators/Integrator.h index f5e5a37c..735863a0 100644 --- a/lib/qcd/hmc/integrators/Integrator.h +++ b/lib/qcd/hmc/integrators/Integrator.h @@ -41,8 +41,6 @@ directory #ifndef INTEGRATOR_INCLUDED #define INTEGRATOR_INCLUDED -// class Observer; - #include namespace Grid { @@ -77,24 +75,20 @@ struct IntegratorParameters { template class Integrator { protected: - typedef IntegratorParameters ParameterType; typedef typename FieldImplementation::Field MomentaField; //for readability typedef typename FieldImplementation::Field Field; + int levels; // number of integration levels + double t_U; // Track time passing on each level and for U and for P + std::vector t_P; + + MomentaField P; + SmearingPolicy& Smearer; + RepresentationPolicy Representations; IntegratorParameters Params; const ActionSet as; - int levels; // - double t_U; // Track time passing on each level and for U and for P - std::vector t_P; // - - MomentaField P; - - SmearingPolicy& Smearer; - - RepresentationPolicy Representations; - void update_P(Field& U, int level, double ep) { t_P[level] += ep; update_P(P, U, level, ep);