17 #if defined(QMP_COMMS)
19 #elif defined(MPI_COMMS)
25 #define MAX(a,b) ((a)>(b)?(a):(b))
47 extern void usage(
char** );
54 printfQuda(
"prec sloppy_prec link_recon sloppy_link_recon S_dimension T_dimension Ls_dimension\n");
71 int main(
int argc,
char **argv)
74 for (
int i = 1; i < argc; i++){
78 printfQuda(
"ERROR: Invalid option:%s\n", argv[i]);
113 gauge_param.
X[0] =
xdim;
114 gauge_param.
X[1] =
ydim;
115 gauge_param.
X[2] =
zdim;
116 gauge_param.
X[3] =
tdim;
135 double mass = -0.4086;
145 inv_param.
mass = 0.02;
147 kappa5 = 0.5/(5 + inv_param.
m5);
153 double offset[4] = {0.01, 0.02, 0.03, 0.04};
175 inv_param.
tol = 1e-10;
196 #if __COMPUTE_CAPABILITY__ >= 200
221 inv_param.
omega = 1.0;
243 int x_face_size = gauge_param.
X[1]*gauge_param.
X[2]*gauge_param.
X[3]/2;
244 int y_face_size = gauge_param.
X[0]*gauge_param.
X[2]*gauge_param.
X[3]/2;
245 int z_face_size = gauge_param.
X[0]*gauge_param.
X[1]*gauge_param.
X[3]/2;
246 int t_face_size = gauge_param.
X[0]*gauge_param.
X[1]*gauge_param.
X[2]/2;
247 int pad_size =
MAX(x_face_size, y_face_size);
248 pad_size =
MAX(pad_size, z_face_size);
249 pad_size =
MAX(pad_size, t_face_size);
250 gauge_param.
ga_pad = pad_size;
278 void *
gauge[4], *clover_inv=0, *clover=0;
280 for (
int dir = 0; dir < 4; dir++) {
304 int asymmetric = preconditioned &&
307 if (!preconditioned) {
310 }
else if (asymmetric) {
325 double *inverse_ritzVals = 0;
333 inverse_ritzVals = (
double*)malloc(defl_dim*
sizeof(
double));
347 for (
int i=0; i<inv_param.
Ls*
V*
spinorSiteSize; i++) ((
float*)spinorIn)[i] = rand() / (float)RAND_MAX;
352 for (
int i=0; i<inv_param.
Ls*
V*
spinorSiteSize; i++) ((
double*)spinorIn)[i] = rand() / (double)RAND_MAX;
357 double time0 = -((double)clock());
375 printfQuda(
"\nStart the incremental stage.\n");
381 for (
int i=0; i<inv_param.
Ls*
V*
spinorSiteSize; i++) ((
float*)spinorIn)[i] = rand() / (float)RAND_MAX;
388 for (
int i=0; i<inv_param.
Ls*
V*
spinorSiteSize; i++) ((
double*)spinorIn)[i] = rand() / (double)RAND_MAX;
392 double time1 = -((double)clock());
398 time1 /= CLOCKS_PER_SEC;
400 printfQuda(
"\nDone: %i iter / %g secs = %g Gflops, total time = %g secs\n",
410 const int initCGruns = 16;
418 for (
int i=0; i<inv_param.
Ls*
V*
spinorSiteSize; i++) ((
float*)spinorIn)[i] = rand() / (float)RAND_MAX;
425 for (
int i=0; i<inv_param.
Ls*
V*
spinorSiteSize; i++) ((
double*)spinorIn)[i] = rand() / (double)RAND_MAX;
431 double time1 = -((double)clock());
434 incrementalEigQuda(spinorOut, spinorIn, &inv_param, ritzVects, inverse_ritzVals, last_rhs);
437 time1 /= CLOCKS_PER_SEC;
439 printfQuda(
"\nDone: %i iter / %g secs = %g Gflops, total time = %g secs\n", inv_param.
iter, inv_param.
secs, inv_param.
gflops/inv_param.
secs, time1);
446 time0 /= CLOCKS_PER_SEC;
450 printfQuda(
"Device memory used:\n Spinor: %f GiB\n Gauge: %f GiB\n",
453 printfQuda(
"\nDone: %i iter / %g secs = %g Gflops, total time = %g secs\n",
464 void *evenOut = spinorCheck;
465 void *oddOut = cpu_prec ==
sizeof(double) ? (
void*)((
double*)evenOut + tm_offset): (
void*)((
float*)evenOut + tm_offset);
468 void *oddIn = cpu_prec ==
sizeof(double) ? (
void*)((
double*)evenIn + tm_offset): (
void*)((
float*)evenIn + tm_offset);
470 tm_ndeg_mat(evenOut, oddOut, gauge, evenIn, oddIn, inv_param.
kappa, inv_param.
mu, inv_param.
epsilon, 0, inv_param.
cpu_prec, gauge_param);
492 errorQuda(
"Twisted mass solution type not supported");
518 double nrm2 =
norm_2(spinorCheck, vol*spinorSiteSize*inv_param.
Ls, inv_param.
cpu_prec);
519 double src2 =
norm_2(spinorIn, vol*spinorSiteSize*inv_param.
Ls, inv_param.
cpu_prec);
520 double l2r =
sqrt(nrm2 / src2);
522 printfQuda(
"Residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g\n",
527 free(inverse_ritzVals);
QudaGaugeParam gauge_param
int dimPartitioned(int dim)
QudaDiracFieldOrder dirac_order
QudaMassNormalization mass_normalization
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
QudaReconstructType reconstruct_sloppy
void freeCloverQuda(void)
void construct_gauge_field(void **gauge, int type, QudaPrecision precision, QudaGaugeParam *param)
QudaVerbosity verbosity_precondition
enum QudaPrecision_s QudaPrecision
void dw_setDims(int *X, const int L5)
QudaReconstructType link_recon_sloppy
QudaSchwarzType schwarz_type
__host__ __device__ ValueType norm(const complex< ValueType > &z)
Returns the magnitude of z squared.
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
QudaInverterType inv_type_precondition
QudaPrecision cuda_prec_ritz
QudaDslashType dslash_type
QudaReconstructType reconstruct_precondition
QudaInverterType inv_type
__host__ __device__ ValueType sqrt(ValueType x)
void loadGaugeQuda(void *h_gauge, QudaGaugeParam *param)
int process_command_line_option(int argc, char **argv, int *idx)
void tm_ndeg_mat(void *evenOut, void *oddOut, void **gauge, void *evenIn, void *oddIn, double kappa, double mu, double epsilon, int daggerBit, QudaPrecision precision, QudaGaugeParam &gauge_param)
int gridsize_from_cmdline[]
QudaGaugeFieldOrder gauge_order
void dw_mat(void *out, void **gauge, void *in, double kappa, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm)
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)
void loadCloverQuda(void *h_clover, void *h_clovinv, QudaInvertParam *inv_param)
QudaPrecision clover_cuda_prec_sloppy
QudaFieldLocation input_location
void ax(double a, void *x, int len, QudaPrecision precision)
QudaSolutionType solution_type
QudaSolverNormalization solver_normalization
QudaPrecision clover_cuda_prec
void initQuda(int device)
void dw_matpc(void *out, void **gauge, void *in, double kappa, QudaMatPCType matpc_type, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm)
QudaFieldLocation output_location
QudaPrecision clover_cuda_prec_precondition
QudaPrecision cuda_prec_sloppy
void setSpinorSiteSize(int n)
double tol_offset[QUDA_MAX_MULTI_SHIFT]
QudaInvertParam newQudaInvertParam(void)
const char * get_recon_str(QudaReconstructType recon)
QudaPrecision cuda_prec_precondition
QudaCloverFieldOrder clover_order
QudaGammaBasis gamma_basis
QudaReconstructType link_recon
QudaPrecision cuda_prec_sloppy
void mxpy(void *x, void *y, int len, QudaPrecision precision)
double offset[QUDA_MAX_MULTI_SHIFT]
void incrementalEigQuda(void *_h_x, void *_h_b, QudaInvertParam *param, void *_h_u, double *inv_eigenvals, int last_rhs)
int use_sloppy_partial_accumulator
QudaReconstructType reconstruct
void read_gauge_field(char *filename, void *gauge[], QudaPrecision precision, int *X, int argc, char *argv[])
double norm_2(void *v, int len, QudaPrecision precision)
void construct_clover_field(void *clover, double norm, double diag, QudaPrecision precision)
QudaInvertParam inv_param
void wil_mat(void *out, void **gauge, void *in, double kappa, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param)
QudaPrecision cuda_prec_precondition
void * memset(void *s, int c, size_t n)
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
cpuColorSpinorField * spinorOut
QudaTwistFlavorType twist_flavor
int main(int argc, char **argv)
enum QudaDslashType_s QudaDslashType
QudaResidualType residual_type
void wil_matpc(void *outEven, void **gauge, void *inEven, double kappa, QudaMatPCType matpc_type, int daggerBit, QudaPrecision precision, QudaGaugeParam &gauge_param)
QudaPrecision prec_sloppy
QudaDslashType dslash_type
QudaPrecision clover_cpu_prec
void initComms(int argc, char **argv, const int *commDims)
QudaGaugeParam newQudaGaugeParam(void)
QudaPreserveSource preserve_source