QUDA  v0.5.0
A library for QCD on GPUs
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
clover_field.h
Go to the documentation of this file.
1 #ifndef _CLOVER_QUDA_H
2 #define _CLOVER_QUDA_H
3 
4 #include <quda_internal.h>
5 #include <lattice_field.h>
6 
7 namespace quda {
8 
10 
11  };
12 
13  class CloverField : public LatticeField {
14 
15  protected:
16  size_t bytes; // bytes allocated per clover full field
17  size_t norm_bytes; // sizeof each norm full field
18  int length;
20  int nColor;
21  int nSpin;
22 
23  public:
25  virtual ~CloverField();
26  };
27 
28  class cudaCloverField : public CloverField {
29 
30  private:
31  void *clover, *even, *odd;
32  void *norm, *evenNorm, *oddNorm;
33 
34  void *cloverInv, *evenInv, *oddInv;
35  void *invNorm, *evenInvNorm, *oddInvNorm;
36 
37  void loadCPUField(void *d_clover, void *d_norm, const void *h_clover,
38  const QudaPrecision cpu_prec, const CloverFieldOrder order);
39  void loadParityField(void *d_clover, void *d_norm, const void *h_clover,
40  const QudaPrecision cpu_prec, const CloverFieldOrder cpu_order);
41  void loadFullField(void *d_even, void *d_even_norm, void *d_odd, void *d_odd_norm,
42  const void *h_clover, const QudaPrecision cpu_prec, const CloverFieldOrder cpu_order);
43 
44  // computes the clover field given the input gauge field
45  void compute(const cudaGaugeField &gauge);
46 
47 #ifdef USE_TEXTURE_OBJECTS
48  cudaTextureObject_t evenTex;
49  cudaTextureObject_t evenNormTex;
50  cudaTextureObject_t oddTex;
51  cudaTextureObject_t oddNormTex;
52  cudaTextureObject_t evenInvTex;
53  cudaTextureObject_t evenInvNormTex;
54  cudaTextureObject_t oddInvTex;
55  cudaTextureObject_t oddInvNormTex;
56  void createTexObject(cudaTextureObject_t &tex, cudaTextureObject_t &texNorm, void *field, void *norm);
57  void destroyTexObject();
58 #endif
59 
60  public:
61  // create a cudaCloverField from a cpu pointer
62  cudaCloverField(const void *h_clov, const void *h_clov_inv,
63  const QudaPrecision cpu_prec,
64  const QudaCloverFieldOrder cpu_order,
65  const CloverFieldParam &param);
66 
67  // create a cudaCloverField from a cudaGaugeField
68  cudaCloverField(const cudaGaugeField &gauge, const CloverFieldParam &param);
69  virtual ~cudaCloverField();
70 
71 #ifdef USE_TEXTURE_OBJECTS
72  const cudaTextureObject_t& EvenTex() const { return evenTex; }
73  const cudaTextureObject_t& EvenNormTex() const { return evenNormTex; }
74  const cudaTextureObject_t& OddTex() const { return oddTex; }
75  const cudaTextureObject_t& OddNormTex() const { return oddNormTex; }
76  const cudaTextureObject_t& EvenInvTex() const { return evenInvTex; }
77  const cudaTextureObject_t& EvenInvNormTex() const { return evenInvNormTex; }
78  const cudaTextureObject_t& OddInvTex() const { return oddInvTex; }
79  const cudaTextureObject_t& OddInvNormTex() const { return oddInvNormTex; }
80 #endif
81 
82  friend class DiracClover;
83  friend class DiracCloverPC;
84  friend struct FullClover;
85  };
86 
87  // this is a place holder for a future host-side clover object
89 
90  private:
91 
92  public:
94  virtual ~cpuCloverField() = 0;
95  };
96 
97  // lightweight struct used to send pointers to cuda driver code
98  struct FullClover {
99  void *even;
100  void *odd;
101  void *evenNorm;
102  void *oddNorm;
104  size_t bytes; // sizeof each clover field (per parity)
105  size_t norm_bytes; // sizeof each norm field (per parity)
106 
107 #ifdef USE_TEXTURE_OBJECTS
108  const cudaTextureObject_t &evenTex;
109  const cudaTextureObject_t &evenNormTex;
110  const cudaTextureObject_t &oddTex;
111  const cudaTextureObject_t &oddNormTex;
112  const cudaTextureObject_t& EvenTex() const { return evenTex; }
113  const cudaTextureObject_t& EvenNormTex() const { return evenNormTex; }
114  const cudaTextureObject_t& OddTex() const { return oddTex; }
115  const cudaTextureObject_t& OddNormTex() const { return oddNormTex; }
116 #endif
117 
118  FullClover(const cudaCloverField &clover, bool inverse=false) :
119  precision(clover.precision), bytes(clover.bytes), norm_bytes(clover.norm_bytes)
120 #ifdef USE_TEXTURE_OBJECTS
121  , evenTex(inverse ? clover.evenInvTex : clover.evenTex)
122  , evenNormTex(inverse ? clover.evenInvNormTex : clover.evenNormTex)
123  , oddTex(inverse ? clover.oddInvTex : clover.oddTex)
124  , oddNormTex(inverse ? clover.oddInvNormTex : clover.oddNormTex)
125 #endif
126  {
127  if (inverse) {
128  even = clover.evenInv;
129  evenNorm = clover.evenInvNorm;
130  odd = clover.oddInv;
131  oddNorm = clover.oddInvNorm;
132  } else {
133  even = clover.even;
134  evenNorm = clover.evenNorm;
135  odd = clover.odd;
136  oddNorm = clover.oddNorm;
137  }
138  }
139  };
140 
141  // driver for computing the clover field from the gauge field
142  void computeCloverCuda(cudaCloverField &clover, const cudaGaugeField &gauge);
143 
144 } // namespace quda
145 
146 #endif // _CLOVER_QUDA_H