mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-09 23:45:36 +00:00
QPX Integer reduction (+ integer reduction test)
This commit is contained in:
parent
2ad54c5a02
commit
735cbdb983
@ -540,10 +540,13 @@ namespace Optimization {
|
||||
|
||||
//Integer Reduce
|
||||
template<>
|
||||
inline Integer Reduce<Integer, int>::operator()(int in){
|
||||
// FIXME unimplemented
|
||||
printf("Reduce : Missing integer implementation -> FIX\n");
|
||||
assert(0);
|
||||
inline Integer Reduce<Integer, veci>::operator()(veci in){
|
||||
Integer a = 0;
|
||||
for (unsigned int i = 0; i < W<Integer>::r; ++i)
|
||||
{
|
||||
a += in.v[i];
|
||||
}
|
||||
return a;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -183,8 +183,6 @@ void IntTester(const functor &func)
|
||||
{
|
||||
typedef Integer scal;
|
||||
typedef vInteger vec;
|
||||
GridSerialRNG sRNG;
|
||||
sRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}));
|
||||
|
||||
int Nsimd = vec::Nsimd();
|
||||
|
||||
@ -287,6 +285,50 @@ void ReductionTester(const functor &func)
|
||||
}
|
||||
|
||||
|
||||
template<class reduced,class scal, class vec,class functor >
|
||||
void IntReductionTester(const functor &func)
|
||||
{
|
||||
int Nsimd = vec::Nsimd();
|
||||
|
||||
std::vector<scal> input1(Nsimd);
|
||||
std::vector<scal> input2(Nsimd);
|
||||
reduced result(0);
|
||||
reduced reference(0);
|
||||
reduced tmp;
|
||||
|
||||
std::vector<vec,alignedAllocator<vec> > buf(3);
|
||||
vec & v_input1 = buf[0];
|
||||
vec & v_input2 = buf[1];
|
||||
|
||||
for(int i=0;i<Nsimd;i++){
|
||||
input1[i] = (i + 1) * 30;
|
||||
input2[i] = (i + 1) * 20;
|
||||
}
|
||||
|
||||
merge<vec,scal>(v_input1,input1);
|
||||
merge<vec,scal>(v_input2,input2);
|
||||
|
||||
func.template vfunc<reduced,vec>(result,v_input1,v_input2);
|
||||
|
||||
for(int i=0;i<Nsimd;i++) {
|
||||
func.template sfunc<reduced,scal>(tmp,input1[i],input2[i]);
|
||||
reference+=tmp;
|
||||
}
|
||||
|
||||
std::cout<<GridLogMessage << " " << func.name()<<std::endl;
|
||||
|
||||
int ok=0;
|
||||
if ( reference-result != 0 ){
|
||||
std::cout<<GridLogMessage<< "*****" << std::endl;
|
||||
std::cout<<GridLogMessage<< reference-result << " " <<reference<< " " << result<<std::endl;
|
||||
ok++;
|
||||
}
|
||||
if ( ok==0 ) {
|
||||
std::cout<<GridLogMessage << " OK!" <<std::endl;
|
||||
}
|
||||
assert(ok==0);
|
||||
}
|
||||
|
||||
|
||||
class funcPermute {
|
||||
public:
|
||||
@ -691,6 +733,7 @@ int main (int argc, char ** argv)
|
||||
IntTester(funcPlus());
|
||||
IntTester(funcMinus());
|
||||
IntTester(funcTimes());
|
||||
IntReductionTester<Integer, Integer, vInteger>(funcReduce());
|
||||
|
||||
std::cout<<GridLogMessage << "==================================="<< std::endl;
|
||||
std::cout<<GridLogMessage << "Testing precisionChange "<< std::endl;
|
||||
|
Loading…
Reference in New Issue
Block a user