QUDA  1.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
checksum.cu
Go to the documentation of this file.
1 #include <gauge_field_order.h>
2 #include <cub_helper.cuh>
3 
4 namespace quda {
5 
6  template <typename T, QudaGaugeFieldOrder order, int Nc>
7  struct ChecksumArg {
8  static constexpr int nColor = Nc;
9  typedef typename mapper<T>::type real;
11  const G U;
12  const int volumeCB;
13  ChecksumArg(const GaugeField &U, bool mini) : U(U), volumeCB(mini ? 1 : U.VolumeCB()) { }
14  };
15 
16  template <typename Arg>
17  __device__ __host__ inline uint64_t siteChecksum(const Arg &arg, int d, int parity, int x_cb) {
18  const Matrix<complex<typename Arg::real>,Arg::nColor> u = arg.U(d, x_cb, parity);
19  return u.checksum();
20  }
21 
22  template <typename Arg>
23  uint64_t ChecksumCPU(const Arg &arg)
24  {
25  uint64_t checksum_ = 0;
26  for (int parity=0; parity<2; parity++)
27  for (int x_cb=0; x_cb<arg.volumeCB; x_cb++)
28  for (int d=0; d<arg.U.geometry; d++)
29  checksum_ ^= siteChecksum(arg, d, parity, x_cb);
30  return checksum_;
31  }
32 
33  template <typename T, int Nc>
34  uint64_t Checksum(const GaugeField &u, bool mini)
35  {
36  uint64_t checksum = 0;
37  if (u.Order() == QUDA_QDP_GAUGE_ORDER) {
39  checksum = ChecksumCPU(arg);
40  } else if (u.Order() == QUDA_QDPJIT_GAUGE_ORDER) {
42  checksum = ChecksumCPU(arg);
43  } else if (u.Order() == QUDA_MILC_GAUGE_ORDER) {
45  checksum = ChecksumCPU(arg);
46  } else if (u.Order() == QUDA_BQCD_GAUGE_ORDER) {
48  checksum = ChecksumCPU(arg);
49  } else if (u.Order() == QUDA_TIFR_GAUGE_ORDER) {
51  checksum = ChecksumCPU(arg);
52  } else if (u.Order() == QUDA_TIFR_PADDED_GAUGE_ORDER) {
54  checksum = ChecksumCPU(arg);
55  } else {
56  errorQuda("Checksum not implemented");
57  }
58 
59  return checksum;
60  }
61 
62  template <typename T>
63  uint64_t Checksum(const GaugeField &u, bool mini)
64  {
65  uint64_t checksum = 0;
66  switch (u.Ncolor()) {
67  case 3: checksum = Checksum<T,3>(u,mini); break;
68  default: errorQuda("Unsupported nColor = %d", u.Ncolor());
69  }
70  return checksum;
71  }
72 
73  uint64_t Checksum(const GaugeField &u, bool mini)
74  {
75  uint64_t checksum = 0;
76  switch (u.Precision()) {
77  case QUDA_DOUBLE_PRECISION: checksum = Checksum<double>(u,mini); break;
78  case QUDA_SINGLE_PRECISION: checksum = Checksum<float>(u,mini); break;
79  default: errorQuda("Unsupported precision = %d", u.Precision());
80  }
81 
82  comm_allreduce_xor(&checksum);
83 
84  return checksum;
85  }
86 
87 }
#define errorQuda(...)
Definition: util_quda.h:121
uint64_t Checksum(const GaugeField &u, bool mini=false)
Definition: checksum.cu:34
static constexpr int nColor
Definition: checksum.cu:8
__device__ __host__ uint64_t checksum() const
Definition: quda_matrix.h:198
ChecksumArg(const GaugeField &U, bool mini)
Definition: checksum.cu:13
int Ncolor() const
Definition: gauge_field.h:249
const int nColor
Definition: covdev_test.cpp:75
uint64_t ChecksumCPU(const Arg &arg)
Definition: checksum.cu:23
const int volumeCB
Definition: checksum.cu:12
Main header file for host and device accessors to GaugeFields.
__device__ __host__ uint64_t siteChecksum(const Arg &arg, int d, int parity, int x_cb)
Definition: checksum.cu:17
void comm_allreduce_xor(uint64_t *data)
Definition: comm_mpi.cpp:311
mapper< T >::type real
Definition: checksum.cu:9
__host__ __device__ ValueType arg(const complex< ValueType > &z)
Returns the phase angle of z.
const int volumeCB
Definition: spinor_noise.cu:26
gauge_order_mapper< T, order, Nc >::type G
Definition: checksum.cu:10
QudaGaugeFieldOrder Order() const
Definition: gauge_field.h:251
QudaPrecision Precision() const
QudaParity parity
Definition: covdev_test.cpp:54