QUDA  0.9.0
hisq_unitarize_force_test.cpp
Go to the documentation of this file.
1 #include <cstdio>
2 #include <cstdlib>
3 #include <cstring>
4 
5 #include <quda.h>
6 #include "test_util.h"
7 #include "gauge_field.h"
8 #include "misc.h"
9 #include "hisq_force_reference.h"
10 #include "ks_improved_force.h"
11 #include "hw_quda.h"
12 #include <sys/time.h>
13 #include <dslash_quda.h>
14 
15 using namespace quda;
16 extern void usage(char** argv);
19 
22 
25 
26 
28 
30 
31 
32 extern bool verify_results;
33 double accuracy = 1e-5;
34 int ODD_BIT = 1;
35 extern int device;
36 extern int xdim, ydim, zdim, tdim;
37 extern int gridsize_from_cmdline[];
38 
40 extern QudaPrecision prec;
45 
46 void setPrecision(QudaPrecision precision)
47 {
48  link_prec = precision;
49  return;
50 }
51 
52 
53 
54 
55 // Create a field of links that are not su3_matrices
56 void createNoisyLinkCPU(void** field, QudaPrecision prec, int seed)
57 {
58  createSiteLinkCPU(field, prec, 0);
59 
60  srand(seed);
61  for(int dir=0; dir<4; ++dir){
62  for(int i=0; i<V*18; ++i){
64  double* ptr = ((double**)field)[dir] + i;
65  *ptr += (rand() - RAND_MAX/2.0)/(20.0*RAND_MAX);
66  }else if(prec == QUDA_SINGLE_PRECISION){
67  float* ptr = ((float**)field)[dir]+i;
68  *ptr += (rand() - RAND_MAX/2.0)/(20.0*RAND_MAX);
69  }
70  }
71  }
72  return;
73 }
74 
75 
76 
77 // allocate memory
78 // set the layout, etc.
79 static void
81 {
83 
84  gaugeParam.X[0] = xdim;
85  gaugeParam.X[1] = ydim;
86  gaugeParam.X[2] = zdim;
87  gaugeParam.X[3] = tdim;
88 
90 
99  gParam.anisotropy = 1;
100 
105 
106  // create "gauge fields"
107  int seed=0;
108 #ifdef MULTI_GPU
109  seed += comm_rank();
110 #endif
111 
114 
120 
123 
124 
125  return;
126 }
127 
128 
129 static void
131 {
132  delete cpuFatLink;
133  delete cpuOprod;
134  delete cpuResult;
135 
136  delete cudaFatLink;
137  delete cudaOprod;
138  delete cudaResult;
139 
140  delete cpuReference;
141 
142  endQuda();
143  return;
144 }
145 
146 static void
148 {
149  hisq_force_init();
150 
151  double unitarize_eps = 1e-5;
152  const double hisq_force_filter = 5e-5;
153  const double max_det_error = 1e-12;
154  const bool allow_svd = true;
155  const bool svd_only = false;
156  const double svd_rel_err = 1e-8;
157  const double svd_abs_err = 1e-8;
158 
159  fermion_force::setUnitarizeForceConstants(unitarize_eps, hisq_force_filter, max_det_error, allow_svd, svd_only, svd_rel_err, svd_abs_err);
160 
161 
162 
163  int* num_failures_dev;
164  if(cudaMalloc(&num_failures_dev, sizeof(int)) != cudaSuccess){
165  errorQuda("cudaMalloc failed for num_failures_dev\n");
166  }
167  cudaMemset(num_failures_dev, 0, sizeof(int));
168 
169  printfQuda("Calling unitarizeForceCuda\n");
171 
172 
173  if(verify_results){
174  printfQuda("Calling unitarizeForceCPU\n");
176  }
177 
179 
180  printfQuda("Comparing CPU and GPU results\n");
181  for(int dir=0; dir<4; ++dir){
182  int res = compare_floats(((char**)cpuReference->Gauge_p())[dir], ((char**)cpuResult->Gauge_p())[dir], cpuReference->Volume()*gaugeSiteSize, accuracy, gaugeParam.cpu_prec);
183 #ifdef MULTI_GPU
184  comm_allreduce_int(&res);
185  res /= comm_size();
186 #endif
187  printfQuda("Dir:%d Test %s\n",dir,(1 == res) ? "PASSED" : "FAILED");
188  }
189 
190  hisq_force_end();
191 }
192 
193 
194 static void
196 {
197  printfQuda("running the following fermion force computation test:\n");
198 
199  printfQuda("link_precision link_reconstruct space_dim(x/y/z) T_dimension\n");
200  printfQuda("%s %s %d/%d/%d %d \n",
203  xdim, ydim, zdim, tdim);
204  return ;
205 
206 }
207 
208 int
209 main(int argc, char **argv)
210 {
211  int i;
212  for (i =1;i < argc; i++){
213 
214  if(process_command_line_option(argc, argv, &i) == 0){
215  continue;
216  }
217 
218  fprintf(stderr, "ERROR: Invalid option:%s\n", argv[i]);
219  usage(argv);
220  }
221 
222  initComms(argc, argv, gridsize_from_cmdline);
223 
225 
227 
228  hisq_force_test();
229 
230  finalizeComms();
231 
232  return EXIT_SUCCESS;
233 }
234 
static void hisq_force_test()
int comm_rank(void)
Definition: comm_mpi.cpp:120
QudaGhostExchange ghostExchange
Definition: lattice_field.h:60
static void hisq_force_init()
cudaGaugeField * cudaResult
void endQuda(void)
enum QudaPrecision_s QudaPrecision
void saveCPUField(cpuGaugeField &cpu) const
Upload from this field into a CPU field.
void setUnitarizeForceConstants(double unitarize_eps, double hisq_force_filter, double max_det_error, bool allow_svd, bool svd_only, double svd_rel_error, double svd_abs_error)
Set the constant parameters for the force unitarization.
bool verify_results
Definition: test_util.cpp:1641
#define errorQuda(...)
Definition: util_quda.h:90
int main(int argc, char **argv)
int ydim
Definition: test_util.cpp:1621
int * num_failures_dev
int process_command_line_option(int argc, char **argv, int *idx)
Definition: test_util.cpp:1795
static QudaGaugeParam gaugeParam
cpuGaugeField * cpuResult
void finalizeComms()
Definition: test_util.cpp:107
void setPrecision(QudaPrecision precision)
QudaGaugeFieldOrder gauge_order
Definition: quda.h:36
int compare_floats(void *a, void *b, int len, double epsilon, QudaPrecision precision)
Definition: test_util.cpp:437
const char * get_prec_str(QudaPrecision prec)
Definition: misc.cpp:704
void unitarizeForceCPU(cpuGaugeField &newForce, const cpuGaugeField &oldForce, const cpuGaugeField &gauge)
Unitarize the fermion force on CPU.
int zdim
Definition: test_util.cpp:1622
void createSiteLinkCPU(void **link, QudaPrecision precision, int phase)
Definition: test_util.cpp:1229
void setDims(int *)
Definition: test_util.cpp:130
QudaPrecision link_prec
else return(__swbuf(_c, _p))
cpuGaugeField * cpuReference
void loadCPUField(const cpuGaugeField &cpu)
Download into this field from a CPU field.
int comm_size(void)
Definition: comm_mpi.cpp:126
void initQuda(int device)
static void display_test_info()
void srand(unsigned) __attribute__((__availability__(swift
cpuGaugeField * cpuFatLink
cpuGaugeField * cpuOprod
cudaGaugeField * cudaFatLink
const char * get_recon_str(QudaReconstructType recon)
Definition: misc.cpp:770
int V
Definition: test_util.cpp:28
#define gaugeSiteSize
Definition: test_util.h:6
QudaGaugeFieldOrder order
Definition: gauge_field.h:15
QudaReconstructType link_recon
Definition: test_util.cpp:1612
int Volume() const
double accuracy
QudaReconstructType reconstruct
Definition: quda.h:43
QudaPrecision cuda_prec
Definition: quda.h:42
int X[4]
Definition: quda.h:29
int fprintf(FILE *, const char *,...) __attribute__((__format__(__printf__
void unitarizeForce(cudaGaugeField &newForce, const cudaGaugeField &oldForce, const cudaGaugeField &gauge, int *unitarization_failed, long long *flops=NULL)
Unitarize the fermion force.
const void * ptr
int rand(void) __attribute__((__availability__(swift
cudaGaugeField * cudaOprod
static void hisq_force_end()
GaugeFieldParam gParam
QudaPrecision prec
Definition: test_util.cpp:1615
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
int gridsize_from_cmdline[]
Definition: test_util.cpp:50
QudaLinkType link_type
Definition: gauge_field.h:17
void createNoisyLinkCPU(void **field, QudaPrecision prec, int seed)
int tdim
Definition: test_util.cpp:1623
#define printfQuda(...)
Definition: util_quda.h:84
void comm_allreduce_int(int *data)
Definition: comm_mpi.cpp:305
QudaFieldCreate create
Definition: gauge_field.h:25
QudaPrecision hw_prec
void usage(char **argv)
Definition: test_util.cpp:1693
QudaPrecision mom_prec
void initComms(int argc, char **argv, const int *commDims)
Definition: test_util.cpp:72
QudaPrecision cpu_hw_prec
int xdim
Definition: test_util.cpp:1620
QudaPrecision cpu_prec
Definition: quda.h:40