QUDA  0.9.0
staggered_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 
6 #include <test_util.h>
7 #include <dslash_util.h>
8 #include <blas_reference.h>
10 #include <quda.h>
11 #include <string.h>
12 #include "misc.h"
13 #include <gauge_field.h>
14 #include <blas_quda.h>
15 
16 #if defined(QMP_COMMS)
17 #include <qmp.h>
18 #elif defined(MPI_COMMS)
19 #include <mpi.h>
20 #endif
21 
22 #define MAX(a,b) ((a)>(b)?(a):(b))
23 #define mySpinorSiteSize 6
24 
25 extern void usage(char** argv);
26 void *qdp_fatlink[4];
27 void *qdp_longlink[4];
28 
29 void *fatlink;
30 void *longlink;
31 
32 #ifdef MULTI_GPU
33 void** ghost_fatlink, **ghost_longlink;
34 #endif
35 
36 extern int device;
37 
39 extern QudaPrecision prec;
41 
48 
51 
52 extern double tol; // tolerance for inverter
53 extern double tol_hq; // heavy-quark tolerance for inverter
54 extern int test_type;
55 extern int xdim;
56 extern int ydim;
57 extern int zdim;
58 extern int tdim;
59 extern int gridsize_from_cmdline[];
60 
61 extern int Nsrc; // number of spinors to apply to simultaneously
62 extern int niter;
63 
64 // Dirac operator type
66 
68 extern double mass; // the mass of the Dirac operator
69 extern int pipeline; // length of pipeline for fused operations in GCR or BiCGstab-l
70 extern int solution_accumulator_pipeline; // length of pipeline for fused solution update from the direction vectors
71 
73 
74 static void end();
75 
76 template<typename Float>
77 void constructSpinorField(Float *res) {
78  for(int src=0; src<Nsrc; src++) {
79  for(int i = 0; i < Vh; i++) {
80  for (int s = 0; s < 1; s++) {
81  for (int m = 0; m < 3; m++) {
82  res[(src*Vh + i)*(1*3*2) + s*(3*2) + m*(2) + 0] = rand() / (Float)RAND_MAX;
83  res[(src*Vh + i)*(1*3*2) + s*(3*2) + m*(2) + 1] = rand() / (Float)RAND_MAX;
84  }
85  }
86  }
87  }
88 }
89 
90 static void
92  int X1, int X2, int X3, int X4,
95  double mass, double tol, double reliable_delta,
96  double tadpole_coeff
97  )
98 {
99  gaugeParam->X[0] = X1;
100  gaugeParam->X[1] = X2;
101  gaugeParam->X[2] = X3;
102  gaugeParam->X[3] = X4;
103 
110  gaugeParam->anisotropy = 1.0;
111  gaugeParam->tadpole_coeff = tadpole_coeff;
112 
115 
116  gaugeParam->scale = dslash_type != QUDA_ASQTAD_DSLASH ? 1.0 : -1.0/(24.0*tadpole_coeff*tadpole_coeff);
117 
120  gaugeParam->ga_pad = X1*X2*X3/2;
121 
123  inv_param->mass = mass;
124  inv_param->kappa = 1.0/(8.0 + mass); // for Laplace operator
125 
126  // outer solver parameters
128  inv_param->tol = tol;
129  inv_param->tol_restart = 1e-3; //now theoretical background for this parameter...
131  inv_param->reliable_delta = 1e-1;
135 
136  inv_param->Ls = Nsrc;
137 
138  if(tol_hq == 0 && tol == 0){
139  errorQuda("qudaInvert: requesting zero residual\n");
140  exit(1);
141  }
142  // require both L2 relative and heavy quark residual to determine convergence
143  inv_param->residual_type = static_cast<QudaResidualType_s>(0);
144  inv_param->residual_type = (tol != 0) ? static_cast<QudaResidualType_s> ( inv_param->residual_type | QUDA_L2_RELATIVE_RESIDUAL) : inv_param->residual_type;
145  inv_param->residual_type = (tol_hq != 0) ? static_cast<QudaResidualType_s> (inv_param->residual_type | QUDA_HEAVY_QUARK_RESIDUAL) : inv_param->residual_type;
146 
147  inv_param->tol_hq = tol_hq; // specify a tolerance for the residual for heavy quark residual
148 
149  inv_param->Nsteps = 2;
150 
151 
152  //inv_param->inv_type = QUDA_GCR_INVERTER;
153  //inv_param->gcrNkrylov = 10;
154 
155  // domain decomposition preconditioner parameters
161 
167 
172  inv_param->gamma_basis = QUDA_DEGRAND_ROSSI_GAMMA_BASIS; // this is meaningless, but must be thus set
174 
176 
177  inv_param->sp_pad = X1*X2*X3/2;
179 
182 }
183 
184 
185  int
187 {
190 
192  xdim, ydim, zdim, tdim,
194  link_recon, link_recon_sloppy, mass, tol, 1e-3, 0.8);
195 
196  // this must be before the FaceBuffer is created (this is because it allocates pinned memory - FIXME)
197  initQuda(device);
198 
200  dw_setDims(gaugeParam.X,Nsrc); // so we can use 5-d indexing from dwf
202 
203  size_t gSize = (gaugeParam.cpu_prec == QUDA_DOUBLE_PRECISION) ? sizeof(double) : sizeof(float);
204  for (int dir = 0; dir < 4; dir++) {
207  }
210 
213  } else {
216  }
217 
218  for(int dir=0; dir<4; ++dir){
219  for(int i=0; i<V; ++i){
220  for(int j=0; j<gaugeSiteSize; ++j){
222  ((double*)fatlink)[(i*4 + dir)*gaugeSiteSize + j] = ((double*)qdp_fatlink[dir])[i*gaugeSiteSize + j];
223  ((double*)longlink)[(i*4 + dir)*gaugeSiteSize + j] = ((double*)qdp_longlink[dir])[i*gaugeSiteSize + j];
224  }else{
225  ((float*)fatlink)[(i*4 + dir)*gaugeSiteSize + j] = ((float*)qdp_fatlink[dir])[i*gaugeSiteSize + j];
226  ((float*)longlink)[(i*4 + dir)*gaugeSiteSize + j] = ((float*)qdp_longlink[dir])[i*gaugeSiteSize + j];
227  }
228  }
229  }
230  }
231 
232 
234  csParam.nColor=3;
235  csParam.nSpin=1;
236  csParam.nDim=5;
237  for (int d = 0; d < 4; d++) csParam.x[d] = gaugeParam.X[d];
239  if (pc) csParam.x[0] /= 2;
240  csParam.x[4] = Nsrc;
241 
243  csParam.pad = 0;
253 
255  constructSpinorField((float*)in->V());
256  }else{
257  constructSpinorField((double*)in->V());
258  }
259 
260 #ifdef MULTI_GPU
261  int tmp_value = MAX(ydim*zdim*tdim/2, xdim*zdim*tdim/2);
262  tmp_value = MAX(tmp_value, xdim*ydim*tdim/2);
263  tmp_value = MAX(tmp_value, xdim*ydim*zdim/2);
264 
265  int fat_pad = tmp_value;
266  int link_pad = 3*tmp_value;
267 
268  // FIXME: currently assume staggered is SU(3)
272  GaugeFieldParam cpuFatParam(fatlink, gaugeParam);
274  cpuFat = new cpuGaugeField(cpuFatParam);
275  ghost_fatlink = (void**)cpuFat->Ghost();
276 
278  GaugeFieldParam cpuLongParam(longlink, gaugeParam);
279  cpuLongParam.ghostExchange = QUDA_GHOST_EXCHANGE_PAD;
280  cpuLong = new cpuGaugeField(cpuLongParam);
281  ghost_longlink = (void**)cpuLong->Ghost();
282 
283 #else
284  int fat_pad = 0;
285  int link_pad = 0;
286 #endif
287 
290  gaugeParam.ga_pad = fat_pad;
294  } else {
296  }
300 
303  gaugeParam.ga_pad = link_pad;
309  }
310 
311  double time0 = -((double)clock()); // Start the timer
312 
313  double nrm2=0;
314  double src2=0;
315  int ret = 0;
316 
317  int len = Vh*Nsrc;
318 
319  switch(test_type){
320  case 0: //even
323  inv_param.gcrNkrylov = 50;
324  }else if(inv_type == QUDA_PCG_INVERTER){
326  }
328 
329  invertQuda(out->V(), in->V(), &inv_param);
330 
331  time0 += clock();
332  time0 /= CLOCKS_PER_SEC;
333 
334 #ifdef MULTI_GPU
335  matdagmat_mg4dir(ref, qdp_fatlink, qdp_longlink, ghost_fatlink, ghost_longlink,
337 #else
339 #endif
340 
344 
345  break;
346 
347  case 1: //odd
350  inv_param.gcrNkrylov = 50;
351  }else if(inv_type == QUDA_PCG_INVERTER){
353  }
354 
356  invertQuda(out->V(), in->V(), &inv_param);
357  time0 += clock(); // stop the timer
358  time0 /= CLOCKS_PER_SEC;
359 
360 #ifdef MULTI_GPU
361  matdagmat_mg4dir(ref, qdp_fatlink, qdp_longlink, ghost_fatlink, ghost_longlink,
363 #else
365 #endif
369 
370  break;
371 
372  case 2: //full spinor
373 
374  errorQuda("full spinor not supported\n");
375  break;
376 
377  case 3: //multi mass CG, even
378  case 4:
379 
380 #define NUM_OFFSETS 12
381 
382  {
383  double masses[NUM_OFFSETS] ={0.06, 0.061, 0.064, 0.070, 0.077, 0.081, 0.1, 0.11, 0.12, 0.13, 0.14, 0.205};
385  // these can be set independently
386  for (int i=0; i<inv_param.num_offset; i++) {
389  }
390  void* outArray[NUM_OFFSETS];
391 
392  cpuColorSpinorField* spinorOutArray[NUM_OFFSETS];
393  spinorOutArray[0] = out;
394  for(int i=1;i < inv_param.num_offset; i++){
395  spinorOutArray[i] = new cpuColorSpinorField(csParam);
396  }
397 
398  for(int i=0;i < inv_param.num_offset; i++){
399  outArray[i] = spinorOutArray[i]->V();
400  inv_param.offset[i] = 4*masses[i]*masses[i];
401  }
402 
403  if (test_type == 3) {
405  } else {
407  }
408 
409  invertMultiShiftQuda(outArray, in->V(), &inv_param);
410 
411  cudaDeviceSynchronize();
412  time0 += clock(); // stop the timer
413  time0 /= CLOCKS_PER_SEC;
414 
415  printfQuda("done: total time = %g secs, compute time = %g, %i iter / %g secs = %g gflops\n",
418 
419 
420  printfQuda("checking the solution\n");
423  //parity = QUDA_EVENODD_PARITY;
424  errorQuda("full parity not supported\n");
429  }else{
430  errorQuda("ERROR: invalid spinor parity \n");
431  exit(1);
432  }
433  for(int i=0;i < inv_param.num_offset;i++){
434  printfQuda("%dth solution: mass=%f, ", i, masses[i]);
435 #ifdef MULTI_GPU
436  matdagmat_mg4dir(ref, qdp_fatlink, qdp_longlink, ghost_fatlink, ghost_longlink,
437  spinorOutArray[i], masses[i], 0, inv_param.cpu_prec,
439 #else
440  matdagmat(ref->V(), qdp_fatlink, qdp_longlink, outArray[i], masses[i], 0, inv_param.cpu_prec, gaugeParam.cpu_prec, tmp->V(), parity);
441 #endif
442 
444  double nrm2 = norm_2(ref->V(), len*mySpinorSiteSize, inv_param.cpu_prec);
445  double src2 = norm_2(in->V(), len*mySpinorSiteSize, inv_param.cpu_prec);
446  double hqr = sqrt(blas::HeavyQuarkResidualNorm(*spinorOutArray[i], *ref).z);
447  double l2r = sqrt(nrm2/src2);
448 
449  printfQuda("Shift %d residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g, host = %g\n",
452 
453  //emperical, if the cpu residue is more than 1 order the target accuracy, the it fails to converge
454  if (sqrt(nrm2/src2) > 10*inv_param.tol_offset[i]){
455  ret |=1;
456  }
457  }
458 
459  for(int i=1; i < inv_param.num_offset;i++) delete spinorOutArray[i];
460  }
461  break;
462 
463  default:
464  errorQuda("Unsupported test type");
465 
466  }//switch
467 
468  if (test_type <=2){
469 
470  double hqr = sqrt(blas::HeavyQuarkResidualNorm(*out, *ref).z);
471  double l2r = sqrt(nrm2/src2);
472 
473  printfQuda("Residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g, host = %g\n",
475 
476  printfQuda("done: total time = %g secs, compute time = %g secs, %i iter / %g secs = %g gflops, \n",
479  }
480 
481  end();
482  return ret;
483 }
484 
485 
486 
487  static void
488 end(void)
489 {
490  for(int i=0;i < 4;i++){
491  free(qdp_fatlink[i]);
492  free(qdp_longlink[i]);
493  }
494 
495  free(fatlink);
496  free(longlink);
497 
498  delete in;
499  delete out;
500  delete ref;
501  delete tmp;
502 
503  if (cpuFat) delete cpuFat;
504  if (cpuLong) delete cpuLong;
505 
506  endQuda();
507 }
508 
509 
510  void
512 {
513  printfQuda("running the following test:\n");
514 
515  printfQuda("prec sloppy_prec link_recon sloppy_link_recon test_type S_dimension T_dimension\n");
516  printfQuda("%s %s %s %s %s %d/%d/%d %d \n",
520 
521  printfQuda("Grid partition info: X Y Z T\n");
522  printfQuda(" %d %d %d %d\n",
523  dimPartitioned(0),
524  dimPartitioned(1),
525  dimPartitioned(2),
526  dimPartitioned(3));
527 
528  return ;
529 
530 }
531 
532  void
533 usage_extra(char** argv )
534 {
535  printfQuda("Extra options:\n");
536  printfQuda(" --test <0/1> # Test method\n");
537  printfQuda(" 0: Even even spinor CG inverter\n");
538  printfQuda(" 1: Odd odd spinor CG inverter\n");
539  printfQuda(" 3: Even even spinor multishift CG inverter\n");
540  printfQuda(" 4: Odd odd spinor multishift CG inverter\n");
541  printfQuda(" --cpu_prec <double/single/half> # Set CPU precision\n");
542 
543  return ;
544 }
545 int main(int argc, char** argv)
546 {
547  for (int i = 1; i < argc; i++) {
548 
549  if(process_command_line_option(argc, argv, &i) == 0){
550  continue;
551  }
552 
553 
554 
555  if( strcmp(argv[i], "--cpu_prec") == 0){
556  if (i+1 >= argc){
557  usage(argv);
558  }
559  cpu_prec= get_prec(argv[i+1]);
560  i++;
561  continue;
562  }
563 
564  printf("ERROR: Invalid option:%s\n", argv[i]);
565  usage(argv);
566  }
567 
569  prec_sloppy = prec;
570  }
573  }
574 
575  if(inv_type != QUDA_CG_INVERTER){
576  if(test_type != 0 && test_type != 1) errorQuda("Preconditioning is currently not supported in multi-shift solver solvers");
577  }
578 
579 
580  // initialize QMP/MPI, QUDA comms grid and RNG (test_util.cpp)
581  initComms(argc, argv, gridsize_from_cmdline);
582 
584 
585  printfQuda("dslash_type = %d\n", dslash_type);
586 
587  int ret = invert_test();
588 
589  // finalize the communications layer
590  finalizeComms();
591 
592  return ret;
593 }
int maxiter_precondition
Definition: quda.h:267
int zdim
Definition: test_util.cpp:1622
double secs
Definition: quda.h:228
int dimPartitioned(int dim)
Definition: test_util.cpp:1686
QudaDiracFieldOrder dirac_order
Definition: quda.h:195
QudaMassNormalization mass_normalization
Definition: quda.h:185
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:159
int niter
Definition: test_util.cpp:1630
QudaReconstructType reconstruct_sloppy
Definition: quda.h:46
double anisotropy
Definition: quda.h:31
QudaGhostExchange ghostExchange
Definition: lattice_field.h:60
QudaGaugeParam gaugeParam
Definition: covdev_test.cpp:36
void invertMultiShiftQuda(void **_hp_x, void *_hp_b, QudaInvertParam *param)
void endQuda(void)
void free(void *)
void construct_gauge_field(void **gauge, int type, QudaPrecision precision, QudaGaugeParam *param)
Definition: test_util.cpp:1054
QudaSolveType solve_type
Definition: quda.h:182
QudaVerbosity verbosity_precondition
Definition: quda.h:261
enum QudaPrecision_s QudaPrecision
int ga_pad
Definition: quda.h:53
void dw_setDims(int *X, const int L5)
Definition: test_util.cpp:167
QudaPrecision prec_sloppy
Definition: test_util.cpp:1616
QudaGaugeFixed gauge_fix
Definition: quda.h:51
QudaSolveType solve_type
Definition: test_util.cpp:1653
QudaInverterType inv_type_precondition
Definition: quda.h:248
QudaLinkType type
Definition: quda.h:35
const void * src
double kappa
Definition: quda.h:97
void invertQuda(void *h_x, void *h_b, QudaInvertParam *param)
void usage_extra(char **argv)
#define errorQuda(...)
Definition: util_quda.h:90
double tol
Definition: quda.h:110
QudaDslashType dslash_type
Definition: quda.h:93
QudaReconstructType reconstruct_precondition
Definition: quda.h:49
QudaInverterType inv_type
Definition: quda.h:94
QudaPrecision cuda_prec
Definition: quda.h:191
int ydim
Definition: test_util.cpp:1621
QudaReconstructType link_recon_sloppy
Definition: test_util.cpp:1613
enum QudaSolveType_s QudaSolveType
void loadGaugeQuda(void *h_gauge, QudaGaugeParam *param)
QudaPrecision cpu_prec
Definition: quda.h:190
int process_command_line_option(int argc, char **argv, int *idx)
Definition: test_util.cpp:1795
void constructSpinorField(Float *res)
QudaPrecision precision
Definition: lattice_field.h:54
int solution_accumulator_pipeline
Definition: test_util.cpp:1633
QudaDagType dagger
Definition: quda.h:184
void matdagmat_mg4dir(cpuColorSpinorField *out, void **link, void **ghostLink, cpuColorSpinorField *in, int dagger_bit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision, cpuColorSpinorField *tmp, QudaParity parity)
void finalizeComms()
Definition: test_util.cpp:107
int pipeline
Definition: test_util.cpp:1632
QudaReconstructType link_recon
Definition: test_util.cpp:1612
QudaGaugeFieldOrder gauge_order
Definition: quda.h:36
double true_res
Definition: quda.h:115
int test_type
Definition: test_util.cpp:1634
const char * get_prec_str(QudaPrecision prec)
Definition: misc.cpp:704
void * qdp_longlink[4]
int tdim
Definition: test_util.cpp:1623
QudaInverterType inv_type
Definition: test_util.cpp:1638
double tol
Definition: test_util.cpp:1647
QudaSiteSubset siteSubset
Definition: lattice_field.h:55
const char * get_test_type(int t)
Definition: misc.cpp:798
void exit(int) __attribute__((noreturn))
void setDims(int *)
Definition: test_util.cpp:130
QudaFieldLocation input_location
Definition: quda.h:90
double true_res_hq_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:168
double reliable_delta
Definition: quda.h:118
int solution_accumulator_pipeline
Definition: quda.h:129
QudaUseInitGuess use_init_guess
Definition: quda.h:206
static size_t gSize
Definition: llfat_test.cpp:36
QudaSolutionType solution_type
Definition: quda.h:181
else return(__swbuf(_c, _p))
int strcmp(const char *__s1, const char *__s2)
int x[QUDA_MAX_DIM]
Definition: lattice_field.h:50
double scale
Definition: quda.h:33
void initQuda(int device)
QudaPrecision prec
Definition: test_util.cpp:1615
QudaFieldLocation output_location
Definition: quda.h:91
void * malloc(size_t __size) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(1)))
QudaPrecision cpu_prec
QudaInvertParam inv_param
Definition: covdev_test.cpp:37
int printf(const char *,...) __attribute__((__format__(__printf__
void * qdp_fatlink[4]
static void set_params(QudaGaugeParam *gaugeParam, QudaInvertParam *inv_param, int X1, int X2, int X3, int X4, QudaPrecision cpu_prec, QudaPrecision prec, QudaPrecision prec_sloppy, QudaReconstructType link_recon, QudaReconstructType link_recon_sloppy, double mass, double tol, double reliable_delta, double tadpole_coeff)
QudaPrecision cuda_prec_sloppy
Definition: quda.h:192
QudaVerbosity verbosity
Definition: quda.h:219
void setSpinorSiteSize(int n)
Definition: test_util.cpp:192
ColorSpinorParam csParam
Definition: pack_test.cpp:24
double tol_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:156
double true_res_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:162
cpuColorSpinorField * in
QudaInvertParam newQudaInvertParam(void)
double gflops
Definition: quda.h:227
const char * get_recon_str(QudaReconstructType recon)
Definition: misc.cpp:770
cpuColorSpinorField * tmp
QudaPrecision cuda_prec_precondition
Definition: quda.h:48
#define mySpinorSiteSize
int V
Definition: test_util.cpp:28
double tol_hq
Definition: quda.h:112
#define gaugeSiteSize
Definition: test_util.h:6
int xdim
Definition: test_util.cpp:1620
double sqrt(double)
double true_res_hq
Definition: quda.h:116
void matdagmat(void *out, void **link, void *in, int dagger_bit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision, void *tmp, QudaParity parity)
QudaGammaBasis gamma_basis
Definition: quda.h:197
QudaPrecision cuda_prec_sloppy
Definition: quda.h:45
const void ** Ghost() const
Definition: gauge_field.h:254
double tol_precondition
Definition: quda.h:264
cpuGaugeField * cpuLong
double3 HeavyQuarkResidualNorm(ColorSpinorField &x, ColorSpinorField &r)
Definition: reduce_quda.cu:703
double offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:153
int use_sloppy_partial_accumulator
Definition: quda.h:119
enum QudaParity_s QudaParity
QudaReconstructType reconstruct
Definition: quda.h:43
QudaPrecision cuda_prec
Definition: quda.h:42
int X[4]
Definition: quda.h:29
double mass
Definition: quda.h:96
int gcrNkrylov
Definition: quda.h:237
double tol_hq
Definition: test_util.cpp:1648
#define NUM_OFFSETS
double mass
Definition: test_util.cpp:1642
void * longlink
double norm_2(void *v, int len, QudaPrecision precision)
int rand(void) __attribute__((__availability__(swift
int main(int argc, char **argv)
void construct_fat_long_gauge_field(void **fatlink, void **longlink, int type, QudaPrecision precision, QudaGaugeParam *param, QudaDslashType dslash_type)
Definition: test_util.cpp:1069
cpuGaugeField * cpuFat
void display_test_info()
QudaResidualType_s
Definition: enum_quda.h:165
QudaDslashType dslash_type
Definition: test_util.cpp:1626
double tadpole_coeff
Definition: quda.h:32
cpuColorSpinorField * out
QudaPrecision cuda_prec_precondition
Definition: quda.h:193
cpuColorSpinorField * ref
double tol_restart
Definition: quda.h:111
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
#define MAX(a, b)
#define printfQuda(...)
Definition: util_quda.h:84
QudaTboundary t_boundary
Definition: quda.h:38
int Vh
Definition: test_util.cpp:29
enum QudaDslashType_s QudaDslashType
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
int num_offset
Definition: quda.h:146
clock_t clock(void) __asm("_" "clock")
int Nsrc
Definition: test_util.cpp:1628
static __inline__ size_t size_t d
void * fatlink
QudaParity parity
Definition: covdev_test.cpp:53
int invert_test(void)
void initComms(int argc, char **argv, const int *commDims)
Definition: test_util.cpp:72
QudaMatPCType matpc_type
Definition: quda.h:183
void usage(char **argv)
Definition: test_util.cpp:1693
enum QudaInverterType_s QudaInverterType
QudaPrecision get_prec(QIO_Reader *infile)
Definition: qio_field.cpp:72
static void end()
QudaPrecision cpu_prec
Definition: quda.h:40
QudaGaugeParam newQudaGaugeParam(void)
QudaPreserveSource preserve_source
Definition: quda.h:188