QUDA: quda/tests/host_reference/dslash_test_helpers.cpp Source File

QUDA  v1.1.0
A library for QCD on GPUs
dslash_test_helpers.cpp
Go to the documentation of this file.
1 #include "dslash_test_helpers.h"
2 #include <quda.h>
3 #include <dirac_quda.h>
4 #include <dslash_quda.h>
5 #include <blas_quda.h>
6 #include <quda_internal.h>
7 
8 using namespace quda;
9 
10 // need a better solution here but as long as they gauge field live in interface probably ok
11 extern cudaGaugeField *gaugePrecise;
12 extern cudaGaugeField *gaugeFatPrecise;
13 extern cudaGaugeField *gaugeLongPrecise;
14 
15  void dslashQuda_4dpc(void *h_out, void *h_in, QudaInvertParam *inv_param, QudaParity parity, dslash_test_type test_type)
16 {
17  const auto &gauge = (inv_param->dslash_type != QUDA_ASQTAD_DSLASH) ? *gaugePrecise : *gaugeFatPrecise;
18 
19  if ((!gaugePrecise && inv_param->dslash_type != QUDA_ASQTAD_DSLASH)
20  || ((!gaugeFatPrecise || !gaugeLongPrecise) && inv_param->dslash_type == QUDA_ASQTAD_DSLASH))
21  errorQuda("Gauge field not allocated");
22 
23  pushVerbosity(inv_param->verbosity);
24  if (getVerbosity() >= QUDA_DEBUG_VERBOSE) printQudaInvertParam(inv_param);
25 
26  ColorSpinorParam cpuParam(h_in, *inv_param, gauge.X(), true, inv_param->input_location);
27  ColorSpinorField *in_h = ColorSpinorField::Create(cpuParam);
28 
29  ColorSpinorParam cudaParam(cpuParam, *inv_param);
30  cudaColorSpinorField in(*in_h, cudaParam);
31 
32  if (getVerbosity() >= QUDA_DEBUG_VERBOSE) {
33  double cpu = blas::norm2(*in_h);
34  double gpu = blas::norm2(in);
35  printfQuda("In CPU %e CUDA %e\n", cpu, gpu);
36  }
37 
38  cudaParam.create = QUDA_NULL_FIELD_CREATE;
39  cudaColorSpinorField out(in, cudaParam);
40 
41  if (inv_param->dirac_order == QUDA_CPS_WILSON_DIRAC_ORDER) {
42  if (parity == QUDA_EVEN_PARITY) {
43  parity = QUDA_ODD_PARITY;
44  } else {
45  parity = QUDA_EVEN_PARITY;
46  }
47  blas::ax(gauge.Anisotropy(), in);
48  }
49  bool pc = true;
50 
51  DiracParam diracParam;
52  setDiracParam(diracParam, inv_param, pc);
53 
54  DiracDomainWall4DPC dirac(diracParam); // create the Dirac operator
55  printfQuda("kappa for QUDA input : %e\n", inv_param->kappa);
56  switch (test_type) {
57  case dslash_test_type::Dslash: dirac.Dslash4(out, in, parity); break;
58  case dslash_test_type::M5: dirac.Dslash5(out, in, parity); break;
59  case dslash_test_type::M5inv: dirac.Dslash5inv(out, in, parity, inv_param->kappa); break;
60  default: errorQuda("Unsupported dslash_test_type in dslashQuda_4dpc.");
61  }
62 
63  cpuParam.v = h_out;
64  cpuParam.location = inv_param->output_location;
65  ColorSpinorField *out_h = ColorSpinorField::Create(cpuParam);
66  *out_h = out;
67 
68  if (getVerbosity() >= QUDA_DEBUG_VERBOSE) {
69  double cpu = blas::norm2(*out_h);
70  double gpu = blas::norm2(out);
71  printfQuda("Out CPU %e CUDA %e\n", cpu, gpu);
72  }
73 
74  delete out_h;
75  delete in_h;
76 
77  popVerbosity();
78 }
79 
80  void dslashQuda_mdwf(void *h_out, void *h_in, QudaInvertParam *inv_param, QudaParity parity, dslash_test_type test_type)
81 {
82  const auto &gauge = (inv_param->dslash_type != QUDA_ASQTAD_DSLASH) ? *gaugePrecise : *gaugeFatPrecise;
83 
84  if ((!gaugePrecise && inv_param->dslash_type != QUDA_ASQTAD_DSLASH)
85  || ((!gaugeFatPrecise || !gaugeLongPrecise) && inv_param->dslash_type == QUDA_ASQTAD_DSLASH))
86  errorQuda("Gauge field not allocated");
87 
88  pushVerbosity(inv_param->verbosity);
89  if (getVerbosity() >= QUDA_DEBUG_VERBOSE) printQudaInvertParam(inv_param);
90 
91  ColorSpinorParam cpuParam(h_in, *inv_param, gauge.X(), true, inv_param->input_location);
92  ColorSpinorField *in_h = ColorSpinorField::Create(cpuParam);
93 
94  ColorSpinorParam cudaParam(cpuParam, *inv_param);
95  cudaColorSpinorField in(*in_h, cudaParam);
96 
97  if (getVerbosity() >= QUDA_DEBUG_VERBOSE) {
98  double cpu = blas::norm2(*in_h);
99  double gpu = blas::norm2(in);
100  printfQuda("In CPU %e CUDA %e\n", cpu, gpu);
101  }
102 
103  cudaParam.create = QUDA_NULL_FIELD_CREATE;
104  cudaColorSpinorField out(in, cudaParam);
105 
106  if (inv_param->dirac_order == QUDA_CPS_WILSON_DIRAC_ORDER) {
107  if (parity == QUDA_EVEN_PARITY) {
108  parity = QUDA_ODD_PARITY;
109  } else {
110  parity = QUDA_EVEN_PARITY;
111  }
112  blas::ax(gauge.Anisotropy(), in);
113  }
114  bool pc = true;
115 
116  DiracParam diracParam;
117  setDiracParam(diracParam, inv_param, pc);
118 
119  DiracMobiusPC dirac(diracParam); // create the Dirac operator
120  switch (test_type) {
121  case dslash_test_type::Dslash: dirac.Dslash4(out, in, parity); break;
122  case dslash_test_type::M5: dirac.Dslash5(out, in, parity); break;
123  case dslash_test_type::Dslash4pre: dirac.Dslash4pre(out, in, parity); break;
124  case dslash_test_type::M5inv: dirac.Dslash5inv(out, in, parity); break;
125  default: errorQuda("Unsupported dslash_test_type in dslashQuda_mdwf.");
126  }
127 
128  cpuParam.v = h_out;
129  cpuParam.location = inv_param->output_location;
130  ColorSpinorField *out_h = ColorSpinorField::Create(cpuParam);
131  *out_h = out;
132 
133  if (getVerbosity() >= QUDA_DEBUG_VERBOSE) {
134  double cpu = blas::norm2(*out_h);
135  double gpu = blas::norm2(out);
136  printfQuda("Out CPU %e CUDA %e\n", cpu, gpu);
137  }
138 
139  delete out_h;
140  delete in_h;
141 
142  popVerbosity();
143 }
144 
145  void dslashQuda_mobius_eofa(void *h_out, void *h_in, QudaInvertParam *inv_param, QudaParity parity,
146  dslash_test_type test_type)
147 {
148  if (inv_param->dslash_type == QUDA_MOBIUS_DWF_EOFA_DSLASH) {
149  setKernelPackT(true);
150  } else {
151  errorQuda("This type of dslashQuda operator is defined for QUDA_MOBIUS_DWF_EOFA_DSLASH ONLY");
152  }
153 
154  if (gaugePrecise == nullptr) errorQuda("Gauge field not allocated");
155 
156  pushVerbosity(inv_param->verbosity);
157  if (getVerbosity() >= QUDA_DEBUG_VERBOSE) printQudaInvertParam(inv_param);
158 
159  bool precondition_output = test_type == dslash_test_type::Dslash ? false : true;
160 
161  ColorSpinorParam cpuParam(h_in, *inv_param, gaugePrecise->X(), precondition_output, inv_param->input_location);
162  ColorSpinorField *in_h = ColorSpinorField::Create(cpuParam);
163 
164  ColorSpinorParam cudaParam(cpuParam, *inv_param);
165  cudaColorSpinorField in(*in_h, cudaParam);
166 
167  if (getVerbosity() >= QUDA_DEBUG_VERBOSE) {
168  double cpu = blas::norm2(*in_h);
169  double gpu = blas::norm2(in);
170  printfQuda("In CPU: %16.12e CUDA: %16.12e\n", cpu, gpu);
171  }
172 
173  cudaParam.create = QUDA_NULL_FIELD_CREATE;
174  cudaColorSpinorField out(in, cudaParam);
175 
176  if (inv_param->dirac_order == QUDA_CPS_WILSON_DIRAC_ORDER) {
177  if (parity == QUDA_EVEN_PARITY) {
178  parity = QUDA_ODD_PARITY;
179  } else {
180  parity = QUDA_EVEN_PARITY;
181  }
182  blas::ax(gaugePrecise->Anisotropy(), in);
183  }
184  constexpr bool pc = true;
185 
186  DiracParam diracParam;
187  setDiracParam(diracParam, inv_param, pc);
188 
189  DiracMobiusEofaPC dirac(diracParam); // create the Dirac operator
190  switch (test_type) {
191  case dslash_test_type::MatPC: dirac.M(out, in); break;
192  case dslash_test_type::M5: dirac.m5_eofa(out, in); break;
193  case dslash_test_type::M5inv: dirac.m5inv_eofa(out, in); break;
194  default: errorQuda("test_type(=%d) NOT defined for M\"obius EOFA! :( \n", static_cast<int>(test_type));
195  }
196 }
quda::ColorSpinorField::Create
static ColorSpinorField * Create(const ColorSpinorParam &param)
Definition: color_spinor_field.cpp:714
quda::ColorSpinorParam::location
QudaFieldLocation location
Definition: color_spinor_field.h:134
quda::ColorSpinorParam::create
QudaFieldCreate create
Definition: color_spinor_field.h:146
quda::Dirac::Dslash4
virtual void Dslash4(ColorSpinorField &out, const ColorSpinorField &in, const QudaParity parity) const
Apply the local MdagM operator: equivalent to applying zero Dirichlet boundary condition to MdagM on ...
Definition: dirac_quda.h:243
quda::GaugeCovDev::M
virtual void M(ColorSpinorField &out, const ColorSpinorField &in) const
Apply M for the dirac op. E.g. the Schur Complement operator.
Definition: gauge_covdev.cpp:63
quda::GaugeField::Anisotropy
double Anisotropy() const
Definition: gauge_field.h:288
quda::LatticeField::X
const int * X() const
Definition: lattice_field.h:505
test_type
int test_type
Definition: command_line_params.cpp:57
dirac
GaugeCovDev * dirac
Definition: covdev_test.cpp:42
parity
QudaParity parity
Definition: covdev_test.cpp:40
inv_param
QudaInvertParam inv_param
Definition: covdev_test.cpp:27
gaugeFatPrecise
cudaGaugeField * gaugeFatPrecise
Definition: interface_quda.cpp:109
gaugeLongPrecise
cudaGaugeField * gaugeLongPrecise
Definition: interface_quda.cpp:116
dslashQuda_mdwf
void dslashQuda_mdwf(void *h_out, void *h_in, QudaInvertParam *inv_param, QudaParity parity, dslash_test_type test_type)
Definition: dslash_test_helpers.cpp:80
dslashQuda_mobius_eofa
void dslashQuda_mobius_eofa(void *h_out, void *h_in, QudaInvertParam *inv_param, QudaParity parity, dslash_test_type test_type)
Definition: dslash_test_helpers.cpp:145
dslashQuda_4dpc
void dslashQuda_4dpc(void *h_out, void *h_in, QudaInvertParam *inv_param, QudaParity parity, dslash_test_type test_type)
Definition: dslash_test_helpers.cpp:15
gaugePrecise
cudaGaugeField * gaugePrecise
Definition: interface_quda.cpp:102
dslash_test_type
dslash_test_type
Definition: dslash_test_helpers.h:5
QUDA_ASQTAD_DSLASH
@ QUDA_ASQTAD_DSLASH
Definition: enum_quda.h:98
QUDA_MOBIUS_DWF_EOFA_DSLASH
@ QUDA_MOBIUS_DWF_EOFA_DSLASH
Definition: enum_quda.h:96
QUDA_DEBUG_VERBOSE
@ QUDA_DEBUG_VERBOSE
Definition: enum_quda.h:268
QUDA_EVEN_PARITY
@ QUDA_EVEN_PARITY
Definition: enum_quda.h:284
QUDA_ODD_PARITY
@ QUDA_ODD_PARITY
Definition: enum_quda.h:284
QUDA_CPS_WILSON_DIRAC_ORDER
@ QUDA_CPS_WILSON_DIRAC_ORDER
Definition: enum_quda.h:248
QUDA_NULL_FIELD_CREATE
@ QUDA_NULL_FIELD_CREATE
Definition: enum_quda.h:360
QudaParity
enum QudaParity_s QudaParity
quda::blas::ax
void ax(double a, ColorSpinorField &x)
quda::blas::norm2
double norm2(const ColorSpinorField &a)
quda
Definition: blas_lapack.h:24
quda::setKernelPackT
void setKernelPackT(bool pack)
quda::setDiracParam
void setDiracParam(DiracParam &diracParam, QudaInvertParam *inv_param, bool pc)
Definition: interface_quda.cpp:1570
quda.h
Main header file for the QUDA library.
printQudaInvertParam
void printQudaInvertParam(QudaInvertParam *param)
Definition: check_params.h:342
QudaInvertParam_s::dslash_type
QudaDslashType dslash_type
Definition: quda.h:106
QudaInvertParam_s::verbosity
QudaVerbosity verbosity
Definition: quda.h:271
QudaInvertParam_s::input_location
QudaFieldLocation input_location
Definition: quda.h:103
QudaInvertParam_s::output_location
QudaFieldLocation output_location
Definition: quda.h:104
QudaInvertParam_s::dirac_order
QudaDiracFieldOrder dirac_order
Definition: quda.h:244
QudaInvertParam_s::kappa
double kappa
Definition: quda.h:110
pushVerbosity
void pushVerbosity(QudaVerbosity verbosity)
Push a new verbosity onto the stack.
Definition: util_quda.cpp:83
printfQuda
#define printfQuda(...)
Definition: util_quda.h:114
popVerbosity
void popVerbosity()
Pop the verbosity restoring the prior one on the stack.
Definition: util_quda.cpp:94
getVerbosity
QudaVerbosity getVerbosity()
Definition: util_quda.cpp:21
errorQuda
#define errorQuda(...)
Definition: util_quda.h:120

Generated on Thu Oct 28 2021 16:10:27 for QUDA by doxygen 1.9.1

AltStyle によって変換されたページ (->オリジナル) /