QUDA  v0.7.0
A library for QCD on GPUs
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
invert_quda.h
Go to the documentation of this file.
1 #ifndef _INVERT_QUDA_H
2 #define _INVERT_QUDA_H
3 
4 #include <quda.h>
5 #include <quda_internal.h>
6 #include <dirac_quda.h>
7 #include <color_spinor_field.h>
8 
9 namespace quda {
10 
14  struct SolverParam {
19 
25 
36 
39 
41  double delta;
42 
45 
50 
55 
57  int pipeline;
58 
60  double tol;
61 
63  double tol_restart;
64 
66  double tol_hq;
67 
69  double true_res;
70 
72  double true_res_hq;
73 
75  int maxiter;
76 
78  int iter;
79 
82 
85 
88 
91 
94 
95  // Multi-shift solver parameters
96 
98  int num_offset;
99 
102 
105 
108 
111 
114 
115 
117  int Nsteps;
118 
120  int Nkrylov;
121 
124 
127 
130 
132  double omega;
133 
134 
135 
138 
140  double secs;
141 
143  double gflops;
144 
145  // Incremental EigCG solver parameters
147  QudaPrecision precision_ritz;//also search space precision
148 
149  int nev;//number of eigenvectors produced by EigCG
150  int m;//Dimension of the search space
152  int rhs_idx;
153 
164  true_res(param.true_res), true_res_hq(param.true_res_hq),
165  maxiter(param.maxiter), iter(param.iter),
166  precision(param.cuda_prec), precision_sloppy(param.cuda_prec_sloppy),
167  precision_precondition(param.cuda_prec_precondition),
169  Nsteps(param.Nsteps), Nkrylov(param.gcrNkrylov), precondition_cycle(param.precondition_cycle),
171  omega(param.omega), schwarz_type(param.schwarz_type), secs(param.secs), gflops(param.gflops),
172  precision_ritz(param.cuda_prec_ritz), nev(param.nev), m(param.max_search_dim), deflation_grid(param.deflation_grid), rhs_idx(0)
173  {
174  for (int i=0; i<num_offset; i++) {
175  offset[i] = param.offset[i];
176  tol_offset[i] = param.tol_offset[i];
177  tol_hq_offset[i] = param.tol_hq_offset[i];
178  }
179 
180  if((param.inv_type == QUDA_INC_EIGCG_INVERTER || param.inv_type == QUDA_EIGCG_INVERTER) && m % 16){//current hack for the magma library
181  m = (m / 16) * 16 + 16;
182  warningQuda("\nSwitched eigenvector search dimension to %d\n", m);
183  }
184  if(param.rhs_idx != 0 && (param.inv_type==QUDA_INC_EIGCG_INVERTER || param.inv_type==QUDA_EIGCG_INVERTER)){
185  rhs_idx = param.rhs_idx;
186  }
187  }
189 
195  param.true_res = true_res;
196  param.true_res_hq = true_res_hq;
197  param.iter += iter;
198  param.gflops = (param.gflops*param.secs + gflops*secs) / (param.secs + secs);
199  param.secs += secs;
200  if (offset >= 0) {
203  } else {
204  for (int i=0; i<num_offset; i++) {
205  param.true_res_offset[i] = true_res_offset[i];
207  }
208  }
209  //for incremental eigCG:
210  param.rhs_idx = rhs_idx;
211  }
212 
214  //for incremental eigCG:
215  rhs_idx = param.rhs_idx;
216  }
217 
218  };
219 
220  class Solver {
221 
222  protected:
225 
226  public:
227  Solver(SolverParam &param, TimeProfile &profile) : param(param), profile(profile) { ; }
228  virtual ~Solver() { ; }
229 
231 
232  // solver factory
233  static Solver* create(SolverParam &param, DiracMatrix &mat, DiracMatrix &matSloppy,
234  DiracMatrix &matPrecon, TimeProfile &profile);
235 
240  static double stopping(const double &tol, const double &b2, QudaResidualType residual_type);
241 
249  bool convergence(const double &r2, const double &hq2, const double &r2_tol,
250  const double &hq_tol);
251 
259  bool convergenceHQ(const double &r2, const double &hq2, const double &r2_tol,
260  const double &hq_tol);
261 
269  bool convergenceL2(const double &r2, const double &hq2, const double &r2_tol,
270  const double &hq_tol);
271 
275  void PrintStats(const char*, int k, const double &r2, const double &b2, const double &hq2);
276 
283  void PrintSummary(const char *name, int k, const double &r2, const double &b2);
284 
285  };
286 
287  class CG : public Solver {
288 
289  private:
290  const DiracMatrix &mat;
291  const DiracMatrix &matSloppy;
292 
293  public:
295  virtual ~CG();
296 
298  };
299 
300 
301 
302  class MPCG : public Solver {
303  private:
304  const DiracMatrix &mat;
305  void computeMatrixPowers(cudaColorSpinorField out[], cudaColorSpinorField &in, int nvec);
306  void computeMatrixPowers(std::vector<cudaColorSpinorField>& out, std::vector<cudaColorSpinorField>& in, int nsteps);
307 
308 
309  public:
311  virtual ~MPCG();
312 
314  };
315 
316 
317 
318  class PreconCG : public Solver {
319  private:
320  const DiracMatrix &mat;
321  const DiracMatrix &matSloppy;
322  const DiracMatrix &matPrecon;
323 
324  Solver *K;
325  SolverParam Kparam; // parameters for preconditioner solve
326 
327  public:
328  PreconCG(DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matPrecon,
330  virtual ~PreconCG();
331 
333  };
334 
335 
336  class BiCGstab : public Solver {
337 
338  private:
339  DiracMatrix &mat;
340  const DiracMatrix &matSloppy;
341  const DiracMatrix &matPrecon;
342 
343  // pointers to fields to avoid multiple creation overhead
344  cudaColorSpinorField *yp, *rp, *pp, *vp, *tmpp, *tp;
345  bool init;
346 
347  public:
348  BiCGstab(DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matPrecon,
350  virtual ~BiCGstab();
351 
353  };
354 
355  class SimpleBiCGstab : public Solver {
356 
357  private:
358  DiracMatrix &mat;
359 
360  // pointers to fields to avoid multiple creation overhead
361  cudaColorSpinorField *yp, *rp, *pp, *vp, *tmpp, *tp;
362  bool init;
363 
364  public:
366  virtual ~SimpleBiCGstab();
367 
369  };
370 
371  class MPBiCGstab : public Solver {
372 
373  private:
374  DiracMatrix &mat;
375 
376  // pointers to fields to avoid multiple creation overhead
377  cudaColorSpinorField *yp, *rp, *pp, *vp, *tmpp, *tp;
378  bool init;
379  void computeMatrixPowers(std::vector<cudaColorSpinorField>& pr, cudaColorSpinorField& p, cudaColorSpinorField& r, int nsteps);
380 
381  public:
383  virtual ~MPBiCGstab();
384 
386  };
387 
388 
389 
390  class GCR : public Solver {
391 
392  private:
393  const DiracMatrix &mat;
394  const DiracMatrix &matSloppy;
395  const DiracMatrix &matPrecon;
396 
397  Solver *K;
398  SolverParam Kparam; // parameters for preconditioner solve
399 
400  public:
401  GCR(DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matPrecon,
403  virtual ~GCR();
404 
406  };
407 
408  class MR : public Solver {
409 
410  private:
411  const DiracMatrix &mat;
414  cudaColorSpinorField *tmpp;
415  bool init;
416  bool allocate_r;
417 
418  public:
420  virtual ~MR();
421 
423  };
424 
425  // Steepest descent solver used as a preconditioner
426  class SD : public Solver {
427  private:
428  const DiracMatrix &mat;
432  bool init;
433 
434  public:
436  virtual ~SD();
437 
438 
440  };
441 
442  // Extended Steepest Descent solver used for overlapping DD preconditioning
443  class XSD : public Solver {
444  private:
445  const DiracMatrix &mat;
448  SD *sd; // extended sd is implemented using standard sd
449  bool init;
450  int R[4];
451 
452  public:
454  virtual ~XSD();
455 
457  };
458 
459 
460  // multigrid solver
461  class alphaSA : public Solver {
462 
463  protected:
464  const DiracMatrix &mat;
465 
466  public:
468  virtual ~alphaSA() { ; }
469 
471  };
472 
474 
475  protected:
478 
479  public:
481  param(param), profile(profile) { ; }
482  virtual ~MultiShiftSolver() { ; }
483 
485  };
486 
488 
489  protected:
490  const DiracMatrix &mat;
492 
493  public:
495  virtual ~MultiShiftCG();
496 
498  };
499 
508  class MinResExt {
509 
510  protected:
511  const DiracMatrix &mat;
513 
514  public:
516  virtual ~MinResExt();
517 
527  cudaColorSpinorField **q, int N);
528  };
529 
531 
532  protected:
535 
536  //WARNING: eigcg_precision may not coinside with param.precision and param.precision_sloppy (both used for the initCG).
537  //
538  QudaPrecision eigcg_precision;//may be double or single.
539 
540  public:
541  DeflatedSolver(SolverParam &param, TimeProfile &profile) : param(param), profile(profile)
542  {
543  eigcg_precision = param.precision_sloppy;//for mixed presicion use param.precision_sloppy
544  }
545 
546  virtual ~DeflatedSolver() { ; }
547 
549 
550 // virtual void Deflate(cudaColorSpinorField &out, cudaColorSpinorField &in) = 0;//extrenal method (not implemented yet)
551  virtual void StoreRitzVecs(void *host_buffer, double *inv_eigenvals, const int *X, QudaInvertParam *inv_par, const int nev, bool cleanResources = false) = 0;//extrenal method
552 
553  virtual void CleanResources() = 0;
554 
555  // solver factory
556  static DeflatedSolver* create(SolverParam &param, DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matCGSloppy, DiracMatrix &matDeflate, TimeProfile &profile);
557 
558  bool convergence(const double &r2, const double &hq2, const double &r2_tol,
559  const double &hq_tol);
560 
564  void PrintStats(const char*, int k, const double &r2, const double &b2, const double &hq2);
565 
572  void PrintSummary(const char *name, int k, const double &r2, const double &b2);
573 
574  };
575 
576  struct DeflationParam;//Forward declaration
577 
578  class IncEigCG : public DeflatedSolver {
579 
580  private:
581  DiracMatrix &mat;
582  DiracMatrix &matSloppy;
583 
584  DiracMatrix &matCGSloppy;
585 
586  const DiracMatrix &matDefl;
587 
588  QudaPrecision search_space_prec;
589  cudaColorSpinorField *Vm; //search vectors (spinor matrix of size eigen_vector_length x m)
590 
591  SolverParam initCGparam; // parameters for initCG solver
592  TimeProfile &profile; //time profile for initCG solver
593 
594  bool eigcg_alloc;
595  bool use_eigcg;
596 
597  public:
598 
599  IncEigCG(DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matCGSloppy, DiracMatrix &matDefl, SolverParam &param, TimeProfile &profile);
600 
601  virtual ~IncEigCG();
602 
603  //EigCG solver
605 
606  //Incremental eigCG solver (for eigcg and initcg calls)
608 
609  //Compute u dH^{-1} u^{dagger}b:
610  void DeflateSpinor(cudaColorSpinorField &out, cudaColorSpinorField &in, DeflationParam *param, bool set2zero = true);
611  //
612  void DeflateSpinorReduced(cudaColorSpinorField &out, cudaColorSpinorField &in, DeflationParam *param, bool set2zero = true);
613 
614  //Deflation space management
615  void CreateDeflationSpace(cudaColorSpinorField &eigcgSpinor, DeflationParam *&param);
616 
617  //extend projection matrix:
618  //compute Q' = DiracM Q, (here U = [V, Q] - total Ritz set)
619  //construct H-matrix components with Q'^{dag} Q', V^{dag} Q' and Q'^{dag} V
620  //extend H-matrix with the components
621  void ExpandDeflationSpace(DeflationParam *param, const int new_nev);
622  //
623  void DeleteDeflationSpace(DeflationParam *&param);
624  //
625  void DeleteEigCGSearchSpace();
626  //
627  void SaveEigCGRitzVecs(DeflationParam *param, bool cleanResources = false);
628  //
629  void StoreRitzVecs(void *host_buf, double *inv_eigenvals, const int *X, QudaInvertParam *inv_par, const int nev, bool cleanResources = false);
630  //
631  void CleanResources();
632 
633  void LoadEigenvectors(DeflationParam *param, int max_nevs, double tol = 1e-3);
634 
635  void ReportEigenvalueAccuracy(DeflationParam *param, int nevs_to_print);
636 
637  };
638 
639 } // namespace quda
640 
641 #endif // _INVERT_QUDA_H
virtual ~Solver()
Definition: invert_quda.h:228
double secs
Definition: quda.h:183
bool convergence(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)
Definition: solver.cpp:82
enum QudaPreserveSource_s QudaPreserveSource
void DeleteDeflationSpace(DeflationParam *&param)
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:134
QudaSchwarzType schwarz_type
Definition: invert_quda.h:137
virtual ~MPCG()
virtual ~XSD()
enum QudaPrecision_s QudaPrecision
virtual void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)=0
static double stopping(const double &tol, const double &b2, QudaResidualType residual_type)
Definition: solver.cpp:65
void updateRhsIndex(QudaInvertParam &param)
Definition: invert_quda.h:213
virtual void StoreRitzVecs(void *host_buffer, double *inv_eigenvals, const int *X, QudaInvertParam *inv_par, const int nev, bool cleanResources=false)=0
enum QudaResidualType_s QudaResidualType
#define QUDA_MAX_MULTI_SHIFT
Maximum number of shifts supported by the multi-shift solver. This number may be changed if need be...
QudaInverterType inv_type
Definition: invert_quda.h:18
void operator()(cudaColorSpinorField &x, cudaColorSpinorField &b, cudaColorSpinorField **p, cudaColorSpinorField **q, int N)
Definition: inv_mre.cpp:15
SolverParam & param
Definition: invert_quda.h:476
void StoreRitzVecs(void *host_buf, double *inv_eigenvals, const int *X, QudaInvertParam *inv_par, const int nev, bool cleanResources=false)
QudaInverterType inv_type
Definition: quda.h:86
void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)
void ReportEigenvalueAccuracy(DeflationParam *param, int nevs_to_print)
const DiracMatrix & mat
Definition: invert_quda.h:490
bool convergenceL2(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)
Definition: solver.cpp:110
MR(DiracMatrix &mat, SolverParam &param, TimeProfile &profile)
Definition: inv_mr_quda.cpp:19
void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)
void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)
Definition: inv_mr_quda.cpp:35
DeflatedSolver(SolverParam &param, TimeProfile &profile)
Definition: invert_quda.h:541
void mat(void *out, void **fatlink, void **longlink, void *in, double kappa, int dagger_bit, QudaPrecision sPrecision, QudaPrecision gPrecision)
void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)
double tol_offset[QUDA_MAX_MULTI_SHIFT]
Definition: invert_quda.h:104
TimeProfile & profile
Definition: invert_quda.h:224
double offset[QUDA_MAX_MULTI_SHIFT]
Definition: invert_quda.h:101
BiCGstab(DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matPrecon, SolverParam &param, TimeProfile &profile)
TimeProfile & profile
Definition: invert_quda.h:477
virtual void CleanResources()=0
double true_res
Definition: quda.h:105
QudaPrecision precision_ritz
Definition: invert_quda.h:147
QudaInverterType inv_type_precondition
Definition: invert_quda.h:24
QudaPreserveSource preserve_source
Definition: invert_quda.h:90
int max_res_increase_total
Definition: invert_quda.h:54
IncEigCG(DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matCGSloppy, DiracMatrix &matDefl, SolverParam &param, TimeProfile &profile)
alphaSA(DiracMatrix &mat, SolverParam &param, TimeProfile &profile)
int EigCG(cudaColorSpinorField &out, cudaColorSpinorField &in)
void DeflateSpinor(cudaColorSpinorField &out, cudaColorSpinorField &in, DeflationParam *param, bool set2zero=true)
double true_res_hq_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:140
virtual ~MultiShiftSolver()
Definition: invert_quda.h:482
QudaGaugeParam param
Definition: pack_test.cpp:17
const DiracMatrix & mat
Definition: invert_quda.h:464
SolverParam(QudaInvertParam &param)
Definition: invert_quda.h:159
TimeProfile & profile
Definition: invert_quda.h:512
GCR(DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matPrecon, SolverParam &param, TimeProfile &profile)
virtual ~PreconCG()
MPCG(DiracMatrix &mat, SolverParam &param, TimeProfile &profile)
SimpleBiCGstab(DiracMatrix &mat, SolverParam &param, TimeProfile &profile)
void PrintSummary(const char *name, int k, const double &r2, const double &b2)
Definition: solver.cpp:137
virtual ~DeflatedSolver()
Definition: invert_quda.h:546
QudaResidualType residual_type
Definition: invert_quda.h:35
const DiracMatrix & matSloppy
Definition: invert_quda.h:491
CG(DiracMatrix &mat, DiracMatrix &matSloppy, SolverParam &param, TimeProfile &profile)
Definition: inv_cg_quda.cpp:19
double true_res_hq_offset[QUDA_MAX_MULTI_SHIFT]
Definition: invert_quda.h:113
void updateInvertParam(QudaInvertParam &param, int offset=-1)
Definition: invert_quda.h:194
void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)
Definition: inv_sd_quda.cpp:36
virtual void operator()(cudaColorSpinorField **out, cudaColorSpinorField &in)=0
virtual ~GCR()
double tol_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:131
double true_res_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:137
cpuColorSpinorField * in
double gflops
Definition: quda.h:182
static Solver * create(SolverParam &param, DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matPrecon, TimeProfile &profile)
Definition: solver.cpp:12
#define warningQuda(...)
Definition: util_quda.h:84
double true_res_hq
Definition: quda.h:106
virtual ~alphaSA()
Definition: invert_quda.h:468
MinResExt(DiracMatrix &mat, TimeProfile &profile)
Definition: inv_mre.cpp:6
enum QudaSchwarzType_s QudaSchwarzType
bool convergence(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)
Definition: solver.cpp:164
void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)
Definition: inv_cg_quda.cpp:29
double true_res_offset[QUDA_MAX_MULTI_SHIFT]
Definition: invert_quda.h:110
double offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:128
void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)
void operator()(cudaColorSpinorField *out, cudaColorSpinorField *in)
double tol_precondition
Definition: invert_quda.h:126
void ExpandDeflationSpace(DeflationParam *param, const int new_nev)
int x[4]
void operator()(cudaColorSpinorField **out, cudaColorSpinorField &in)
void PrintSummary(const char *name, int k, const double &r2, const double &b2)
Definition: solver.cpp:194
QudaPrecision precision_precondition
Definition: invert_quda.h:87
SD(DiracMatrix &mat, SolverParam &param, TimeProfile &profile)
Definition: inv_sd_quda.cpp:19
QudaPrecision precision
Definition: invert_quda.h:81
QudaPrecision cuda_prec
Definition: dslash_test.cpp:35
void DeflateSpinorReduced(cudaColorSpinorField &out, cudaColorSpinorField &in, DeflationParam *param, bool set2zero=true)
virtual ~SD()
Definition: inv_sd_quda.cpp:25
Solver(SolverParam &param, TimeProfile &profile)
Definition: invert_quda.h:227
SolverParam & param
Definition: invert_quda.h:223
cpuColorSpinorField * out
void DeleteEigCGSearchSpace()
void CreateDeflationSpace(cudaColorSpinorField &eigcgSpinor, DeflationParam *&param)
Main header file for the QUDA library.
MPBiCGstab(DiracMatrix &mat, SolverParam &param, TimeProfile &profile)
static DeflatedSolver * create(SolverParam &param, DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matCGSloppy, DiracMatrix &matDeflate, TimeProfile &profile)
Definition: solver.cpp:150
virtual ~MinResExt()
Definition: inv_mre.cpp:11
void PrintStats(const char *, int k, const double &r2, const double &b2, const double &hq2)
Definition: solver.cpp:122
MultiShiftCG(DiracMatrix &mat, DiracMatrix &matSloppy, SolverParam &param, TimeProfile &profile)
SolverParam & param
Definition: invert_quda.h:533
void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)
MultiShiftSolver(SolverParam &param, TimeProfile &profile)
Definition: invert_quda.h:480
virtual void operator()(cudaColorSpinorField *out, cudaColorSpinorField *in)=0
void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)
virtual ~MR()
Definition: inv_mr_quda.cpp:25
void PrintStats(const char *, int k, const double &r2, const double &b2, const double &hq2)
Definition: solver.cpp:179
QudaUseInitGuess use_init_guess
Definition: invert_quda.h:38
QudaPrecision precision_sloppy
Definition: invert_quda.h:84
bool use_sloppy_partial_accumulator
Definition: invert_quda.h:44
void SaveEigCGRitzVecs(DeflationParam *param, bool cleanResources=false)
PreconCG(DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matPrecon, SolverParam &param, TimeProfile &profile)
bool convergenceHQ(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)
Definition: solver.cpp:99
virtual ~CG()
Definition: inv_cg_quda.cpp:25
TimeProfile & profile
Definition: invert_quda.h:534
enum QudaUseInitGuess_s QudaUseInitGuess
void LoadEigenvectors(DeflationParam *param, int max_nevs, double tol=1e-3)
const DiracMatrix & mat
Definition: invert_quda.h:511
QudaPrecision eigcg_precision
Definition: invert_quda.h:538
enum QudaInverterType_s QudaInverterType
void operator()(cudaColorSpinorField **out, cudaColorSpinorField &in)
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
Definition: invert_quda.h:107
XSD(DiracMatrix &mat, SolverParam &param, TimeProfile &profile)
void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)