16 #if defined(QMP_COMMS) 18 #elif defined(MPI_COMMS) 22 #define MAX(a,b) ((a)>(b)?(a):(b)) 23 #define mySpinorSiteSize 6 25 extern void usage(
char** argv);
75 template<
typename Float>
77 for(
int i = 0; i <
Vh; i++) {
78 for (
int s = 0;
s < 1;
s++) {
79 for (
int m = 0; m < 3; m++) {
80 res[i*(1*3*2) +
s*(3*2) + m*(2) + 0] = rand() / (Float)RAND_MAX;
81 res[i*(1*3*2) +
s*(3*2) + m*(2) + 1] = rand() / (Float)RAND_MAX;
97 gaugeParam->
X[0] =
X1;
98 gaugeParam->
X[1] =
X2;
99 gaugeParam->
X[2] =
X3;
100 gaugeParam->
X[3] =
X4;
118 gaugeParam->
ga_pad = X1*X2*X3/2;
135 if(
tol_hq == 0 && tol == 0){
136 errorQuda(
"qudaInvert: requesting zero residual\n");
174 inv_param->
sp_pad = X1*X2*X3/2;
202 for (
int dir = 0; dir < 4; dir++) {
212 for(
int dir=0; dir<4; ++dir){
213 for(
int i=0; i<
V; ++i){
216 ((
double*)
fatlink)[(i*4 + dir)*gaugeSiteSize + j] = ((
double*)
qdp_fatlink[dir])[i*gaugeSiteSize + j];
217 ((
double*)
longlink)[(i*4 + dir)*gaugeSiteSize + j] = ((
double*)
qdp_longlink[dir])[i*gaugeSiteSize + j];
219 ((
float*)
fatlink)[(i*4 + dir)*gaugeSiteSize + j] = ((
float*)
qdp_fatlink[dir])[i*gaugeSiteSize + j];
220 ((
float*)
longlink)[(i*4 + dir)*gaugeSiteSize + j] = ((
float*)
qdp_longlink[dir])[i*gaugeSiteSize + j];
231 for (
int d = 0; d < 4; d++) csParam.
x[d] = gaugeParam.
X[d];
258 int fat_pad = tmp_value;
259 int link_pad = 3*tmp_value;
284 gaugeParam.
ga_pad = fat_pad;
296 gaugeParam.
ga_pad = link_pad;
302 double time0 = -((double)clock());
327 spinorOutArray[0] =
out;
328 spinorInArray[0] =
in;
340 for(
int i=1;i < inv_param.
num_src; i++){
350 for(
int i=0;i < inv_param.
num_src; i++){
351 outArray[i] = spinorOutArray[i]->
V();
352 inArray[i] = spinorInArray[i]->
V();
358 time0 /= CLOCKS_PER_SEC;
373 for(
int i=1; i < inv_param.
num_src;i++)
delete spinorOutArray[i];
374 for(
int i=1; i < inv_param.
num_src;i++)
delete spinorInArray[i];
390 time0 /= CLOCKS_PER_SEC;
406 errorQuda(
"full spinor not supported\n");
412 #define NUM_OFFSETS 12 415 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};
426 spinorOutArray[0] =
out;
432 outArray[i] = spinorOutArray[i]->
V();
433 inv_param.
offset[i] = 4*masses[i]*masses[i];
446 cudaDeviceSynchronize();
448 time0 /= CLOCKS_PER_SEC;
450 printfQuda(
"done: total time = %g secs, compute time = %g, %i iter / %g secs = %g gflops\n",
459 errorQuda(
"full parity not supported\n");
465 errorQuda(
"ERROR: invalid spinor parity \n");
469 printfQuda(
"%dth solution: mass=%f, ", i, masses[i]);
472 spinorOutArray[i], masses[i], 0, inv_param.
cpu_prec,
482 double l2r =
sqrt(nrm2/src2);
484 printfQuda(
"Shift %d residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g, host = %g\n",
494 for(
int i=1; i < inv_param.
num_offset;i++)
delete spinorOutArray[i];
506 double l2r =
sqrt(nrm2/src2);
508 printfQuda(
"Residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g, host = %g\n",
511 printfQuda(
"done: total time = %g secs, compute time = %g secs, %i iter / %g secs = %g gflops, \n",
525 for(
int i=0;i < 4;i++){
538 if (cpuFat)
delete cpuFat;
550 printfQuda(
"prec sloppy_prec link_recon sloppy_link_recon test_type S_dimension T_dimension\n");
572 printfQuda(
" 0: Even even spinor CG inverter\n");
573 printfQuda(
" 1: Odd odd spinor CG inverter\n");
574 printfQuda(
" 3: Even even spinor multishift CG inverter\n");
575 printfQuda(
" 4: Odd odd spinor multishift CG inverter\n");
576 printfQuda(
" --cpu_prec <double/single/half> # Set CPU precision\n");
580 int main(
int argc,
char** argv)
582 for (
int i = 1; i < argc; i++) {
590 if( strcmp(argv[i],
"--cpu_prec") == 0){
599 printf(
"ERROR: Invalid option:%s\n", argv[i]);
int dimPartitioned(int dim)
QudaDiracFieldOrder dirac_order
QudaMassNormalization mass_normalization
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
QudaReconstructType reconstruct_sloppy
QudaGhostExchange ghostExchange
QudaGaugeParam gaugeParam
void setPrecision(QudaPrecision precision, QudaPrecision ghost_precision=QUDA_INVALID_PRECISION, bool force_native=false)
void invertMultiShiftQuda(void **_hp_x, void *_hp_b, QudaInvertParam *param)
QudaVerbosity verbosity_precondition
cpuColorSpinorField * out
enum QudaPrecision_s QudaPrecision
QudaReconstructType link_recon
void dw_setDims(int *X, const int L5)
QudaInverterType inv_type_precondition
void invertQuda(void *h_x, void *h_b, QudaInvertParam *param)
QudaDslashType dslash_type
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)
QudaPrecision prec_sloppy
void matdagmat_mg4dir(cpuColorSpinorField *out, void **link, void **ghostLink, cpuColorSpinorField *in, int dagger_bit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision, cpuColorSpinorField *tmp, QudaParity parity)
QudaGaugeFieldOrder gauge_order
const char * get_prec_str(QudaPrecision prec)
QudaSiteSubset siteSubset
const char * get_test_type(int t)
QudaFieldLocation input_location
double true_res_hq_offset[QUDA_MAX_MULTI_SHIFT]
cpuColorSpinorField * tmp
int gridsize_from_cmdline[]
QudaUseInitGuess use_init_guess
QudaSolutionType solution_type
void initQuda(int device)
QudaFieldLocation output_location
QudaInvertParam inv_param
QudaFieldOrder fieldOrder
QudaPrecision cuda_prec_sloppy
void setSpinorSiteSize(int n)
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)
int main(int argc, char **argv)
QudaPrecision cuda_prec_precondition
QudaGammaBasis gammaBasis
cpuColorSpinorField * ref
void matdagmat(void *out, void **link, void *in, int dagger_bit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision, void *tmp, QudaParity parity)
QudaGammaBasis gamma_basis
QudaPrecision cuda_prec_sloppy
QudaReconstructType link_recon_sloppy
const void ** Ghost() const
double3 HeavyQuarkResidualNorm(ColorSpinorField &x, ColorSpinorField &r)
double offset[QUDA_MAX_MULTI_SHIFT]
int use_sloppy_partial_accumulator
enum QudaParity_s QudaParity
QudaInverterType inv_type
QudaReconstructType reconstruct
double norm_2(void *v, int len, QudaPrecision precision)
void construct_fat_long_gauge_field(void **fatlink, void **longlink, int type, QudaPrecision precision, QudaGaugeParam *param, QudaDslashType dslash_type)
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, int maxiter, double reliable_delta, double tadpole_coeff)
QudaPrecision cuda_prec_precondition
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
void invertMultiSrcQuda(void **_hp_x, void **_hp_b, QudaInvertParam *param)
QudaDslashType dslash_type
void usage_extra(char **argv)
enum QudaDslashType_s QudaDslashType
void mxpy(ColorSpinorField &x, ColorSpinorField &y)
QudaResidualType residual_type
void initComms(int argc, char **argv, int *const commDims)
enum QudaInverterType_s QudaInverterType
QudaPrecision get_prec(QIO_Reader *infile)
void constructSpinorField(Float *res)
QudaGaugeParam newQudaGaugeParam(void)
QudaPreserveSource preserve_source