QUDA  0.9.0
deflated_invert_test.cpp
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <time.h>
4 #include <math.h>
5 #include <string.h>
6 #include <algorithm>
7 
8 #include <util_quda.h>
9 #include <test_util.h>
10 #include <dslash_util.h>
11 #include <blas_reference.h>
14 #include "misc.h"
15 
16 #if defined(QMP_COMMS)
17 #include <qmp.h>
18 #elif defined(MPI_COMMS)
19 #include <mpi.h>
20 #endif
21 
22 #include <qio_field.h>
23 
24 // In a typical application, quda.h is the only QUDA header required.
25 #include <quda.h>
26 
27 // Wilson, clover-improved Wilson, twisted mass, and domain wall are supported.
29 //extern bool tune;
30 extern int device;
31 extern int xdim;
32 extern int ydim;
33 extern int zdim;
34 extern int tdim;
35 extern int Lsdim;
36 extern int gridsize_from_cmdline[];
38 extern QudaPrecision prec;
44 extern double mass;
45 extern double mu;
46 extern double anisotropy;
47 extern double tol; // tolerance for inverter
48 extern double tol_hq; // heavy-quark tolerance for inverter
49 extern char latfile[];
50 extern int Nsrc; // number of spinors to apply to simultaneously
51 extern int niter;
52 extern int nvec[];
53 
56 
59 
60 extern char vec_infile[];
61 extern char vec_outfile[];
62 
63 //Twisted mass flavor type
65 
66 extern void usage(char** );
67 
68 extern double clover_coeff;
69 extern bool compute_clover;
70 
71 extern int nev;
72 extern int max_search_dim;
73 extern int deflation_grid;
74 extern double tol_restart;
75 
76 extern int eigcg_max_restarts;
77 extern int max_restart_num;
78 extern double inc_tol;
79 extern double eigenval_tol;
80 
83 
86 
87 namespace quda {
88  extern void setTransferGPU(bool);
89 }
90 
91 void
93 {
94  printfQuda("running the following test:\n");
95 
96  printfQuda("prec sloppy_prec link_recon sloppy_link_recon S_dimension T_dimension Ls_dimension\n");
97  printfQuda("%s %s %s %s %d/%d/%d %d %d\n",
101 
102  printfQuda("Deflation parameters\n");
103 // printfQuda(" - number of levels %d\n", mg_levels);
104  printfQuda(" - number of eigenvectors %d\n", nvec[0]);
105 
106  printfQuda("Grid partition info: X Y Z T\n");
107  printfQuda(" %d %d %d %d\n",
108  dimPartitioned(0),
109  dimPartitioned(1),
110  dimPartitioned(2),
111  dimPartitioned(3));
112 
113  return ;
114 
115 }
116 
122 
124  gauge_param.X[0] = xdim;
125  gauge_param.X[1] = ydim;
126  gauge_param.X[2] = zdim;
127  gauge_param.X[3] = tdim;
128 
133 
135 
138 
141 
144 
146 
147  gauge_param.ga_pad = 0;
148  // For multi-GPU, ga_pad must be large enough to store a time-slice
149 #ifdef MULTI_GPU
150  int x_face_size = gauge_param.X[1]*gauge_param.X[2]*gauge_param.X[3]/2;
151  int y_face_size = gauge_param.X[0]*gauge_param.X[2]*gauge_param.X[3]/2;
152  int z_face_size = gauge_param.X[0]*gauge_param.X[1]*gauge_param.X[3]/2;
153  int t_face_size = gauge_param.X[0]*gauge_param.X[1]*gauge_param.X[2]/2;
154  int pad_size =std::max(x_face_size, y_face_size);
155  pad_size = std::max(pad_size, z_face_size);
156  pad_size = std::max(pad_size, t_face_size);
157  gauge_param.ga_pad = pad_size;
158 #endif
159 }
160 
161 
163  inv_param.Ls = 1;
164 
165  inv_param.sp_pad = 0;
166  inv_param.cl_pad = 0;
167 
171 
176 
183  }
184 
187 
188 // inv_param.tune = tune ? QUDA_TUNE_YES : QUDA_TUNE_NO;
189 
191 
192  //Free field!
193  inv_param.mass = mass;
194  inv_param.kappa = 1.0 / (2.0 * (1 + 3/anisotropy + mass));
195 
197  inv_param.mu = mu;
200 
202  printfQuda("Twisted-mass doublet non supported (yet)\n");
203  exit(0);
204  }
205  }
206 
208 
211 
212  // do we want full solution or single-parity solution
214 
215  // do we want to use an even-odd preconditioned solve or not
218 
219 
220  // set default solver type to incremental eigcg is not set at command line
223 
226  inv_param.tol = tol;
227  inv_param.tol_hq = tol_hq; // specify a tolerance for the residual for heavy quark residual
228 
229  inv_param.rhs_idx = 0;
230 
231  inv_param.nev = nev;
239 
240 
245  inv_param.tol_restart = 0.0;//restart is not requested...
246  }
247 
251 
253  inv_param.gcrNkrylov = 6;
254 
255  // require both L2 relative and heavy quark residual to determine convergence
257  // these can be set individually
258  for (int i=0; i<inv_param.num_offset; i++) {
261  }
264 
265  // domain decomposition preconditioner parameters
270  inv_param.omega = 1.0;
271 
273 }
274 
276 
277  df_param.import_vectors = QUDA_BOOLEAN_NO;
278  df_param.run_verify = QUDA_BOOLEAN_NO;
279 
280  df_param.nk = df_param.invert_param->nev;
281  df_param.np = df_param.invert_param->nev*df_param.invert_param->deflation_grid;
282  df_param.extlib_type = deflation_ext_lib;
283 
284  df_param.cuda_prec_ritz = prec_ritz;
285  df_param.location = location_ritz;
286  df_param.mem_type_ritz = mem_type_ritz;
287 
288  // set file i/o parameters
289  strcpy(df_param.vec_infile, vec_infile);
290  strcpy(df_param.vec_outfile, vec_outfile);
291 }
292 
293 
294 int main(int argc, char **argv)
295 {
296 
297  for (int i = 1; i < argc; i++){
298  if(process_command_line_option(argc, argv, &i) == 0){
299  continue;
300  }
301  printf("ERROR: Invalid option:%s\n", argv[i]);
302  usage(argv);
303  }
304 
309 
310  // initialize QMP/MPI, QUDA comms grid and RNG (test_util.cpp)
311  initComms(argc, argv, gridsize_from_cmdline);
312 
313  // call srand() with a rank-dependent seed
314  initRand();
315 
317 
318  // *** QUDA parameters begin here.
319 
324  printfQuda("dslash_type %d not supported\n", dslash_type);
325  exit(0);
326  }
327 
330 
331 
334 
335  QudaEigParam df_param = newQudaEigParam();
336  df_param.invert_param = &inv_param;
337  setDeflationParam(df_param);
338 
339  // *** Everything between here and the call to initQuda() is
340  // *** application-specific.
341 
343 
344  setSpinorSiteSize(24);
345 
346  size_t gSize = (gauge_param.cpu_prec == QUDA_DOUBLE_PRECISION) ? sizeof(double) : sizeof(float);
347  size_t sSize = (inv_param.cpu_prec == QUDA_DOUBLE_PRECISION) ? sizeof(double) : sizeof(float);
348 
349  void *gauge[4], *clover=0, *clover_inv=0;
350 
351  for (int dir = 0; dir < 4; dir++) {
352  gauge[dir] = malloc(V*gaugeSiteSize*gSize);
353  }
354 
355  if (strcmp(latfile,"")) { // load in the command line supplied gauge field
358  } else { // else generate a random SU(3) field
359  //generate a random SU(3) field
360  //construct_gauge_field(gauge, 1, gauge_param.cpu_prec, &gauge_param);
361  //generate a unit SU(3) field
363 
364  }
365 
367  double norm = 0.1; // clover components are random numbers in the range (-norm, norm)
368  double diag = 1.0; // constant added to the diagonal
369 
370  size_t cSize = inv_param.clover_cpu_prec;
371  clover = malloc(V*cloverSiteSize*cSize);
372  clover_inv = malloc(V*cloverSiteSize*cSize);
374 
379  }
380 
381  void *spinorIn = malloc(V*spinorSiteSize*sSize*inv_param.Ls);
382  void *spinorCheck = malloc(V*spinorSiteSize*sSize*inv_param.Ls);
383 
384  void *spinorOut = NULL;
386 
387  // start the timer
388  double time0 = -((double)clock());
389 
390  // initialize the QUDA library
391  initQuda(device);
392 
393  // load the gauge field
394  loadGaugeQuda((void*)gauge, &gauge_param);
395 
396  // this line ensure that if we need to construct the clover inverse (in either the smoother or the solver) we do so
398 
399  void *df_preconditioner = newDeflationQuda(&df_param);
400  inv_param.deflation_op = df_preconditioner;
401 
402  for (int i=0; i<Nsrc; i++) {
403  // create a point source at 0 (in each subvolume... FIXME)
404  memset(spinorIn, 0, inv_param.Ls*V*spinorSiteSize*sSize);
405  memset(spinorCheck, 0, inv_param.Ls*V*spinorSiteSize*sSize);
407 
409  //((float*)spinorIn)[i] = 1.0;
410  for (int i=0; i<inv_param.Ls*V*spinorSiteSize; i++) ((float*)spinorIn)[i] = rand() / (float)RAND_MAX;
411  } else {
412  //((double*)spinorIn)[i] = 1.0;
413  for (int i=0; i<inv_param.Ls*V*spinorSiteSize; i++) ((double*)spinorIn)[i] = rand() / (double)RAND_MAX;
414  }
415 
416  invertQuda(spinorOut, spinorIn, &inv_param);
417  printfQuda("\nDone for %d rhs.\n", inv_param.rhs_idx);
418  }
419 
420  destroyDeflationQuda(df_preconditioner);
421 
422  // stop the timer
423  time0 += clock();
424  time0 /= CLOCKS_PER_SEC;
425 
426  printfQuda("Device memory used:\n Spinor: %f GiB\n Gauge: %f GiB\n",
429  //printfQuda("\nDone: %i iter / %g secs = %g Gflops, total time = %g secs\n",
430  //inv_param.iter, inv_param.secs, inv_param.gflops/inv_param.secs, time0);
431  printfQuda("\nDone: %i iter / %g secs = %g Gflops, total time = %g secs\n",
433 
435 
437  wil_mat(spinorCheck, gauge, spinorOut, inv_param.kappa, 0, inv_param.cpu_prec, gauge_param);
438  } else {
442  } else {
443  printfQuda("Unsupported dslash_type\n");
444  exit(-1);
445  }
446  }
447  }
449  ax(0.5/inv_param.kappa, spinorCheck, V*spinorSiteSize, inv_param.cpu_prec);
450  }
451 
453 
455  wil_matpc(spinorCheck, gauge, spinorOut, inv_param.kappa, inv_param.matpc_type, 0,
457  } else {
462  } else {
463  printfQuda("Unsupported dslash_type\n");
464  exit(-1);
465  }
466  }
467  }
468 
471  }
472 
473  }
474 
475  int vol = inv_param.solution_type == QUDA_MAT_SOLUTION ? V : Vh;
476  mxpy(spinorIn, spinorCheck, vol*spinorSiteSize*inv_param.Ls, inv_param.cpu_prec);
477  double nrm2 = norm_2(spinorCheck, vol*spinorSiteSize*inv_param.Ls, inv_param.cpu_prec);
478  double src2 = norm_2(spinorIn, vol*spinorSiteSize*inv_param.Ls, inv_param.cpu_prec);
479  double l2r = sqrt(nrm2 / src2);
480 
481  printfQuda("Residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g\n",
483 
484 
485  freeGaugeQuda();
487 
488  // finalize the QUDA library
489  endQuda();
490 
491  // finalize the communications layer
492  finalizeComms();
493 
495  if (clover) free(clover);
496  if (clover_inv) free(clover_inv);
497  }
498 
499  for (int dir = 0; dir<4; dir++) free(gauge[dir]);
500 
501  return 0;
502 }
int maxiter_precondition
Definition: quda.h:267
int niter
Definition: test_util.cpp:1630
QudaReconstructType link_recon
Definition: test_util.cpp:1612
double secs
Definition: quda.h:228
int dimPartitioned(int dim)
Definition: test_util.cpp:1686
QudaDiracFieldOrder dirac_order
Definition: quda.h:195
int deflation_grid
Definition: test_util.cpp:1671
QudaMassNormalization mass_normalization
Definition: quda.h:185
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:159
QudaReconstructType reconstruct_sloppy
Definition: quda.h:46
double anisotropy
Definition: quda.h:31
void freeCloverQuda(void)
void endQuda(void)
void free(void *)
void construct_gauge_field(void **gauge, int type, QudaPrecision precision, QudaGaugeParam *param)
Definition: test_util.cpp:1054
double mu
Definition: test_util.cpp:1643
QudaSolveType solve_type
Definition: quda.h:182
QudaVerbosity verbosity_precondition
Definition: quda.h:261
enum QudaPrecision_s QudaPrecision
double tol_hq
Definition: test_util.cpp:1648
int ga_pad
Definition: quda.h:53
void destroyDeflationQuda(void *df_instance)
QudaExtLibType extlib_type
Definition: quda.h:331
int Lsdim
Definition: test_util.cpp:1624
double mu
Definition: quda.h:105
QudaSolveType solve_type
Definition: test_util.cpp:1653
QudaGaugeFixed gauge_fix
Definition: quda.h:51
QudaSchwarzType schwarz_type
Definition: quda.h:276
__host__ __device__ ValueType norm(const complex< ValueType > &z)
Returns the magnitude of z squared.
Definition: complex_quda.h:896
double eigenval_tol
Definition: test_util.cpp:1677
void tm_mat(void *out, void **gauge, void *in, double kappa, double mu, QudaTwistFlavorType flavor, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param)
enum QudaResidualType_s QudaResidualType
double tol_restart
Definition: test_util.cpp:1672
QudaInverterType inv_type_precondition
Definition: quda.h:248
QudaDslashType dslash_type
Definition: test_util.cpp:1626
QudaLinkType type
Definition: quda.h:35
double kappa
Definition: quda.h:97
QudaPrecision cuda_prec_ritz
Definition: quda.h:290
void invertQuda(void *h_x, void *h_b, QudaInvertParam *param)
double tol
Definition: quda.h:110
QudaDslashType dslash_type
Definition: quda.h:93
int zdim
Definition: test_util.cpp:1622
QudaReconstructType reconstruct_precondition
Definition: quda.h:49
QudaInverterType inv_type
Definition: quda.h:94
QudaPrecision cuda_prec
Definition: quda.h:191
#define cloverSiteSize
Definition: test_util.h:8
int return_clover_inverse
Definition: quda.h:217
void setGaugeParam(QudaGaugeParam &gauge_param)
enum QudaSolveType_s QudaSolveType
void loadGaugeQuda(void *h_gauge, QudaGaugeParam *param)
QudaExtLibType deflation_ext_lib
Definition: test_util.cpp:1680
QudaPrecision cpu_prec
Definition: quda.h:190
void setDeflationParam(QudaEigParam &df_param)
QudaPrecision prec
Definition: test_util.cpp:1615
int process_command_line_option(int argc, char **argv, int *idx)
Definition: test_util.cpp:1795
double inc_tol
Definition: test_util.cpp:1676
char * strcpy(char *__dst, const char *__src)
bool compute_clover
Definition: test_util.cpp:1646
int ydim
Definition: test_util.cpp:1621
QudaDagType dagger
Definition: quda.h:184
void finalizeComms()
Definition: test_util.cpp:107
void ax(const double &a, ColorSpinorField &x)
Definition: blas_quda.cu:209
double anisotropy
Definition: test_util.cpp:1644
QudaGaugeParam gauge_param
QudaGaugeFieldOrder gauge_order
Definition: quda.h:36
double true_res
Definition: quda.h:115
void tm_matpc(void *outEven, void **gauge, void *inEven, double kappa, double mu, QudaTwistFlavorType flavor, QudaMatPCType matpc_type, int daggerBit, QudaPrecision precision, QudaGaugeParam &gauge_param)
const char * get_prec_str(QudaPrecision prec)
Definition: misc.cpp:704
void loadCloverQuda(void *h_clover, void *h_clovinv, QudaInvertParam *inv_param)
QudaPrecision & cuda_prec_precondition
int return_clover
Definition: quda.h:216
#define spinorSiteSize
void exit(int) __attribute__((noreturn))
QudaPrecision clover_cuda_prec_sloppy
Definition: quda.h:202
void setDims(int *)
Definition: test_util.cpp:130
QudaFieldLocation input_location
Definition: quda.h:90
void freeGaugeQuda(void)
QudaInverterType inv_type
Definition: test_util.cpp:1638
double reliable_delta
Definition: quda.h:118
static size_t gSize
Definition: llfat_test.cpp:36
QudaPrecision prec_sloppy
Definition: test_util.cpp:1616
void setInvertParam(QudaInvertParam &inv_param)
QudaSolutionType solution_type
Definition: quda.h:181
else return(__swbuf(_c, _p))
QudaPrecision & cuda_prec_ritz
QudaMemoryType mem_type_ritz
Definition: quda.h:367
int strcmp(const char *__s1, const char *__s2)
QudaPrecision clover_cuda_prec
Definition: quda.h:201
int precondition_cycle
Definition: quda.h:273
QudaInvertParam * invert_param
Definition: quda.h:346
void initQuda(int device)
double spinorGiB
Definition: quda.h:225
double tol
Definition: test_util.cpp:1647
QudaFieldLocation output_location
Definition: quda.h:91
void * malloc(size_t __size) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(1)))
QudaPrecision clover_cuda_prec_precondition
Definition: quda.h:203
QudaInvertParam inv_param
Definition: covdev_test.cpp:37
int printf(const char *,...) __attribute__((__format__(__printf__
char vec_infile[]
Definition: test_util.cpp:1636
QudaPrecision & cuda_prec_sloppy
QudaBoolean run_verify
Definition: quda.h:373
void setTransferGPU(bool)
void * newDeflationQuda(QudaEigParam *param)
QudaPrecision cuda_prec_sloppy
Definition: quda.h:192
QudaVerbosity verbosity
Definition: quda.h:219
void setSpinorSiteSize(int n)
Definition: test_util.cpp:192
double tol_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:156
QudaInvertParam newQudaInvertParam(void)
double gflops
Definition: quda.h:227
int eigcg_max_restarts
Definition: quda.h:306
const char * get_recon_str(QudaReconstructType recon)
Definition: misc.cpp:770
QudaPrecision cuda_prec_precondition
Definition: quda.h:48
QudaCloverFieldOrder clover_order
Definition: quda.h:205
int max_search_dim
Definition: test_util.cpp:1670
int V
Definition: test_util.cpp:28
double tol_hq
Definition: quda.h:112
enum QudaMatPCType_s QudaMatPCType
cpuColorSpinorField * spinorOut
Definition: covdev_test.cpp:41
#define gaugeSiteSize
Definition: test_util.h:6
double sqrt(double)
int main(int argc, char **argv)
double true_res_hq
Definition: quda.h:116
QudaGammaBasis gamma_basis
Definition: quda.h:197
char vec_outfile[]
Definition: test_util.cpp:1637
QudaPrecision & cpu_prec
QudaPrecision cuda_prec_sloppy
Definition: quda.h:45
int max_search_dim
Definition: quda.h:298
int eigcg_max_restarts
Definition: test_util.cpp:1674
double tol_precondition
Definition: quda.h:264
QudaReconstructType link_recon_precondition
Definition: test_util.cpp:1614
int max_restart_num
Definition: test_util.cpp:1675
double mass
Definition: test_util.cpp:1642
QudaReconstructType reconstruct
Definition: quda.h:43
QudaPrecision cuda_prec
Definition: quda.h:42
QudaMatPCType matpc_type
Definition: test_util.cpp:1652
int X[4]
Definition: quda.h:29
double mass
Definition: quda.h:96
QudaBoolean import_vectors
Definition: quda.h:361
QudaExtLibType solver_ext_lib
Definition: test_util.cpp:1679
QudaFieldLocation location
Definition: quda.h:370
int gcrNkrylov
Definition: quda.h:237
double norm_2(void *v, int len, QudaPrecision precision)
int rand(void) __attribute__((__availability__(swift
int compute_clover_inverse
Definition: quda.h:215
QudaPrecision prec_precondition
Definition: test_util.cpp:1617
void construct_clover_field(void *clover, double norm, double diag, QudaPrecision precision)
Definition: test_util.cpp:1166
void * memset(void *__b, int __c, size_t __len)
QudaPrecision & cuda_prec
char vec_outfile[256]
Definition: quda.h:379
enum QudaFieldLocation_s QudaFieldLocation
void usage(char **)
Definition: test_util.cpp:1693
int Nsrc
Definition: test_util.cpp:1628
void wil_mat(void *out, void **gauge, void *in, double kappa, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param)
double gaugeGiB
Definition: quda.h:60
QudaPrecision cuda_prec_precondition
Definition: quda.h:193
int deflation_grid
Definition: quda.h:302
QudaPrecision prec_ritz
Definition: test_util.cpp:1618
double tol_restart
Definition: quda.h:111
double clover_coeff
Definition: test_util.cpp:1645
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
int xdim
Definition: test_util.cpp:1620
int nev
Definition: test_util.cpp:1669
void initRand()
Definition: test_util.cpp:117
char latfile[]
Definition: test_util.cpp:1627
QudaExtLibType extlib_type
Definition: quda.h:388
QudaMemoryType mem_type_ritz
Definition: test_util.cpp:1682
#define printfQuda(...)
Definition: util_quda.h:84
QudaInverterType precon_type
Definition: test_util.cpp:1639
QudaTboundary t_boundary
Definition: quda.h:38
QudaTwistFlavorType twist_flavor
Definition: quda.h:108
int Vh
Definition: test_util.cpp:29
int nvec[]
Definition: test_util.cpp:1635
int max_restart_num
Definition: quda.h:308
enum QudaDslashType_s QudaDslashType
QudaTwistFlavorType twist_flavor
Definition: test_util.cpp:1649
QudaFieldLocation location_ritz
Definition: test_util.cpp:1681
void mxpy(ColorSpinorField &x, ColorSpinorField &y)
Definition: blas_quda.cu:192
QudaResidualType residual_type
Definition: quda.h:286
int gridsize_from_cmdline[]
Definition: test_util.cpp:50
void wil_matpc(void *outEven, void **gauge, void *inEven, double kappa, QudaMatPCType matpc_type, int daggerBit, QudaPrecision precision, QudaGaugeParam &gauge_param)
double inc_tol
Definition: quda.h:310
int num_offset
Definition: quda.h:146
double cloverGiB
Definition: quda.h:226
clock_t clock(void) __asm("_" "clock")
int compute_clover
Definition: quda.h:214
int tdim
Definition: test_util.cpp:1623
double omega
Definition: quda.h:270
void display_test_info()
void read_gauge_field(const char *filename, void *gauge[], QudaPrecision prec, const int *X, int argc, char *argv[])
Definition: qio_field.h:12
void * deflation_op
Definition: quda.h:254
double eigenval_tol
Definition: quda.h:304
QudaPrecision clover_cpu_prec
Definition: quda.h:200
QudaPrecision cuda_prec_ritz
Definition: quda.h:364
void initComms(int argc, char **argv, const int *commDims)
Definition: test_util.cpp:72
QudaMatPCType matpc_type
Definition: quda.h:183
QudaEigParam newQudaEigParam(void)
char vec_infile[256]
Definition: quda.h:376
enum QudaInverterType_s QudaInverterType
enum QudaMemoryType_s QudaMemoryType
QudaPrecision cpu_prec
Definition: quda.h:40
enum QudaExtLibType_s QudaExtLibType
QudaGaugeParam newQudaGaugeParam(void)
QudaPreserveSource preserve_source
Definition: quda.h:188
double clover_coeff
Definition: quda.h:208
enum QudaTwistFlavorType_s QudaTwistFlavorType
QudaReconstructType link_recon_sloppy
Definition: test_util.cpp:1613