QUDA  1.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
pack_test.cpp
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <iostream>
4 
5 #include <quda_internal.h>
6 #include <gauge_field.h>
7 #include <util_quda.h>
8 
9 #include <test_util.h>
10 #include <dslash_util.h>
11 
12 #include <color_spinor_field.h>
13 #include <blas_quda.h>
14 
15 using namespace quda;
16 
19 
20 void *qdpCpuGauge_p[4];
23 
25 
26 int ODD_BIT = 0;
27 int DAGGER_BIT = 0;
28 
29 extern int device;
30 extern int xdim;
31 extern int ydim;
32 extern int zdim;
33 extern int tdim;
35 extern QudaPrecision prec;
36 extern char latfile[];
37 extern int gridsize_from_cmdline[];
38 
40 
41 void init() {
42 
43  param.cpu_prec = prec_cpu;
44  param.cuda_prec = prec;
45  param.reconstruct = link_recon;
46  param.cuda_prec_sloppy = param.cuda_prec;
47  param.reconstruct_sloppy = param.reconstruct;
48 
49  param.X[0] = xdim;
50  param.X[1] = ydim;
51  param.X[2] = zdim;
52  param.X[3] = tdim;
53 #ifdef MULTI_GPU
54  param.ga_pad = xdim*ydim*zdim/2;
55 #else
56  param.ga_pad = 0;
57 #endif
58  setDims(param.X);
59 
60  param.anisotropy = 2.3;
63 
64  // construct input fields
65  for (int dir = 0; dir < 4; dir++) {
66  qdpCpuGauge_p[dir] = malloc(V*gaugeSiteSize*param.cpu_prec);
67  }
68  cpsCpuGauge_p = malloc(4*V*gaugeSiteSize*param.cpu_prec);
69 
70  csParam.nColor = 3;
71  csParam.nSpin = 4;
72  csParam.nDim = 4;
73  for (int d=0; d<4; d++) csParam.x[d] = param.X[d];
74  csParam.setPrecision(prec_cpu);
75  csParam.pad = 0;
81 
82  spinor = new cpuColorSpinorField(csParam);
83  spinor2 = new cpuColorSpinorField(csParam);
84 
85  spinor->Source(QUDA_RANDOM_SOURCE);
86 
88 
89  setVerbosityQuda(QUDA_VERBOSE, "", stdout);
90 
94  csParam.pad = param.X[0] * param.X[1] * param.X[2];
95 
96  cudaSpinor = new cudaColorSpinorField(csParam);
97 }
98 
99 void end() {
100  // release memory
101  delete cudaSpinor;
102  delete spinor2;
103  delete spinor;
104 
105  for (int dir = 0; dir < 4; dir++) free(qdpCpuGauge_p[dir]);
106  free(cpsCpuGauge_p);
107  endQuda();
108 }
109 
110 void packTest() {
111 
112  printf("Sending fields to GPU...\n"); fflush(stdout);
113 
114 #ifdef BUILD_CPS_INTERFACE
115  {
117 
118  GaugeFieldParam cpsParam(cpsCpuGauge_p, param);
119  cpuGaugeField cpsCpuGauge(cpsParam);
120  cpsParam.create = QUDA_NULL_FIELD_CREATE;
121  cpsParam.setPrecision(param.cuda_prec);
122  cpsParam.reconstruct = param.reconstruct;
123  cpsParam.pad = param.ga_pad;
124  cpsParam.order = (cpsParam.Precision() == QUDA_DOUBLE_PRECISION ||
125  cpsParam.reconstruct == QUDA_RECONSTRUCT_NO ) ?
127  cudaGaugeField cudaCpsGauge(cpsParam);
128 
129  stopwatchStart();
130  cudaCpsGauge.loadCPUField(cpsCpuGauge);
131  double cpsGtime = stopwatchReadSeconds();
132  printf("CPS Gauge send time = %e seconds\n", cpsGtime);
133 
134  stopwatchStart();
135  cudaCpsGauge.saveCPUField(cpsCpuGauge);
136  double cpsGRtime = stopwatchReadSeconds();
137  printf("CPS Gauge restore time = %e seconds\n", cpsGRtime);
138  }
139 #endif
140 
141 #ifdef BUILD_QDP_INTERFACE
142  {
144 
145  GaugeFieldParam qdpParam(qdpCpuGauge_p, param);
146  cpuGaugeField qdpCpuGauge(qdpParam);
147  qdpParam.create = QUDA_NULL_FIELD_CREATE;
148  qdpParam.setPrecision(param.cuda_prec);
149  qdpParam.reconstruct = param.reconstruct;
150  qdpParam.pad = param.ga_pad;
151  qdpParam.order = (qdpParam.Precision() == QUDA_DOUBLE_PRECISION ||
152  qdpParam.reconstruct == QUDA_RECONSTRUCT_NO ) ?
154  cudaGaugeField cudaQdpGauge(qdpParam);
155 
156  stopwatchStart();
157  cudaQdpGauge.loadCPUField(qdpCpuGauge);
158  double qdpGtime = stopwatchReadSeconds();
159  printf("QDP Gauge send time = %e seconds\n", qdpGtime);
160 
161  stopwatchStart();
162  cudaQdpGauge.saveCPUField(qdpCpuGauge);
163  double qdpGRtime = stopwatchReadSeconds();
164  printf("QDP Gauge restore time = %e seconds\n", qdpGRtime);
165  }
166 #endif
167 
168  stopwatchStart();
169 
170  *cudaSpinor = *spinor;
171  double sSendTime = stopwatchReadSeconds();
172  printf("Spinor send time = %e seconds\n", sSendTime); fflush(stdout);
173 
174  stopwatchStart();
175  *spinor2 = *cudaSpinor;
176  double sRecTime = stopwatchReadSeconds();
177  printf("Spinor receive time = %e seconds\n", sRecTime); fflush(stdout);
178 
179  double spinor_norm = blas::norm2(*spinor);
180  double cuda_spinor_norm = blas::norm2(*cudaSpinor);
181  double spinor2_norm = blas::norm2(*spinor2);
182 
183  printf("Norm check: CPU = %e, CUDA = %e, CPU = %e\n",
184  spinor_norm, cuda_spinor_norm, spinor2_norm);
185 
186  cpuColorSpinorField::Compare(*spinor, *spinor2, 1);
187 
188 }
189 
190 extern void usage(char**);
191 
192 int main(int argc, char **argv) {
193  for (int i=1; i<argc; i++){
194  if(process_command_line_option(argc, argv, &i) == 0){
195  continue;
196  }
197 
198  fprintf(stderr, "ERROR: Invalid option:%s\n", argv[i]);
199  usage(argv);
200  }
201 
202  initComms(argc, argv, gridsize_from_cmdline);
203 
204  init();
205  packTest();
206  end();
207 
208  finalizeComms();
209 }
210 
cpuColorSpinorField * spinor
Definition: pack_test.cpp:22
QudaReconstructType reconstruct_sloppy
Definition: quda.h:53
double anisotropy
Definition: quda.h:38
void setPrecision(QudaPrecision precision, QudaPrecision ghost_precision=QUDA_INVALID_PRECISION, bool force_native=false)
void setVerbosityQuda(QudaVerbosity verbosity, const char prefix[], FILE *outfile)
void endQuda(void)
enum QudaPrecision_s QudaPrecision
int ga_pad
Definition: quda.h:63
void saveCPUField(cpuGaugeField &cpu) const
Upload from this field into a CPU field.
QudaGaugeFixed gauge_fix
Definition: quda.h:61
cpuColorSpinorField * spinor2
Definition: pack_test.cpp:22
double norm2(const ColorSpinorField &a)
Definition: reduce_quda.cu:721
int process_command_line_option(int argc, char **argv, int *idx)
Definition: test_util.cpp:2019
void Source(const QudaSourceType sourceType, const int st=0, const int s=0, const int c=0)
void finalizeComms()
Definition: test_util.cpp:128
QudaGaugeFieldOrder gauge_order
Definition: quda.h:43
void stopwatchStart()
Definition: test_util.cpp:4419
QudaSiteSubset siteSubset
Definition: lattice_field.h:71
void setDims(int *)
Definition: test_util.cpp:151
QudaGaugeParam param
Definition: pack_test.cpp:17
int x[QUDA_MAX_DIM]
Definition: lattice_field.h:67
double stopwatchReadSeconds()
Definition: test_util.cpp:4423
void loadCPUField(const cpuGaugeField &cpu)
Download into this field from a CPU field.
void initQuda(int device)
int tdim
Definition: test_util.cpp:1618
cudaColorSpinorField * cudaSpinor
Definition: pack_test.cpp:18
void packTest()
Definition: pack_test.cpp:110
int ODD_BIT
Definition: pack_test.cpp:26
ColorSpinorParam csParam
Definition: pack_test.cpp:24
int DAGGER_BIT
Definition: pack_test.cpp:27
QudaGaugeFieldOrder order
Definition: gauge_field.h:17
QudaPrecision prec
Definition: test_util.cpp:1608
QudaPrecision cuda_prec_sloppy
Definition: quda.h:52
QudaPrecision prec_cpu
Definition: pack_test.cpp:39
char latfile[]
Definition: test_util.cpp:1623
int ydim
Definition: test_util.cpp:1616
QudaReconstructType link_recon
Definition: test_util.cpp:1605
QudaReconstructType reconstruct
Definition: quda.h:50
QudaPrecision cuda_prec
Definition: quda.h:49
int X[4]
Definition: quda.h:36
void end()
Definition: pack_test.cpp:99
int V
Definition: test_util.cpp:27
static int Compare(const cpuColorSpinorField &a, const cpuColorSpinorField &b, const int resolution=1)
Perform a component by component comparison of two color-spinor fields. In doing we normalize with re...
int zdim
Definition: test_util.cpp:1617
void usage(char **)
Definition: test_util.cpp:1783
void setPrecision(QudaPrecision precision, bool force_native=false)
Helper function for setting the precision and corresponding field order for QUDA internal fields...
Definition: gauge_field.h:131
enum QudaReconstructType_s QudaReconstructType
void init()
Definition: pack_test.cpp:41
QudaPrecision Precision() const
Definition: lattice_field.h:58
int device
Definition: test_util.cpp:1602
QudaTboundary t_boundary
Definition: quda.h:45
int main(int argc, char **argv)
Definition: pack_test.cpp:192
QudaReconstructType reconstruct
Definition: gauge_field.h:16
QudaFieldCreate create
Definition: gauge_field.h:26
int xdim
Definition: test_util.cpp:1615
int gridsize_from_cmdline[]
Definition: test_util.cpp:49
void initComms(int argc, char **argv, int *const commDims)
Definition: test_util.cpp:88
void * cpsCpuGauge_p
Definition: pack_test.cpp:21
QudaPrecision cpu_prec
Definition: quda.h:47
#define gaugeSiteSize
Definition: face_gauge.cpp:34
void * qdpCpuGauge_p[4]
Definition: pack_test.cpp:20