Grid 0.7.0
SimpleCompressor.h
Go to the documentation of this file.
1#ifndef _STENCIL_SIMPLE_COMPRESSOR_H_
2#define _STENCIL_SIMPLE_COMPRESSOR_H_
3
5
12
13
14// Compressors will inherit buffer management policies
15// Standard comms buffer management
17{
18public:
19 static int PartialCompressionFactor(GridBase *grid) {return 1;};
20 // Decompress is after merge so ok
21 template<class vobj,class cobj,class compressor>
22 static void Gather_plane_simple (deviceVector<std::pair<int,int> >& table,
23 const Lattice<vobj> &rhs,
24 cobj *buffer,
25 compressor &compress,
26 int off,int so,int partial)
27 {
28 int num=table.size();
29 std::pair<int,int> *table_v = & table[0];
30
31 auto rhs_v = rhs.View(AcceleratorRead);
32 accelerator_forNB( i,num, vobj::Nsimd(), {
33 compress.Compress(buffer[off+table_v[i].first],rhs_v[so+table_v[i].second]);
34 });
35 rhs_v.ViewClose();
36 }
37 template<class vobj,class cobj,class compressor>
38 static void Gather_plane_exchange(deviceVector<std::pair<int,int> >& table,const Lattice<vobj> &rhs,
39 std::vector<cobj *> pointers,int dimension,int plane,int cbmask,
40 compressor &compress,int type,int partial)
41 {
42 assert( (table.size()&0x1)==0);
43 int num=table.size()/2;
44 int so = plane*rhs.Grid()->_ostride[dimension]; // base offset for start of plane
45
46 auto rhs_v = rhs.View(AcceleratorRead);
47 auto p0=&pointers[0][0];
48 auto p1=&pointers[1][0];
49 auto tp=&table[0];
50 auto rhs_p = &rhs_v[0];
51 accelerator_forNB(j, num, vobj::Nsimd(), {
52 compress.CompressExchange(p0[j],p1[j],
53 rhs_p[so+tp[2*j ].second],
54 rhs_p[so+tp[2*j+1].second],
55 type);
56 });
57 rhs_v.ViewClose();
58 }
59
60 template<class decompressor,class Decompression>
61 static void DecompressFace(decompressor decompress,Decompression &dd)
62 {
63 auto kp = dd.kernel_p;
64 auto mp = dd.mpi_p;
65 accelerator_forNB(o,dd.buffer_size,1,{
66 decompress.Decompress(kp[o],mp[o]);
67 });
68 }
69 template<class decompressor,class Merger>
70 static void MergeFace(decompressor decompress,Merger &mm)
71 {
72 auto mp = &mm.mpointer[0];
73 auto vp0= &mm.vpointers[0][0];
74 auto vp1= &mm.vpointers[1][0];
75 auto type= mm.type;
76 accelerator_forNB(o,mm.buffer_size/2,Merger::Nsimd,{
77 decompress.Exchange(mp[2*o],mp[2*o+1],vp0[o],vp1[o],type);
78 });
79 }
80};
81
83// Wilson compressor will add alternate policies for Dirichlet
84// and possibly partial Dirichlet for DWF
86
87template<class vobj,class FaceGather>
88class SimpleCompressorGather : public FaceGather {
89public:
90 void Point(int) {};
91 accelerator_inline int CommDatumSize(void) const { return sizeof(vobj); }
92 accelerator_inline bool DecompressionStep(void) const { return false; }
93 accelerator_inline void Compress(vobj &buf,const vobj &in) const {
95 }
96 accelerator_inline void Exchange(vobj &mp0,vobj &mp1,vobj &vp0,vobj &vp1,Integer type) const {
97#ifdef GRID_SIMT
98 exchangeSIMT(mp0,mp1,vp0,vp1,type);
99#else
100 exchange(mp0,mp1,vp0,vp1,type);
101#endif
102 }
103 accelerator_inline void Decompress(vobj &out,vobj &in) const { };
104 accelerator_inline void CompressExchange(vobj &out0,vobj &out1,const vobj &in0,const vobj &in1,int type) const {
105#ifdef GRID_SIMT
106 exchangeSIMT(out0,out1,in0,in1,type);
107#else
108 exchange(out0,out1,in0,in1,type);
109#endif
110 }
111 // For cshift. Cshift should drop compressor coupling altogether
112 // because I had to decouple the code from the Stencil anyway
113 accelerator_inline vobj operator() (const vobj &arg) const {
114 return arg;
115 }
116};
117
118// Standard compressor never needs dirichlet.
119//
120// Get away with a local period wrap and rely on dirac operator to use a zero gauge link as it is faster
121//
122// Compressors that inherit Dirichlet and Non-dirichlet behaviour.
123//
124// Currently run-time behaviour through StencilParameters paramaters, p.dirichlet
125// combined with the FaceGatherSimple behaviour
126
128//template <class vobj> using SimpleCompressorDirichlet = SimpleCompressorGather<vobj,FaceGatherDirichlet>;
129
131
132#endif
#define accelerator_forNB(iterator, num, nsimd,...)
#define accelerator_inline
std::vector< T, devAllocator< T > > deviceVector
AcceleratorVector< int, MaxDims > Coordinate
Definition Coordinate.h:95
@ AcceleratorRead
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
uint32_t Integer
Definition Simd.h:58
SimpleCompressorGather< vobj, FaceGatherSimple > SimpleCompressor
accelerator_inline void coalescedWrite(vobj &__restrict__ vec, const vobj &__restrict__ extracted, int lane=0)
Definition Tensor_SIMT.h:87
accelerator_inline void exchangeSIMT(vobj &mp0, vobj &mp1, const vobj &vp0, const vobj &vp1, Integer type)
Definition Tensor_SIMT.h:38
accelerator_inline vobj coalescedRead(const vobj &__restrict__ vec, int lane=0)
Definition Tensor_SIMT.h:61
static void MergeFace(decompressor decompress, Merger &mm)
static void Gather_plane_exchange(deviceVector< std::pair< int, int > > &table, const Lattice< vobj > &rhs, std::vector< cobj * > pointers, int dimension, int plane, int cbmask, compressor &compress, int type, int partial)
static void Gather_plane_simple(deviceVector< std::pair< int, int > > &table, const Lattice< vobj > &rhs, cobj *buffer, compressor &compress, int off, int so, int partial)
static int PartialCompressionFactor(GridBase *grid)
static void DecompressFace(decompressor decompress, Decompression &dd)
Coordinate _ostride
LatticeView< vobj > View(ViewMode mode) const
GridBase * Grid(void) const
accelerator_inline void Exchange(vobj &mp0, vobj &mp1, vobj &vp0, vobj &vp1, Integer type) const
accelerator_inline bool DecompressionStep(void) const
accelerator_inline void CompressExchange(vobj &out0, vobj &out1, const vobj &in0, const vobj &in1, int type) const
accelerator_inline int CommDatumSize(void) const
accelerator_inline vobj operator()(const vobj &arg) const
accelerator_inline void Compress(vobj &buf, const vobj &in) const
accelerator_inline void Decompress(vobj &out, vobj &in) const