2015-04-26 15:51:09 +01:00
|
|
|
#include <Grid.h>
|
|
|
|
#include <parallelIO/GridNerscIO.h>
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
using namespace Grid;
|
|
|
|
using namespace Grid::QCD;
|
|
|
|
|
|
|
|
class funcPlus {
|
|
|
|
public:
|
|
|
|
funcPlus() {};
|
|
|
|
template<class vec> void operator()(vec &rr,vec &i1,vec &i2) const { rr = i1+i2;}
|
|
|
|
std::string name(void) const { return std::string("Plus"); }
|
|
|
|
};
|
|
|
|
class funcMinus {
|
|
|
|
public:
|
|
|
|
funcMinus() {};
|
|
|
|
template<class vec> void operator()(vec &rr,vec &i1,vec &i2) const { rr = i1-i2;}
|
|
|
|
std::string name(void) const { return std::string("Minus"); }
|
|
|
|
};
|
|
|
|
class funcTimes {
|
|
|
|
public:
|
|
|
|
funcTimes() {};
|
|
|
|
template<class vec> void operator()(vec &rr,vec &i1,vec &i2) const { rr = i1*i2;}
|
|
|
|
std::string name(void) const { return std::string("Times"); }
|
|
|
|
};
|
|
|
|
class funcConj {
|
|
|
|
public:
|
|
|
|
funcConj() {};
|
|
|
|
template<class vec> void operator()(vec &rr,vec &i1,vec &i2) const { rr = conj(i1);}
|
|
|
|
std::string name(void) const { return std::string("Conj"); }
|
|
|
|
};
|
|
|
|
class funcAdj {
|
|
|
|
public:
|
|
|
|
funcAdj() {};
|
|
|
|
template<class vec> void operator()(vec &rr,vec &i1,vec &i2) const { rr = adj(i1);}
|
|
|
|
std::string name(void) const { return std::string("Adj"); }
|
|
|
|
};
|
|
|
|
|
|
|
|
class funcTimesI {
|
|
|
|
public:
|
|
|
|
funcTimesI() {};
|
|
|
|
template<class vec> void operator()(vec &rr,vec &i1,vec &i2) const { rr = timesI(i1);}
|
|
|
|
std::string name(void) const { return std::string("timesI"); }
|
|
|
|
};
|
|
|
|
|
|
|
|
class funcTimesMinusI {
|
|
|
|
public:
|
|
|
|
funcTimesMinusI() {};
|
|
|
|
template<class vec> void operator()(vec &rr,vec &i1,vec &i2) const { rr = timesMinusI(i1);}
|
|
|
|
std::string name(void) const { return std::string("timesMinusI"); }
|
|
|
|
};
|
|
|
|
|
|
|
|
template<class scal, class vec,class functor >
|
|
|
|
void Tester(const functor &func)
|
|
|
|
{
|
|
|
|
GridSerialRNG sRNG;
|
|
|
|
sRNG.SeedRandomDevice();
|
|
|
|
|
|
|
|
int Nsimd = vec::Nsimd();
|
|
|
|
|
|
|
|
std::vector<scal> input1(Nsimd);
|
|
|
|
std::vector<scal> input2(Nsimd);
|
|
|
|
std::vector<scal> result(Nsimd);
|
|
|
|
std::vector<scal> reference(Nsimd);
|
|
|
|
|
|
|
|
std::vector<vec,alignedAllocator<vec> > buf(3);
|
|
|
|
vec & v_input1 = buf[0];
|
|
|
|
vec & v_input2 = buf[1];
|
|
|
|
vec & v_result = buf[2];
|
|
|
|
|
|
|
|
|
|
|
|
for(int i=0;i<Nsimd;i++){
|
|
|
|
random(sRNG,input1[i]);
|
|
|
|
random(sRNG,input2[i]);
|
|
|
|
random(sRNG,result[i]);
|
|
|
|
}
|
|
|
|
|
2015-04-28 08:11:59 +01:00
|
|
|
merge<vec,scal>(v_input1,input1);
|
|
|
|
merge<vec,scal>(v_input2,input2);
|
|
|
|
merge<vec,scal>(v_result,result);
|
2015-04-26 15:51:09 +01:00
|
|
|
|
|
|
|
func(v_result,v_input1,v_input2);
|
|
|
|
|
|
|
|
for(int i=0;i<Nsimd;i++) {
|
|
|
|
func(reference[i],input1[i],input2[i]);
|
|
|
|
}
|
|
|
|
|
2015-04-28 08:11:59 +01:00
|
|
|
extract<vec,scal>(v_result,result);
|
2015-04-26 15:51:09 +01:00
|
|
|
std::cout << " " << func.name()<<std::endl;
|
|
|
|
|
|
|
|
int ok=0;
|
|
|
|
for(int i=0;i<Nsimd;i++){
|
|
|
|
if ( abs(reference[i]-result[i])>0){
|
|
|
|
std::cout<< "*****" << std::endl;
|
|
|
|
std::cout<< "["<<i<<"] "<< abs(reference[i]-result[i]) << " " <<reference[i]<< " " << result[i]<<std::endl;
|
|
|
|
ok++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( ok==0 ) std::cout << " OK!" <<std::endl;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main (int argc, char ** argv)
|
|
|
|
{
|
|
|
|
Grid_init(&argc,&argv);
|
|
|
|
|
|
|
|
std::vector<int> simd_layout({1,1,2,2});
|
|
|
|
std::vector<int> mpi_layout ({1,1,1,1});
|
|
|
|
std::vector<int> latt_size ({8,8,8,8});
|
|
|
|
|
|
|
|
GridCartesian Grid(latt_size,simd_layout,mpi_layout);
|
|
|
|
std::vector<int> seeds({1,2,3,4});
|
|
|
|
|
|
|
|
// Insist that operations on random scalars gives
|
|
|
|
// identical results to on vectors.
|
|
|
|
|
|
|
|
std::cout << "==================================="<< std::endl;
|
|
|
|
std::cout << "Testing vComplexF "<<std::endl;
|
|
|
|
std::cout << "==================================="<< std::endl;
|
|
|
|
|
|
|
|
Tester<ComplexF,vComplexF>(funcTimesI());
|
|
|
|
Tester<ComplexF,vComplexF>(funcTimesMinusI());
|
|
|
|
Tester<ComplexF,vComplexF>(funcPlus());
|
|
|
|
Tester<ComplexF,vComplexF>(funcMinus());
|
|
|
|
Tester<ComplexF,vComplexF>(funcTimes());
|
|
|
|
Tester<ComplexF,vComplexF>(funcConj());
|
|
|
|
Tester<ComplexF,vComplexF>(funcAdj());
|
|
|
|
|
|
|
|
std::cout << "==================================="<< std::endl;
|
|
|
|
std::cout << "Testing vComplexD "<<std::endl;
|
|
|
|
std::cout << "==================================="<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
Tester<ComplexD,vComplexD>(funcTimesI());
|
|
|
|
Tester<ComplexD,vComplexD>(funcTimesMinusI());
|
|
|
|
Tester<ComplexD,vComplexD>(funcPlus());
|
|
|
|
Tester<ComplexD,vComplexD>(funcMinus());
|
|
|
|
Tester<ComplexD,vComplexD>(funcTimes());
|
|
|
|
Tester<ComplexD,vComplexD>(funcConj());
|
|
|
|
Tester<ComplexD,vComplexD>(funcAdj());
|
|
|
|
|
|
|
|
std::cout << "==================================="<< std::endl;
|
|
|
|
std::cout << "Testing vRealF "<<std::endl;
|
|
|
|
std::cout << "==================================="<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
Tester<RealF,vRealF>(funcPlus());
|
|
|
|
Tester<RealF,vRealF>(funcMinus());
|
|
|
|
Tester<RealF,vRealF>(funcTimes());
|
|
|
|
Tester<RealF,vRealF>(funcAdj());
|
|
|
|
|
|
|
|
std::cout << "==================================="<< std::endl;
|
|
|
|
std::cout << "Testing vRealD "<<std::endl;
|
|
|
|
std::cout << "==================================="<< std::endl;
|
|
|
|
|
|
|
|
Tester<RealD,vRealD>(funcPlus());
|
|
|
|
Tester<RealD,vRealD>(funcMinus());
|
|
|
|
Tester<RealD,vRealD>(funcTimes());
|
|
|
|
Tester<RealD,vRealD>(funcAdj());
|
|
|
|
|
|
|
|
Grid_finalize();
|
|
|
|
}
|