17 #if defined(QMP_COMMS)
19 #elif defined(MPI_COMMS)
25 #define MAX(a,b) ((a)>(b)?(a):(b))
57 extern void usage(
char** );
64 printfQuda(
"prec prec_sloppy multishift matpc_type recon recon_sloppy S_dimension T_dimension Ls_dimension dslash_type normalization\n");
65 printfQuda(
"%6s %6s %d %12s %2s %2s %3d/%3d/%3d %3d %2d %14s %8s\n",
84 int main(
int argc,
char **argv)
87 for (
int i = 1; i < argc; i++){
91 printfQuda(
"ERROR: Invalid option:%s\n", argv[i]);
130 gauge_param.
X[0] =
xdim;
131 gauge_param.
X[1] =
ydim;
132 gauge_param.
X[2] =
zdim;
133 gauge_param.
X[3] =
tdim;
163 kappa5 = 0.5/(5 + inv_param.
m5);
167 kappa5 = 0.5/(5 + inv_param.
m5);
169 for(
int k = 0; k <
Lsdim; k++)
173 inv_param.
b_5[k] = 1.452;
174 inv_param.
c_5[k] = 0.452;
180 double offset[4] = {0.01, 0.02, 0.03, 0.04};
210 inv_param.
tol = 1e-7;
212 #if __COMPUTE_CAPABILITY__ >= 200
239 inv_param.
omega = 1.0;
259 int x_face_size = gauge_param.
X[1]*gauge_param.
X[2]*gauge_param.
X[3]/2;
260 int y_face_size = gauge_param.
X[0]*gauge_param.
X[2]*gauge_param.
X[3]/2;
261 int z_face_size = gauge_param.
X[0]*gauge_param.
X[1]*gauge_param.
X[3]/2;
262 int t_face_size = gauge_param.
X[0]*gauge_param.
X[1]*gauge_param.
X[2]/2;
263 int pad_size =
MAX(x_face_size, y_face_size);
264 pad_size =
MAX(pad_size, z_face_size);
265 pad_size =
MAX(pad_size, t_face_size);
266 gauge_param.
ga_pad = pad_size;
297 void *
gauge[4], *clover_inv=0, *clover=0;
299 for (
int dir = 0; dir < 4; dir++) {
322 int asymmetric = preconditioned &&
325 if (!preconditioned) {
328 }
else if (asymmetric) {
338 void *
spinorOut = NULL, **spinorOutMulti = NULL;
340 spinorOutMulti = (
void**)malloc(inv_param.
num_offset*
sizeof(
void *));
362 for (
int i=0; i<inv_param.
Ls*
V*
spinorSiteSize; i++) ((
float*)spinorIn)[i] = rand() / (float)RAND_MAX;
365 for (
int i=0; i<inv_param.
Ls*
V*
spinorSiteSize; i++) ((
double*)spinorIn)[i] = rand() / (double)RAND_MAX;
369 double time0 = -((double)clock());
391 time0 /= CLOCKS_PER_SEC;
393 printfQuda(
"Device memory used:\n Spinor: %f GiB\n Gauge: %f GiB\n",
398 printfQuda(
"\nDone: %i iter / %g secs = %g Gflops, total time = %g secs\n",
403 errorQuda(
"Mass normalization not supported for multi-shift solver in invert_test");
414 errorQuda(
"Twisted mass solution type not supported");
425 printfQuda(
"Domain wall not supported for multi-shift\n");
429 axpy(inv_param.
offset[i], spinorOutMulti[i], spinorCheck,
Vh*spinorSiteSize, inv_param.
cpu_prec);
430 mxpy(spinorIn, spinorCheck,
Vh*spinorSiteSize, inv_param.
cpu_prec);
433 double l2r =
sqrt(nrm2 / src2);
435 printfQuda(
"Shift %d residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g\n",
451 void *evenOut = spinorCheck;
452 void *oddOut = cpu_prec ==
sizeof(double) ? (
void*)((
double*)evenOut + tm_offset): (
void*)((
float*)evenOut + tm_offset);
455 void *oddIn = cpu_prec ==
sizeof(double) ? (
void*)((
double*)evenIn + tm_offset): (
void*)((
float*)evenIn + tm_offset);
457 tm_ndeg_mat(evenOut, oddOut, gauge, evenIn, oddIn, inv_param.
kappa, inv_param.
mu, inv_param.
epsilon, 0, inv_param.
cpu_prec, gauge_param);
487 errorQuda(
"Twisted mass solution type not supported");
498 double *kappa_b, *kappa_c;
499 kappa_b = (
double*)malloc(
Lsdim*
sizeof(
double));
500 kappa_c = (
double*)malloc(
Lsdim*
sizeof(
double));
503 kappa_b[
xs] = 1.0/(2*(inv_param.
b_5[
xs]*(4.0 + inv_param.
m5) + 1.0));
504 kappa_c[
xs] = 1.0/(2*(inv_param.
c_5[
xs]*(4.0 + inv_param.
m5) - 1.0));
506 mdw_matpc(spinorCheck, gauge, spinorOut, kappa_b, kappa_c, inv_param.
matpc_type, 0, inv_param.
cpu_prec, gauge_param, inv_param.
mass, inv_param.
b_5, inv_param.
c_5);
533 errorQuda(
"Twisted mass solution type not supported");
549 errorQuda(
"Mass normalization not implemented");
558 double nrm2 =
norm_2(spinorCheck, vol*spinorSiteSize*inv_param.
Ls, inv_param.
cpu_prec);
559 double src2 =
norm_2(spinorIn, vol*spinorSiteSize*inv_param.
Ls, inv_param.
cpu_prec);
560 double l2r =
sqrt(nrm2 / src2);
562 printfQuda(
"Residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g\n",
QudaGaugeParam gauge_param
int dimPartitioned(int dim)
QudaDiracFieldOrder dirac_order
QudaMassNormalization mass_normalization
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
enum QudaMassNormalization_s QudaMassNormalization
QudaReconstructType reconstruct_sloppy
void freeCloverQuda(void)
QudaTwistFlavorType twist_flavor
double b_5[QUDA_MAX_DWF_LS]
void dw_4d_matpc(void *out, void **gauge, void *in, double kappa, QudaMatPCType matpc_type, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm)
void invertMultiShiftQuda(void **_hp_x, void *_hp_b, QudaInvertParam *param)
void construct_gauge_field(void **gauge, int type, QudaPrecision precision, QudaGaugeParam *param)
QudaVerbosity verbosity_precondition
enum QudaPrecision_s QudaPrecision
int main(int argc, char **argv)
void dw_setDims(int *X, const int L5)
cpuColorSpinorField * spinorTmp
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
void mdw_matpc(void *out, void **gauge, void *in, double *kappa_b, double *kappa_c, QudaMatPCType matpc_type, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm, double *b5, double *c5)
void invertQuda(void *h_x, void *h_b, QudaInvertParam *param)
QudaDslashType dslash_type
QudaReconstructType reconstruct_precondition
QudaInverterType inv_type
double c_5[QUDA_MAX_DWF_LS]
__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)
const char * get_matpc_str(QudaMatPCType type)
QudaGaugeFieldOrder gauge_order
void dw_mat(void *out, void **gauge, void *in, double kappa, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm)
QudaReconstructType link_recon
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
double true_res_hq_offset[QUDA_MAX_MULTI_SHIFT]
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
QudaMassNormalization normalization
void setSpinorSiteSize(int n)
const char * get_mass_normalization_str(QudaMassNormalization type)
double tol_offset[QUDA_MAX_MULTI_SHIFT]
double true_res_offset[QUDA_MAX_MULTI_SHIFT]
QudaInvertParam newQudaInvertParam(void)
const char * get_recon_str(QudaReconstructType recon)
QudaPrecision cuda_prec_precondition
QudaCloverFieldOrder clover_order
enum QudaMatPCType_s QudaMatPCType
QudaGammaBasis gamma_basis
QudaPrecision cuda_prec_sloppy
const char * get_dslash_str(QudaDslashType type)
void mxpy(void *x, void *y, int len, QudaPrecision precision)
double offset[QUDA_MAX_MULTI_SHIFT]
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 axpy(double a, void *x, void *y, 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)
QudaInverterType inv_type
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
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)
QudaDslashType dslash_type
QudaReconstructType link_recon_sloppy
QudaPrecision prec_sloppy
QudaInverterType precon_type
int gridsize_from_cmdline[]
QudaPrecision clover_cpu_prec
void initComms(int argc, char **argv, const int *commDims)
enum QudaInverterType_s QudaInverterType
QudaGaugeParam newQudaGaugeParam(void)
QudaPreserveSource preserve_source
enum QudaTwistFlavorType_s QudaTwistFlavorType