QUDA  v0.7.0
A library for QCD on GPUs
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
lattice_field.h
Go to the documentation of this file.
1 #ifndef _LATTICE_FIELD_H
2 #define _LATTICE_FIELD_H
3 
4 #include <quda.h>
5 #include <iostream>
6 #include <comm_quda.h>
7 
8 namespace quda {
9 
11  const int maxNface = 3;
12 
13  // LatticeField is an abstract base clase for all Field objects.
14 
15  // Forward declaration of all children
16  class ColorSpinorField;
18  class cpuColorSpinorField;
19 
20  class EigValueSet;
21  class cudaEigValueSet;
22  class cpuEigValueSet;
23 
24  class EigVecSet;
25  class cpuEigVecSet;
26  class cudaEigVecSet;
27 
28  class GaugeField;
29  class cpuGaugeField;
30  class cudaGaugeField;
31 
32  class CloverField;
33  class cudaCloverField;
34  class cpuCloverField;
35 
37  int nDim;
39  int pad;
40 
43 
46  for (int i=0; i<nDim; i++) x[i] = 0;
47  }
48 
50  : nDim(nDim), pad(pad), precision(precision), siteSubset(QUDA_FULL_SITE_SUBSET) {
51  if (nDim > QUDA_MAX_DIM) errorQuda("Number of dimensions too great");
52  for (int i=0; i<nDim; i++) this->x[i] = x[i];
53  }
54 
55  // constructor for creating a cpuGaugeField only
58  for (int i=0; i<nDim; i++) this->x[i] = param.X[i];
59  }
60  };
61 
62  std::ostream& operator<<(std::ostream& output, const LatticeFieldParam& param);
63 
64  class LatticeField {
65 
66  protected:
67  int volume; // lattice volume
68  int volumeCB; // the checkboarded volume
69  int stride;
70  int pad;
71 
72  size_t total_bytes;
73 
75  int nDim;
76 
79 
82 
85 
88 
90  static void *bufferPinned[2];
91 
93  static bool bufferPinnedInit[2];
94 
96  static size_t bufferPinnedBytes[2];
97 
99  void resizeBufferPinned(size_t bytes, const int index=0) const;
100 
102  static size_t bufferPinnedResizeCount;
103 
105  static void *bufferDevice;
106 
108  static bool bufferDeviceInit;
109 
111  static size_t bufferDeviceBytes;
112 
114  void resizeBufferDevice(size_t bytes) const;
115 
116 
117 
118  // The below are additions for inter-GPU communication (merging FaceBuffer functionality)
119 
122 
123  /*
124  The need for persistent message handlers (for GPUDirect support)
125  means that we allocate different message handlers for each number of
126  faces we can send.
127  */
128 
130  void *my_face[2];
133 
135  void *from_face[2];
138 
141 
144 
147 
150 
152  virtual void setTuningString();
154  public:
156  virtual ~LatticeField();
157 
159  static void freeBuffer(int index=0);
160 
161  int Ndim() const { return nDim; }
162  const int* X() const { return x; }
163  int Volume() const { return volume; }
164  int VolumeCB() const { return volumeCB; }
165  const int* SurfaceCB() const { return surfaceCB; }
166  int SurfaceCB(const int i) const { return surfaceCB[i]; }
167  int Stride() const { return stride; }
168  int Pad() const { return pad; }
169 
174  int Nvec() const;
175 
176  QudaPrecision Precision() const { return precision; }
177  QudaFieldLocation Location() const;
178  size_t GBytes() const { return total_bytes / (1<<30); } // returns total storage allocated
179 
180  void checkField(const LatticeField &);
181 
182  virtual void pack(int nFace, int parity, int dagger, cudaStream_t *stream_p, bool zeroCopyPack,
183  double a=0, double b=0)
184  { errorQuda("Not implemented"); }
185 
186  virtual void gather(int nFace, int dagger, int dir, cudaStream_t *stream_p=NULL)
187  { errorQuda("Not implemented"); }
188 
189  virtual void commsStart(int nFace, int dir, int dagger=0)
190  { errorQuda("Not implemented"); }
191 
192  virtual int commsQuery(int nFace, int dir, int dagger=0)
193  { errorQuda("Not implemented"); return 0; }
194 
195  virtual void scatter(int nFace, int dagger, int dir)
196  { errorQuda("Not implemented"); }
197 
199  const char *VolString() const { return vol_string; }
200  };
201 
202 } // namespace quda
203 
204 #endif // _LATTICE_FIELD_H
enum QudaPrecision_s QudaPrecision
int VolumeCB() const
LatticeFieldParam(int nDim, const int *x, int pad, QudaPrecision precision)
Definition: lattice_field.h:49
static bool bufferPinnedInit[2]
Definition: lattice_field.h:93
MsgHandle *** mh_send_back[2]
#define errorQuda(...)
Definition: util_quda.h:73
const int * X() const
QudaFieldLocation Location() const
QudaSiteSubset siteSubset
Definition: lattice_field.h:87
void * my_fwd_face[2][QUDA_MAX_DIM]
int x[QUDA_MAX_DIM]
Definition: lattice_field.h:78
QudaPrecision precision
Definition: lattice_field.h:41
LatticeFieldParam(const QudaGaugeParam &param)
Definition: lattice_field.h:56
virtual void setTuningString()
QudaPrecision cpu_prec
Definition: dslash_test.cpp:34
const int * SurfaceCB() const
size_t GBytes() const
QudaSiteSubset siteSubset
Definition: lattice_field.h:42
std::ostream & operator<<(std::ostream &output, const CloverFieldParam &param)
QudaDagType dagger
Definition: test_util.cpp:1558
QudaGaugeParam param
Definition: pack_test.cpp:17
int Pad() const
int x[QUDA_MAX_DIM]
Definition: lattice_field.h:38
QudaPrecision Precision() const
virtual void pack(int nFace, int parity, int dagger, cudaStream_t *stream_p, bool zeroCopyPack, double a=0, double b=0)
int Volume() const
static void * bufferDevice
__device__ __host__ int index(int i, int j)
Definition: quda_matrix.h:342
virtual int commsQuery(int nFace, int dir, int dagger=0)
void checkField(const LatticeField &)
static void freeBuffer(int index=0)
int Stride() const
const char * VolString() const
MsgHandle *** mh_recv_back[2]
char vol_string[TuneKey::volume_n]
int X[4]
Definition: quda.h:29
enum QudaSiteSubset_s QudaSiteSubset
void * from_fwd_face[2][QUDA_MAX_DIM]
int surface[QUDA_MAX_DIM]
Definition: lattice_field.h:80
enum QudaFieldLocation_s QudaFieldLocation
static size_t bufferPinnedResizeCount
void * from_back_face[2][QUDA_MAX_DIM]
void resizeBufferDevice(size_t bytes) const
virtual void scatter(int nFace, int dagger, int dir)
Main header file for the QUDA library.
int SurfaceCB(const int i) const
void * my_back_face[2][QUDA_MAX_DIM]
int surfaceCB[QUDA_MAX_DIM]
Definition: lattice_field.h:81
static size_t bufferPinnedBytes[2]
Definition: lattice_field.h:96
static size_t bufferDeviceBytes
int Ndim() const
#define QUDA_MAX_DIM
Maximum number of dimensions supported by QUDA. In practice, no routines make use of more than 5...
static const int volume_n
Definition: tune_key.h:10
MsgHandle *** mh_send_fwd[2]
const int maxNface
Definition: lattice_field.h:11
QudaPrecision precision
Definition: lattice_field.h:84
LatticeField(const LatticeFieldParam &param)
virtual void gather(int nFace, int dagger, int dir, cudaStream_t *stream_p=NULL)
virtual void commsStart(int nFace, int dir, int dagger=0)
const QudaParity parity
Definition: dslash_test.cpp:29
void resizeBufferPinned(size_t bytes, const int index=0) const
static void * bufferPinned[2]
Definition: lattice_field.h:90
MsgHandle *** mh_recv_fwd[2]
static bool bufferDeviceInit