mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-10 07:55:35 +00:00
Implemented mixed precision CG. Fixed filelist to exclude lib/Old directory and include Config.h.
This commit is contained in:
parent
df5c788ef2
commit
85ed8175cb
@ -44,6 +44,7 @@ Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
|||||||
#include <algorithms/iterative/SchurRedBlack.h>
|
#include <algorithms/iterative/SchurRedBlack.h>
|
||||||
|
|
||||||
#include <algorithms/iterative/ConjugateGradientMultiShift.h>
|
#include <algorithms/iterative/ConjugateGradientMultiShift.h>
|
||||||
|
#include <algorithms/iterative/ConjugateGradientMixedPrec.h>
|
||||||
|
|
||||||
// Lanczos support
|
// Lanczos support
|
||||||
#include <algorithms/iterative/MatrixUtils.h>
|
#include <algorithms/iterative/MatrixUtils.h>
|
||||||
|
File diff suppressed because one or more lines are too long
141
lib/algorithms/iterative/ConjugateGradientMixedPrec.h
Normal file
141
lib/algorithms/iterative/ConjugateGradientMixedPrec.h
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: ./lib/algorithms/iterative/ConjugateGradientMixedPrec.h
|
||||||
|
|
||||||
|
Copyright (C) 2015
|
||||||
|
|
||||||
|
Author: Christopher Kelly <ckelly@phys.columbia.edu>
|
||||||
|
|
||||||
|
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 GRID_CONJUGATE_GRADIENT_MIXED_PREC_H
|
||||||
|
#define GRID_CONJUGATE_GRADIENT_MIXED_PREC_H
|
||||||
|
|
||||||
|
namespace Grid {
|
||||||
|
|
||||||
|
template<class FieldD,class FieldF, typename std::enable_if< getPrecision<FieldD>::value == 2, int>::type = 0,typename std::enable_if< getPrecision<FieldF>::value == 1, int>::type = 0>
|
||||||
|
class MixedPrecisionConjugateGradient : public LinearFunction<FieldD> {
|
||||||
|
public:
|
||||||
|
RealD Tolerance;
|
||||||
|
Integer MaxInnerIterations;
|
||||||
|
Integer MaxOuterIterations;
|
||||||
|
GridBase* SinglePrecGrid; //Grid for single-precision fields
|
||||||
|
RealD OuterLoopNormMult; //Stop the outer loop and move to a final double prec solve when the residual is OuterLoopNormMult * Tolerance
|
||||||
|
LinearOperatorBase<FieldF> &Linop_f;
|
||||||
|
LinearOperatorBase<FieldD> &Linop_d;
|
||||||
|
|
||||||
|
//Option to speed up *inner single precision* solves using a LinearFunction that produces a guess
|
||||||
|
LinearFunction<FieldF> *guesser;
|
||||||
|
|
||||||
|
MixedPrecisionConjugateGradient(RealD tol, Integer maxinnerit, Integer maxouterit, GridBase* _sp_grid, LinearOperatorBase<FieldF> &_Linop_f, LinearOperatorBase<FieldD> &_Linop_d) :
|
||||||
|
Linop_f(_Linop_f), Linop_d(_Linop_d),
|
||||||
|
Tolerance(tol), MaxInnerIterations(maxinnerit), MaxOuterIterations(maxouterit), SinglePrecGrid(_sp_grid),
|
||||||
|
OuterLoopNormMult(100.), guesser(NULL){ };
|
||||||
|
|
||||||
|
void useGuesser(LinearFunction<FieldF> &g){
|
||||||
|
guesser = g;
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator() (const FieldD &src_d_in, FieldD &sol_d){
|
||||||
|
GridStopWatch TotalTimer;
|
||||||
|
TotalTimer.Start();
|
||||||
|
|
||||||
|
int cb = src_d_in.checkerboard;
|
||||||
|
sol_d.checkerboard = cb;
|
||||||
|
|
||||||
|
RealD src_norm = norm2(src_d_in);
|
||||||
|
RealD stop = src_norm * Tolerance*Tolerance;
|
||||||
|
|
||||||
|
GridBase* DoublePrecGrid = src_d_in._grid;
|
||||||
|
FieldD tmp_d(DoublePrecGrid);
|
||||||
|
tmp_d.checkerboard = cb;
|
||||||
|
|
||||||
|
FieldD tmp2_d(DoublePrecGrid);
|
||||||
|
tmp2_d.checkerboard = cb;
|
||||||
|
|
||||||
|
FieldD src_d(DoublePrecGrid);
|
||||||
|
src_d = src_d_in; //source for next inner iteration, computed from residual during operation
|
||||||
|
|
||||||
|
RealD inner_tol = Tolerance;
|
||||||
|
|
||||||
|
FieldF src_f(SinglePrecGrid);
|
||||||
|
src_f.checkerboard = cb;
|
||||||
|
|
||||||
|
FieldF sol_f(SinglePrecGrid);
|
||||||
|
sol_f.checkerboard = cb;
|
||||||
|
|
||||||
|
ConjugateGradient<FieldF> CG_f(inner_tol, MaxInnerIterations);
|
||||||
|
CG_f.ErrorOnNoConverge = false;
|
||||||
|
|
||||||
|
GridStopWatch InnerCGtimer;
|
||||||
|
|
||||||
|
GridStopWatch PrecChangeTimer;
|
||||||
|
|
||||||
|
for(Integer outer_iter = 0; outer_iter < MaxOuterIterations; outer_iter++){
|
||||||
|
//Compute double precision rsd and also new RHS vector.
|
||||||
|
Linop_d.HermOp(sol_d, tmp_d);
|
||||||
|
RealD norm = axpy_norm(src_d, -1., tmp_d, src_d_in); //src_d is residual vector
|
||||||
|
|
||||||
|
std::cout<<GridLogMessage<<"MixedPrecisionConjugateGradient: Outer iteration " <<outer_iter<<" residual "<< norm<< " target "<< stop<<std::endl;
|
||||||
|
|
||||||
|
if(norm < OuterLoopNormMult * stop){
|
||||||
|
std::cout<<GridLogMessage<<"MixedPrecisionConjugateGradient: Outer iteration converged on iteration " <<outer_iter <<std::endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
while(norm * inner_tol * inner_tol < stop) inner_tol *= 2; // inner_tol = sqrt(stop/norm) ??
|
||||||
|
|
||||||
|
PrecChangeTimer.Start();
|
||||||
|
precisionChange(src_f, src_d);
|
||||||
|
PrecChangeTimer.Stop();
|
||||||
|
|
||||||
|
zeroit(sol_f);
|
||||||
|
|
||||||
|
//Optionally improve inner solver guess (eg using known eigenvectors)
|
||||||
|
if(guesser != NULL)
|
||||||
|
(*guesser)(src_f, sol_f);
|
||||||
|
|
||||||
|
//Inner CG
|
||||||
|
CG_f.Tolerance = inner_tol;
|
||||||
|
InnerCGtimer.Start();
|
||||||
|
CG_f(Linop_f, src_f, sol_f);
|
||||||
|
InnerCGtimer.Stop();
|
||||||
|
|
||||||
|
//Convert sol back to double and add to double prec solution
|
||||||
|
PrecChangeTimer.Start();
|
||||||
|
precisionChange(tmp_d, sol_f);
|
||||||
|
PrecChangeTimer.Stop();
|
||||||
|
|
||||||
|
axpy(sol_d, 1.0, tmp_d, sol_d);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Final trial CG
|
||||||
|
std::cout<<GridLogMessage<<"MixedPrecisionConjugateGradient: Starting final patch-up double-precision solve"<<std::endl;
|
||||||
|
|
||||||
|
ConjugateGradient<FieldD> CG_d(Tolerance, MaxInnerIterations);
|
||||||
|
CG_d(Linop_d, src_d_in, sol_d);
|
||||||
|
|
||||||
|
TotalTimer.Stop();
|
||||||
|
std::cout<<GridLogMessage<<"MixedPrecisionConjugateGradient: Total " << TotalTimer.Elapsed() << " Precision change " << PrecChangeTimer.Elapsed() << " Inner CG total " << InnerCGtimer.Elapsed() << std::endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -82,6 +82,12 @@ template <typename T> using is_lattice = std::is_base_of<LatticeBase,T >;
|
|||||||
|
|
||||||
template <typename T> using is_lattice_expr = std::is_base_of<LatticeExpressionBase,T >;
|
template <typename T> using is_lattice_expr = std::is_base_of<LatticeExpressionBase,T >;
|
||||||
|
|
||||||
|
//Specialization of getVectorType for lattices
|
||||||
|
template<typename T>
|
||||||
|
struct getVectorType<Lattice<T> >{
|
||||||
|
typedef typename Lattice<T>::vector_object type;
|
||||||
|
};
|
||||||
|
|
||||||
template<class sobj>
|
template<class sobj>
|
||||||
inline sobj eval(const unsigned int ss, const sobj &arg)
|
inline sobj eval(const unsigned int ss, const sobj &arg)
|
||||||
{
|
{
|
||||||
|
@ -482,6 +482,96 @@ void Replicate(Lattice<vobj> &coarse,Lattice<vobj> & fine)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Copy SIMD-vectorized lattice to array of scalar objects in lexicographic order
|
||||||
|
template<typename vobj, typename sobj>
|
||||||
|
typename std::enable_if<isSIMDvectorized<vobj>::value && !isSIMDvectorized<sobj>::value, void>::type unvectorizeToLexOrdArray(std::vector<sobj> &out, const Lattice<vobj> &in){
|
||||||
|
typedef typename vobj::vector_type vtype;
|
||||||
|
|
||||||
|
GridBase* in_grid = in._grid;
|
||||||
|
out.resize(in_grid->lSites());
|
||||||
|
|
||||||
|
int ndim = in_grid->Nd();
|
||||||
|
int in_nsimd = vtype::Nsimd();
|
||||||
|
|
||||||
|
std::vector<int> in_icoor[in_nsimd];
|
||||||
|
|
||||||
|
for(int lane=0; lane < in_nsimd; lane++){
|
||||||
|
in_icoor[lane].resize(ndim);
|
||||||
|
in_grid->iCoorFromIindex(in_icoor[lane], lane);
|
||||||
|
}
|
||||||
|
|
||||||
|
PARALLEL_FOR_LOOP
|
||||||
|
for(int in_oidx = 0; in_oidx < in_grid->oSites(); in_oidx++){ //loop over outer index
|
||||||
|
//Assemble vector of pointers to output elements
|
||||||
|
std::vector<sobj*> out_ptrs(in_nsimd);
|
||||||
|
|
||||||
|
std::vector<int> in_ocoor(ndim);
|
||||||
|
in_grid->oCoorFromOindex(in_ocoor, in_oidx);
|
||||||
|
|
||||||
|
std::vector<int> lcoor(in_grid->Nd());
|
||||||
|
|
||||||
|
for(int lane=0; lane < in_nsimd; lane++){
|
||||||
|
for(int mu=0;mu<ndim;mu++)
|
||||||
|
lcoor[mu] = in_ocoor[mu] + in_grid->_rdimensions[mu]*in_icoor[lane][mu];
|
||||||
|
|
||||||
|
int lex;
|
||||||
|
Lexicographic::IndexFromCoor(lcoor, lex, in_grid->_ldimensions);
|
||||||
|
out_ptrs[lane] = &out[lex];
|
||||||
|
}
|
||||||
|
|
||||||
|
//Unpack into those ptrs
|
||||||
|
const vobj & in_vobj = in._odata[in_oidx];
|
||||||
|
extract1(in_vobj, out_ptrs, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Convert a Lattice from one precision to another
|
||||||
|
template<class VobjOut, class VobjIn>
|
||||||
|
void precisionChange(Lattice<VobjOut> &out, const Lattice<VobjIn> &in){
|
||||||
|
assert(out._grid->Nd() == in._grid->Nd());
|
||||||
|
out.checkerboard = in.checkerboard;
|
||||||
|
GridBase *in_grid=in._grid;
|
||||||
|
GridBase *out_grid = out._grid;
|
||||||
|
|
||||||
|
typedef typename VobjOut::scalar_object SobjOut;
|
||||||
|
typedef typename VobjIn::scalar_object SobjIn;
|
||||||
|
|
||||||
|
int ndim = out._grid->Nd();
|
||||||
|
int out_nsimd = out_grid->Nsimd();
|
||||||
|
|
||||||
|
std::vector<int> out_icoor[out_nsimd];
|
||||||
|
|
||||||
|
for(int lane=0; lane < out_nsimd; lane++){
|
||||||
|
out_icoor[lane].resize(ndim);
|
||||||
|
out_grid->iCoorFromIindex(out_icoor[lane], lane);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<SobjOut> in_slex_conv(in_grid->lSites());
|
||||||
|
unvectorizeToLexOrdArray(in_slex_conv, in);
|
||||||
|
|
||||||
|
PARALLEL_FOR_LOOP
|
||||||
|
for(int out_oidx=0;out_oidx<out_grid->oSites();out_oidx++){
|
||||||
|
std::vector<int> out_ocoor(ndim);
|
||||||
|
out_grid->oCoorFromOindex(out_ocoor, out_oidx);
|
||||||
|
|
||||||
|
std::vector<SobjOut*> ptrs(out_nsimd);
|
||||||
|
|
||||||
|
std::vector<int> lcoor(out_grid->Nd());
|
||||||
|
|
||||||
|
for(int lane=0; lane < out_nsimd; lane++){
|
||||||
|
for(int mu=0;mu<ndim;mu++)
|
||||||
|
lcoor[mu] = out_ocoor[mu] + out_grid->_rdimensions[mu]*out_icoor[lane][mu];
|
||||||
|
|
||||||
|
int llex; Lexicographic::IndexFromCoor(lcoor, llex, out_grid->_ldimensions);
|
||||||
|
ptrs[lane] = &in_slex_conv[llex];
|
||||||
|
}
|
||||||
|
merge(out._odata[out_oidx], ptrs, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -10,6 +10,7 @@ Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
|
|||||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
||||||
Author: neo <cossu@post.kek.jp>
|
Author: neo <cossu@post.kek.jp>
|
||||||
Author: paboyle <paboyle@ph.ed.ac.uk>
|
Author: paboyle <paboyle@ph.ed.ac.uk>
|
||||||
|
Author: Christopher Kelly <ckelly@phys.columbia.edu>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -167,6 +168,33 @@ void extract(const vobj &vec,std::vector<typename vobj::scalar_object *> &extrac
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// Extract to a bunch of scalar object pointers of different scalar type, with offset. Useful for precision change
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
template<class vobj, class sobj> inline
|
||||||
|
void extract1(const vobj &vec,std::vector<sobj*> &extracted, int offset)
|
||||||
|
{
|
||||||
|
typedef typename vobj::scalar_type vobj_scalar_type ;
|
||||||
|
typedef typename vobj::vector_type vobj_vector_type ;
|
||||||
|
|
||||||
|
typedef typename sobj::scalar_type sobj_scalar_type ;
|
||||||
|
|
||||||
|
static const int words=sizeof(vobj)/sizeof(vobj_vector_type);
|
||||||
|
static const int Nsimd=vobj_vector_type::Nsimd();
|
||||||
|
|
||||||
|
int Nextr=extracted.size();
|
||||||
|
int s = Nsimd/Nextr;
|
||||||
|
vobj_scalar_type * vp = (vobj_scalar_type *)&vec;
|
||||||
|
|
||||||
|
for(int w=0;w<words;w++){
|
||||||
|
for(int i=0;i<Nextr;i++){
|
||||||
|
sobj_scalar_type * pointer = (sobj_scalar_type *)& extracted[i][offset];
|
||||||
|
pointer[w] = vp[i*s+w*Nsimd];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
// Merge a contiguous array of scalar objects
|
// Merge a contiguous array of scalar objects
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
|
Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
|
||||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
||||||
|
Author: Christopher Kelly <ckelly@phys.columbia.edu>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -230,6 +231,35 @@ namespace Grid {
|
|||||||
static const bool value = true;
|
static const bool value = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//Get the SIMD vector type from a Grid tensor or Lattice<Tensor>
|
||||||
|
template<typename T>
|
||||||
|
struct getVectorType{
|
||||||
|
typedef T type;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Query if a tensor or Lattice<Tensor> is SIMD vector or scalar
|
||||||
|
template<typename T>
|
||||||
|
class isSIMDvectorized{
|
||||||
|
template<typename U>
|
||||||
|
static typename std::enable_if< !std::is_same< typename GridTypeMapper<typename getVectorType<U>::type>::scalar_type, typename GridTypeMapper<typename getVectorType<U>::type>::vector_type>::value, char>::type test(void *);
|
||||||
|
|
||||||
|
template<typename U>
|
||||||
|
static double test(...);
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum {value = sizeof(test<T>(0)) == sizeof(char) };
|
||||||
|
};
|
||||||
|
|
||||||
|
//Get the precision of a Lattice, tensor or scalar type in units of sizeof(float)
|
||||||
|
template<typename T>
|
||||||
|
class getPrecision{
|
||||||
|
typedef typename getVectorType<T>::type vector_obj; //get the vector_obj (i.e. a grid Tensor) if its a Lattice<vobj>, do nothing otherwise (i.e. if fundamental or grid Tensor)
|
||||||
|
|
||||||
|
typedef typename GridTypeMapper<vector_obj>::scalar_type scalar_type; //get the associated scalar type. Works on fundamental and tensor types
|
||||||
|
typedef typename GridTypeMapper<scalar_type>::Realified real_scalar_type; //remove any std::complex wrapper, should get us to the fundamental type
|
||||||
|
public:
|
||||||
|
enum { value = sizeof(real_scalar_type)/sizeof(float) };
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
cd lib
|
cd lib
|
||||||
|
|
||||||
HFILES=`find . -type f -name '*.h'`
|
HFILES=`find . -type f -name '*.h' -not -path '*/Old/*'`
|
||||||
|
HFILES="$HFILES Config.h"
|
||||||
CCFILES=`find . -type f -name '*.cc' -not -name '*ommunicator*.cc'`
|
CCFILES=`find . -type f -name '*.cc' -not -name '*ommunicator*.cc'`
|
||||||
echo> Make.inc
|
echo> Make.inc
|
||||||
echo HFILES=$HFILES >> Make.inc
|
echo HFILES=$HFILES >> Make.inc
|
||||||
|
@ -1,13 +1,5 @@
|
|||||||
|
|
||||||
bin_PROGRAMS += Test_GaugeAction Test_RectPlaq Test_cayley_cg Test_cayley_coarsen_support Test_cayley_even_odd Test_cayley_ldop_cr Test_cf_coarsen_support Test_cf_cr_unprec Test_cheby Test_contfrac_cg Test_contfrac_even_odd Test_contfrac_force Test_cshift Test_cshift_red_black Test_cshift_red_black_rotate Test_cshift_rotate Test_dwf_cg_prec Test_dwf_cg_schur Test_dwf_cg_unprec Test_dwf_cr_unprec Test_dwf_even_odd Test_dwf_force Test_dwf_fpgcr Test_dwf_gpforce Test_dwf_hdcr Test_dwf_lanczos Test_dwf_rb5d Test_gamma Test_gp_rect_force Test_gparity Test_gpdwf_force Test_gpwilson_even_odd Test_hmc_EODWFRatio Test_hmc_EODWFRatio_Gparity Test_hmc_EOWilsonFermionGauge Test_hmc_EOWilsonRatio Test_hmc_GparityIwasakiGauge Test_hmc_GparityWilsonGauge Test_hmc_IwasakiGauge Test_hmc_RectGauge Test_hmc_WilsonFermionGauge Test_hmc_WilsonGauge Test_hmc_WilsonRatio Test_lie_generators Test_main Test_multishift_sqrt Test_nersc_io Test_partfrac_force Test_quenched_update Test_rect_force Test_remez Test_rhmc_EOWilson1p1 Test_rhmc_EOWilsonRatio Test_rhmc_Wilson1p1 Test_rhmc_WilsonRatio Test_rng Test_rng_fixed Test_serialisation Test_simd Test_stencil Test_synthetic_lanczos Test_wilson_cg_prec Test_wilson_cg_schur Test_wilson_cg_unprec Test_wilson_cr_unprec Test_wilson_even_odd Test_wilson_force Test_wilson_force_phiMdagMphi Test_wilson_force_phiMphi Test_wilson_tm_even_odd
|
bin_PROGRAMS += Test_cayley_cg Test_cayley_coarsen_support Test_cayley_even_odd Test_cayley_ldop_cr Test_cf_coarsen_support Test_cf_cr_unprec Test_cheby Test_contfrac_cg Test_contfrac_even_odd Test_contfrac_force Test_cshift Test_cshift_red_black Test_cshift_red_black_rotate Test_cshift_rotate Test_dwf_cg_prec Test_dwf_cg_schur Test_dwf_cg_unprec Test_dwf_cr_unprec Test_dwf_even_odd Test_dwf_force Test_dwf_fpgcr Test_dwf_gpforce Test_dwf_hdcr Test_dwf_lanczos Test_dwf_rb5d Test_gamma Test_GaugeAction Test_gparity Test_gpdwf_force Test_gp_rect_force Test_gpwilson_even_odd Test_hmc_EODWFRatio Test_hmc_EODWFRatio_Gparity Test_hmc_EOWilsonFermionGauge Test_hmc_EOWilsonRatio Test_hmc_GparityIwasakiGauge Test_hmc_GparityWilsonGauge Test_hmc_IwasakiGauge Test_hmc_RectGauge Test_hmc_WilsonFermionGauge Test_hmc_WilsonGauge Test_hmc_WilsonRatio Test_lie_generators Test_main Test_multishift_sqrt Test_nersc_io Test_partfrac_force Test_quenched_update Test_rect_force Test_RectPlaq Test_remez Test_rhmc_EOWilson1p1 Test_rhmc_EOWilsonRatio Test_rhmc_Wilson1p1 Test_rhmc_WilsonRatio Test_rng Test_rng_fixed Test_serialisation Test_simd Test_stencil Test_synthetic_lanczos Test_wilson_cg_prec Test_wilson_cg_schur Test_wilson_cg_unprec Test_wilson_cr_unprec Test_wilson_even_odd Test_wilson_force Test_wilson_force_phiMdagMphi Test_wilson_force_phiMphi Test_wilson_tm_even_odd
|
||||||
|
|
||||||
|
|
||||||
Test_GaugeAction_SOURCES=Test_GaugeAction.cc
|
|
||||||
Test_GaugeAction_LDADD=-lGrid
|
|
||||||
|
|
||||||
|
|
||||||
Test_RectPlaq_SOURCES=Test_RectPlaq.cc
|
|
||||||
Test_RectPlaq_LDADD=-lGrid
|
|
||||||
|
|
||||||
|
|
||||||
Test_cayley_cg_SOURCES=Test_cayley_cg.cc
|
Test_cayley_cg_SOURCES=Test_cayley_cg.cc
|
||||||
@ -114,8 +106,8 @@ Test_gamma_SOURCES=Test_gamma.cc
|
|||||||
Test_gamma_LDADD=-lGrid
|
Test_gamma_LDADD=-lGrid
|
||||||
|
|
||||||
|
|
||||||
Test_gp_rect_force_SOURCES=Test_gp_rect_force.cc
|
Test_GaugeAction_SOURCES=Test_GaugeAction.cc
|
||||||
Test_gp_rect_force_LDADD=-lGrid
|
Test_GaugeAction_LDADD=-lGrid
|
||||||
|
|
||||||
|
|
||||||
Test_gparity_SOURCES=Test_gparity.cc
|
Test_gparity_SOURCES=Test_gparity.cc
|
||||||
@ -126,6 +118,10 @@ Test_gpdwf_force_SOURCES=Test_gpdwf_force.cc
|
|||||||
Test_gpdwf_force_LDADD=-lGrid
|
Test_gpdwf_force_LDADD=-lGrid
|
||||||
|
|
||||||
|
|
||||||
|
Test_gp_rect_force_SOURCES=Test_gp_rect_force.cc
|
||||||
|
Test_gp_rect_force_LDADD=-lGrid
|
||||||
|
|
||||||
|
|
||||||
Test_gpwilson_even_odd_SOURCES=Test_gpwilson_even_odd.cc
|
Test_gpwilson_even_odd_SOURCES=Test_gpwilson_even_odd.cc
|
||||||
Test_gpwilson_even_odd_LDADD=-lGrid
|
Test_gpwilson_even_odd_LDADD=-lGrid
|
||||||
|
|
||||||
@ -202,6 +198,10 @@ Test_rect_force_SOURCES=Test_rect_force.cc
|
|||||||
Test_rect_force_LDADD=-lGrid
|
Test_rect_force_LDADD=-lGrid
|
||||||
|
|
||||||
|
|
||||||
|
Test_RectPlaq_SOURCES=Test_RectPlaq.cc
|
||||||
|
Test_RectPlaq_LDADD=-lGrid
|
||||||
|
|
||||||
|
|
||||||
Test_remez_SOURCES=Test_remez.cc
|
Test_remez_SOURCES=Test_remez.cc
|
||||||
Test_remez_LDADD=-lGrid
|
Test_remez_LDADD=-lGrid
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user