mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-10 07:55:35 +00:00
Removed superfluous implementation of G-parity twist for hand-unrolled kernel from GparityWilsonImpl
This commit is contained in:
parent
a0bb8e5b46
commit
ce5df177ee
@ -478,10 +478,7 @@ class GparityWilsonImpl : public ConjugateGaugeImpl<GaugeImplTypes<S, Nrepresent
|
||||
|
||||
ImplParams Params;
|
||||
|
||||
std::vector<SiteSpinor, alignedAllocator<SiteSpinor> > tmp_full;
|
||||
std::vector<SiteHalfSpinor, alignedAllocator<SiteHalfSpinor> > tmp_half;
|
||||
|
||||
GparityWilsonImpl(const ImplParams &p = ImplParams()) : Params(p), tmp_full(GridThread::GetThreads()), tmp_half(GridThread::GetThreads()){};
|
||||
GparityWilsonImpl(const ImplParams &p = ImplParams()) : Params(p){};
|
||||
|
||||
bool overlapCommsCompute(void) { return Params.overlapCommsCompute; };
|
||||
|
||||
@ -563,86 +560,6 @@ class GparityWilsonImpl : public ConjugateGaugeImpl<GaugeImplTypes<S, Nrepresent
|
||||
reg = memory;
|
||||
}
|
||||
|
||||
template<typename SiteSpinorType>
|
||||
void GparityTwistPermute(SiteSpinorType &into, const SiteSpinorType &from, const int direction, const int distance, const int perm, GridBase* grid){
|
||||
#if 0
|
||||
typedef typename SiteSpinorType::scalar_object sobj;
|
||||
sobj stmp;
|
||||
std::vector<sobj> vals(grid->Nsimd());
|
||||
extract(from,vals);
|
||||
std::vector<int> icoor;
|
||||
for(int s=0;s<grid->Nsimd();s++){
|
||||
grid->iCoorFromIindex(icoor,s);
|
||||
assert((icoor[direction]==0)||(icoor[direction]==1));
|
||||
|
||||
int permute_lane;
|
||||
if ( distance == 1) {
|
||||
permute_lane = icoor[direction]?1:0;
|
||||
} else {
|
||||
permute_lane = icoor[direction]?0:1;
|
||||
}
|
||||
if(perm) permute_lane = !permute_lane;
|
||||
|
||||
if ( permute_lane ) {
|
||||
stmp(0) = vals[s](1);
|
||||
stmp(1) = vals[s](0);
|
||||
vals[s] = stmp;
|
||||
}
|
||||
}
|
||||
merge(into,vals);
|
||||
#else
|
||||
int permute_type = grid->PermuteType(direction);
|
||||
typedef typename SiteSpinorType::vector_type vtype;
|
||||
vtype tmp1, tmp2, tmp3, tmp4;
|
||||
|
||||
for(int s=0;s<Ns;s++){
|
||||
for(int c=0;c<Nrepresentation;c++){
|
||||
permute(tmp1, from(1)(s)(c), permute_type); //1l 1h -> 1h 1l
|
||||
exchange(tmp2,tmp3, from(0)(s)(c), tmp1, permute_type); // 0l 0h , 1h 1l -> 0l 1h 0h,1l
|
||||
permute(tmp4, tmp3, permute_type); //0h,1l -> 1l,0h
|
||||
|
||||
if( (distance == 1 && !perm) || (distance == -1 && perm) ){
|
||||
//Pulled fermion through forwards face, GPBC on upper component
|
||||
//Need 0= 0l 1h 1= 1l 0h
|
||||
into(0)(s)(c) = tmp2;
|
||||
into(1)(s)(c) = tmp4;
|
||||
}else if( (distance == -1 && !perm) || (distance == 1 && perm) ){
|
||||
//Pulled fermion through backwards face, GPBC on lower component
|
||||
//Need 0= 1l 0h 1= 0l 1h
|
||||
into(0)(s)(c) = tmp4;
|
||||
into(1)(s)(c) = tmp2;
|
||||
}else assert(0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
template<typename SiteSpinorType>
|
||||
const SiteSpinorType & GparityGetChi(int &g, SiteSpinorType const* in, const int dir, const int f, StencilEntry *SE, StencilImpl &st){
|
||||
const int mmu = dir % 4;
|
||||
const int direction = st._directions[dir];
|
||||
const int sl = st._grid->_simd_layout[direction];
|
||||
const int perm = SE->_permute;
|
||||
g = f;
|
||||
|
||||
if(SE->_around_the_world && Params.twists[mmu]){
|
||||
if(sl == 1){ //not SIMD vectorized in G-parity direction so just change the flavor index accessed to implement the twist
|
||||
g = (f+1) % 2;
|
||||
return in[SE->_offset];
|
||||
}else{ //SIMD vectorized in Gparity direction
|
||||
const int me = omp_get_thread_num();
|
||||
const int distance = st._distances[dir];
|
||||
assert(distance == -1 || distance == 1);
|
||||
SiteSpinorType &tmp = GparityWilsonImpl_helper::getAB<SiteSpinorType, SiteSpinor, SiteHalfSpinor>::ref(tmp_full[me], tmp_half[me]);
|
||||
GparityTwistPermute<SiteSpinorType>(tmp, in[SE->_offset], direction, distance, perm, st._grid);
|
||||
return tmp;
|
||||
}
|
||||
}else return in[SE->_offset];
|
||||
}
|
||||
|
||||
|
||||
|
||||
inline void DoubleStore(GridBase *GaugeGrid,DoubledGaugeField &Uds,const GaugeField &Umu)
|
||||
{
|
||||
conformable(Uds._grid,GaugeGrid);
|
||||
|
@ -59,14 +59,6 @@ Author: paboyle <paboyle@ph.ed.ac.uk>
|
||||
{const SiteHalfSpinor &ref(buf[offset]); LOAD_CHI_BODY(F); }
|
||||
|
||||
|
||||
//G-parity implementations using implementation method
|
||||
#define LOAD_CHIMU_GPARITY_IMPL(DIR,F) \
|
||||
{ int g; const SiteSpinor & ref = GparityGetChi<SiteSpinor>(g,in._odata.data(),DIR,F,SE,st); LOAD_CHIMU_BODY(g); }
|
||||
|
||||
#define LOAD_CHI_GPARITY_IMPL(DIR,F) \
|
||||
{ int g; const SiteHalfSpinor &ref = GparityGetChi<SiteHalfSpinor>(g,buf,DIR,F,SE,st); LOAD_CHI_BODY(g); }
|
||||
|
||||
|
||||
//G-parity implementations using in-place intrinsic ops
|
||||
|
||||
//1l 1h -> 1h 1l
|
||||
@ -156,13 +148,7 @@ Author: paboyle <paboyle@ph.ed.ac.uk>
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//#define LOAD_CHI_GPARITY(DIR,F) LOAD_CHI_GPARITY_IMPL(DIR,F)
|
||||
#define LOAD_CHI_GPARITY(DIR,F) LOAD_CHI_GPARITY_INPLACE_TWIST(DIR,F)
|
||||
|
||||
//#define LOAD_CHIMU_GPARITY(DIR,F) LOAD_CHIMU_GPARITY_IMPL(DIR,F)
|
||||
#define LOAD_CHIMU_GPARITY(DIR,F) LOAD_CHIMU_GPARITY_INPLACE_TWIST(DIR,F)
|
||||
|
||||
// To splat or not to splat depends on the implementation
|
||||
|
Loading…
Reference in New Issue
Block a user