mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-10 07:55:35 +00:00
Drop std::vector container for the lattice data
This commit is contained in:
parent
c844cfcda8
commit
214f7a6f13
@ -55,11 +55,24 @@ extern int GridCshiftPermuteMap[4][16];
|
|||||||
// Basic expressions used in Expression Template
|
// Basic expressions used in Expression Template
|
||||||
////////////////////////////////////////////////
|
////////////////////////////////////////////////
|
||||||
|
|
||||||
class LatticeBase
|
// The data inside the lattice class
|
||||||
|
class LatticeBase {};
|
||||||
|
|
||||||
|
template<class vobj> class LatticeAccelerator : public LatticeBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~LatticeBase(void) = default;
|
int checkerboard;
|
||||||
GridBase *_grid;
|
vobj *_odata; // A managed pointer
|
||||||
|
uint64_t _odata_size;
|
||||||
|
// virtual ~LatticeBase(void) = default;
|
||||||
|
accelerator_inline LatticeAccelerator() : checkerboard(0), _odata(nullptr), _odata_size(0) {
|
||||||
|
// std::cout << " Lattice accelerator object "<<this->_odata<<" size "<<this->_odata_size<<std::endl;
|
||||||
|
};
|
||||||
|
accelerator_inline int Checkerboard(void){ return checkerboard; };
|
||||||
|
accelerator_inline uint64_t begin(void) const { return 0;};
|
||||||
|
accelerator_inline uint64_t end(void) const { return _odata_size; };
|
||||||
|
accelerator_inline vobj & operator[](size_t i) { return _odata[i]; };
|
||||||
|
accelerator_inline const vobj & operator[](size_t i) const { return _odata[i]; };
|
||||||
};
|
};
|
||||||
|
|
||||||
class LatticeExpressionBase {};
|
class LatticeExpressionBase {};
|
||||||
@ -88,32 +101,61 @@ void inline conformable(GridBase *lhs,GridBase *rhs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class vobj>
|
template<class vobj>
|
||||||
class Lattice : public LatticeBase
|
class Lattice : public LatticeAccelerator<vobj>
|
||||||
{
|
{
|
||||||
private:
|
public: // Move to private and fix
|
||||||
// vobj * _odata_p;
|
GridBase *_grid;
|
||||||
// uint64_t _odata_size;
|
|
||||||
public:
|
|
||||||
int checkerboard;
|
|
||||||
Vector<vobj> _odata;
|
|
||||||
|
|
||||||
// to pthread need a computable loop where loop induction is not required
|
|
||||||
accelerator int begin(void) const { return 0;};
|
|
||||||
accelerator int end(void) const { return _odata.size(); }
|
|
||||||
accelerator_inline vobj & operator[](int i) { return _odata[i]; };
|
|
||||||
accelerator_inline const vobj & operator[](int i) const { return _odata[i]; };
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
///////////////////////////////////////////////////
|
||||||
|
// Member types
|
||||||
|
///////////////////////////////////////////////////
|
||||||
typedef typename vobj::scalar_type scalar_type;
|
typedef typename vobj::scalar_type scalar_type;
|
||||||
typedef typename vobj::vector_type vector_type;
|
typedef typename vobj::vector_type vector_type;
|
||||||
typedef vobj vector_object;
|
typedef vobj vector_object;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void dealloc(void)
|
||||||
|
{
|
||||||
|
alignedAllocator<vobj> alloc;
|
||||||
|
// std::cout << " deallocating lattice "<<this << " odata " <<this->_odata<<" size "<<this->_odata_size<<std::endl;
|
||||||
|
// // BACKTRACE();
|
||||||
|
if( this->_odata_size ) {
|
||||||
|
alloc.deallocate(this->_odata,this->_odata_size);
|
||||||
|
this->_odata=nullptr;
|
||||||
|
this->_odata_size=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
void resize(uint64_t size)
|
void resize(uint64_t size)
|
||||||
{
|
{
|
||||||
_odata.resize(size);
|
alignedAllocator<vobj> alloc;
|
||||||
// _odata_p = &_odata[0];
|
if ( this->_odata_size != size ) {
|
||||||
// _odata_size = size;
|
dealloc();
|
||||||
}
|
}
|
||||||
|
this->_odata_size = size;
|
||||||
|
if ( size )
|
||||||
|
this->_odata = alloc.allocate(this->_odata_size);
|
||||||
|
else
|
||||||
|
this->_odata = nullptr;
|
||||||
|
|
||||||
|
// std::cout << " allocated lattice "<<this << " odata " <<this->_odata<<" size "<<this->_odata_size<<std::endl;
|
||||||
|
// // BACKTRACE();
|
||||||
|
}
|
||||||
|
void copy_vec(vobj *ptr,uint64_t count)
|
||||||
|
{
|
||||||
|
dealloc();
|
||||||
|
this->_odata = ptr;
|
||||||
|
assert(this->_odata_size == count);
|
||||||
|
// std::cout << " copied lattice "<<this->_odata<<" size "<<this->_odata_size<<std::endl;
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
~Lattice() {
|
||||||
|
if ( this->_odata_size ) {
|
||||||
|
// std::cout << " deleting lattice this"<<this << " odata " <<this->_odata<<" size "<<this->_odata_size<<std::endl;
|
||||||
|
// // BACKTRACE();
|
||||||
|
dealloc();
|
||||||
|
// std::cout << " deleted lattice this"<<this<< " odata "<<this->_odata<<" size "<<this->_odata_size<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Expression Template closure support
|
// Expression Template closure support
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -127,16 +169,16 @@ public:
|
|||||||
int cb=-1;
|
int cb=-1;
|
||||||
CBFromExpression(cb,expr);
|
CBFromExpression(cb,expr);
|
||||||
assert( (cb==Odd) || (cb==Even));
|
assert( (cb==Odd) || (cb==Even));
|
||||||
checkerboard=cb;
|
this->checkerboard=cb;
|
||||||
|
|
||||||
#ifdef STREAMING_STORES
|
#ifdef STREAMING_STORES
|
||||||
accelerator_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
vobj tmp = eval(ss,expr);
|
vobj tmp = eval(ss,expr);
|
||||||
vstream(_odata[ss] ,tmp);
|
vstream(this->_odata[ss] ,tmp);
|
||||||
});
|
});
|
||||||
#else
|
#else
|
||||||
accelerator_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
_odata[ss]=eval(ss,expr);
|
this->_odata[ss]=eval(ss,expr);
|
||||||
});
|
});
|
||||||
#endif
|
#endif
|
||||||
return *this;
|
return *this;
|
||||||
@ -151,16 +193,16 @@ public:
|
|||||||
int cb=-1;
|
int cb=-1;
|
||||||
CBFromExpression(cb,expr);
|
CBFromExpression(cb,expr);
|
||||||
assert( (cb==Odd) || (cb==Even));
|
assert( (cb==Odd) || (cb==Even));
|
||||||
checkerboard=cb;
|
this->checkerboard=cb;
|
||||||
|
|
||||||
#ifdef STREAMING_STORES
|
#ifdef STREAMING_STORES
|
||||||
accelerator_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
vobj tmp = eval(ss,expr);
|
vobj tmp = eval(ss,expr);
|
||||||
vstream(_odata[ss] ,tmp);
|
vstream(this->_odata[ss] ,tmp);
|
||||||
});
|
});
|
||||||
#else
|
#else
|
||||||
accelerator_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
_odata[ss]=eval(ss,expr);
|
this->_odata[ss]=eval(ss,expr);
|
||||||
});
|
});
|
||||||
#endif
|
#endif
|
||||||
return *this;
|
return *this;
|
||||||
@ -175,16 +217,16 @@ public:
|
|||||||
int cb=-1;
|
int cb=-1;
|
||||||
CBFromExpression(cb,expr);
|
CBFromExpression(cb,expr);
|
||||||
assert( (cb==Odd) || (cb==Even));
|
assert( (cb==Odd) || (cb==Even));
|
||||||
checkerboard=cb;
|
this->checkerboard=cb;
|
||||||
|
|
||||||
#ifdef STREAMING_STORES
|
#ifdef STREAMING_STORES
|
||||||
accelerator_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
//vobj tmp = eval(ss,expr);
|
vobj tmp = eval(ss,expr);
|
||||||
vstream(_odata[ss] ,eval(ss,expr));
|
vstream(this->_odata[ss] ,tmp);
|
||||||
});
|
});
|
||||||
#else
|
#else
|
||||||
accelerator_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
_odata[ss] = eval(ss,expr);
|
this->_odata[ss] = eval(ss,expr);
|
||||||
});
|
});
|
||||||
#endif
|
#endif
|
||||||
return *this;
|
return *this;
|
||||||
@ -199,17 +241,16 @@ public:
|
|||||||
int cb=-1;
|
int cb=-1;
|
||||||
CBFromExpression(cb,expr);
|
CBFromExpression(cb,expr);
|
||||||
assert( (cb==Odd) || (cb==Even));
|
assert( (cb==Odd) || (cb==Even));
|
||||||
checkerboard=cb;
|
this->checkerboard=cb;
|
||||||
|
|
||||||
resize(_grid->oSites());
|
resize(_grid->oSites());
|
||||||
#ifdef STREAMING_STORES
|
#ifdef STREAMING_STORES
|
||||||
cpu_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
vobj tmp = eval(ss,expr);
|
vstream(this->_odata[ss] ,eval(ss,expr));
|
||||||
vstream(_odata[ss] ,tmp);
|
|
||||||
});
|
});
|
||||||
#else
|
#else
|
||||||
cpu_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
_odata[ss]=eval(ss,expr);
|
this->_odata[ss]=eval(ss,expr);
|
||||||
});
|
});
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -218,22 +259,21 @@ public:
|
|||||||
_grid = nullptr;
|
_grid = nullptr;
|
||||||
GridFromExpression(_grid,expr);
|
GridFromExpression(_grid,expr);
|
||||||
assert(_grid!=nullptr);
|
assert(_grid!=nullptr);
|
||||||
|
resize(_grid->oSites());
|
||||||
|
|
||||||
int cb=-1;
|
int cb=-1;
|
||||||
CBFromExpression(cb,expr);
|
CBFromExpression(cb,expr);
|
||||||
assert( (cb==Odd) || (cb==Even));
|
assert( (cb==Odd) || (cb==Even));
|
||||||
checkerboard=cb;
|
this->checkerboard=cb;
|
||||||
|
|
||||||
resize(_grid->oSites());
|
|
||||||
|
|
||||||
#ifdef STREAMING_STORES
|
#ifdef STREAMING_STORES
|
||||||
cpu_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
vobj tmp = eval(ss,expr);
|
vobj tmp = eval(ss,expr);
|
||||||
vstream(_odata[ss] ,tmp);
|
vstream(this->_odata[ss] ,tmp);
|
||||||
});
|
});
|
||||||
#else
|
#else
|
||||||
cpu_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
_odata[ss]=eval(ss,expr);
|
this->_odata[ss]=eval(ss,expr);
|
||||||
});
|
});
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -246,46 +286,24 @@ public:
|
|||||||
int cb=-1;
|
int cb=-1;
|
||||||
CBFromExpression(cb,expr);
|
CBFromExpression(cb,expr);
|
||||||
assert( (cb==Odd) || (cb==Even));
|
assert( (cb==Odd) || (cb==Even));
|
||||||
checkerboard=cb;
|
this->checkerboard=cb;
|
||||||
|
|
||||||
resize(_grid->oSites());
|
resize(_grid->oSites());
|
||||||
cpu_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
vstream(_odata[ss] ,eval(ss,expr));
|
vstream(this->_odata[ss] ,eval(ss,expr));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
// virtual ~Lattice(void) = default;
|
||||||
// Constructor requires "grid" passed.
|
/*
|
||||||
// what about a default grid?
|
|
||||||
//////////////////////////////////////////////////////////////////
|
|
||||||
Lattice(GridBase *grid) {
|
|
||||||
_grid = grid;
|
|
||||||
resize(grid->oSites());
|
|
||||||
assert((((uint64_t)&_odata[0])&0xF) ==0);
|
|
||||||
checkerboard=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Lattice(const Lattice& r){ // copy constructor
|
|
||||||
_grid = r._grid;
|
|
||||||
checkerboard = r.checkerboard;
|
|
||||||
resize(_grid->oSites());// essential
|
|
||||||
cpu_loop(ss,(*this),{
|
|
||||||
_odata[ss]=r._odata[ss];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual ~Lattice(void) = default;
|
|
||||||
|
|
||||||
void reset(GridBase* grid) {
|
void reset(GridBase* grid) {
|
||||||
if (_grid != grid) {
|
if (_grid != grid) {
|
||||||
_grid = grid;
|
_grid = grid;
|
||||||
resize(grid->oSites());
|
resize(grid->oSites());
|
||||||
checkerboard = 0;
|
this->checkerboard = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
template<class sobj> inline Lattice<vobj> & operator = (const sobj & r){
|
template<class sobj> inline Lattice<vobj> & operator = (const sobj & r){
|
||||||
accelerator_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
@ -293,8 +311,40 @@ public:
|
|||||||
});
|
});
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
// Follow rule of five, with Constructor requires "grid" passed
|
||||||
|
// to user defined constructor
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
Lattice(GridBase *grid) { // user defined constructor
|
||||||
|
_grid = grid;
|
||||||
|
// std::cout << "Lattice constructor(grid)"<<std::endl;
|
||||||
|
resize(grid->oSites());
|
||||||
|
assert((((uint64_t)&this->_odata[0])&0xF) ==0);
|
||||||
|
this->checkerboard=0;
|
||||||
|
}
|
||||||
|
Lattice(const Lattice& r){ // copy constructor
|
||||||
|
// std::cout << "Lattice constructor(const Lattice &) "<<this<<std::endl;
|
||||||
|
_grid = r._grid;
|
||||||
|
resize(r._odata_size);
|
||||||
|
this->checkerboard = r.checkerboard;
|
||||||
|
accelerator_loop(ss,(*this),{
|
||||||
|
this->_odata[ss]=r._odata[ss];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Lattice(Lattice && r){ // move constructor
|
||||||
|
// std::cout << "Lattice move constructor(Lattice &) "<<this<<std::endl;
|
||||||
|
_grid = r._grid;
|
||||||
|
this->_odata = r._odata;
|
||||||
|
this->_odata_size = r._odata_size;
|
||||||
|
this->checkerboard= r.checkerboard;
|
||||||
|
r._odata = nullptr;
|
||||||
|
r._odata_size = 0;
|
||||||
|
}
|
||||||
|
// assignment template
|
||||||
template<class robj> inline Lattice<vobj> & operator = (const Lattice<robj> & r){
|
template<class robj> inline Lattice<vobj> & operator = (const Lattice<robj> & r){
|
||||||
|
// std::cout << "Lattice = (Lattice &)"<<std::endl;
|
||||||
|
typename std::enable_if<!std::is_same<robj,vobj>::value,int>::type i=0;
|
||||||
this->checkerboard = r.checkerboard;
|
this->checkerboard = r.checkerboard;
|
||||||
conformable(*this,r);
|
conformable(*this,r);
|
||||||
accelerator_loop(ss,(*this),{
|
accelerator_loop(ss,(*this),{
|
||||||
@ -302,6 +352,33 @@ public:
|
|||||||
});
|
});
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
// Copy assignment
|
||||||
|
inline Lattice<vobj> & operator = (const Lattice<vobj> & r){
|
||||||
|
// std::cout << "Lattice = (Lattice &)"<<std::endl;
|
||||||
|
this->checkerboard = r.checkerboard;
|
||||||
|
conformable(*this,r);
|
||||||
|
accelerator_loop(ss,(*this),{
|
||||||
|
this->_odata[ss]=r._odata[ss];
|
||||||
|
});
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
// Move assignment if same type
|
||||||
|
inline Lattice<vobj> & operator = (Lattice<vobj> && r){
|
||||||
|
// std::cout << "Lattice = (Lattice &&)"<<std::endl;
|
||||||
|
resize(0); // delete if appropriate
|
||||||
|
|
||||||
|
this->_grid = r._grid;
|
||||||
|
this->checkerboard = r.checkerboard;
|
||||||
|
|
||||||
|
this->_odata = r._odata;
|
||||||
|
this->_odata_size = r._odata_size;
|
||||||
|
this->checkerboard= r.checkerboard;
|
||||||
|
|
||||||
|
r._odata = nullptr;
|
||||||
|
r._odata_size = 0;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
// *=,+=,-= operators inherit behvour from correspond */+/- operation
|
// *=,+=,-= operators inherit behvour from correspond */+/- operation
|
||||||
template<class T> inline Lattice<vobj> &operator *=(const T &r) {
|
template<class T> inline Lattice<vobj> &operator *=(const T &r) {
|
||||||
@ -318,7 +395,7 @@ public:
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
}; // class Lattice
|
}; // class Lattice
|
||||||
|
|
||||||
template<class vobj> std::ostream& operator<< (std::ostream& stream, const Lattice<vobj> &o){
|
template<class vobj> std::ostream& operator<< (std::ostream& stream, const Lattice<vobj> &o){
|
||||||
std::vector<int> gcoor;
|
std::vector<int> gcoor;
|
||||||
typedef typename vobj::scalar_object sobj;
|
typedef typename vobj::scalar_object sobj;
|
||||||
|
Loading…
Reference in New Issue
Block a user