QUDA  v0.7.0
A library for QCD on GPUs
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
gauge_qio.cpp
Go to the documentation of this file.
1 #include <qio.h>
2 #include <qio_util.h>
3 #include <quda.h>
4 #include <util_quda.h>
5 
6 QIO_Layout layout;
8 int lattice_size[4];
10 
11 QIO_Reader *open_test_input(char *filename, int volfmt, int serpar,
12  char *myname){
13  QIO_String *xml_file_in;
14  QIO_Reader *infile;
15  QIO_Iflag iflag;
16 
17  iflag.serpar = serpar;
18  iflag.volfmt = volfmt;
19 
20  /* Create the file XML */
21  xml_file_in = QIO_string_create();
22 
23  /* Open the file for reading */
24  infile = QIO_open_read(xml_file_in, filename, &layout, NULL, &iflag);
25  if(infile == NULL){
26  printf("%s(%d): QIO_open_read returns NULL.\n",myname,this_node);
27  return NULL;
28  }
29 
30  printfQuda("%s: QIO_open_read done.\n",myname,this_node);
31  printfQuda("%s: User file info is \"%s\"\n", myname, QIO_string_ptr(xml_file_in));
32 
33  QIO_string_destroy(xml_file_in);
34  return infile;
35 }
36 
37 /* get QIO record precision */
38 QudaPrecision get_prec(QIO_Reader *infile) {
39  QIO_RecordInfo *rec_info = QIO_create_record_info(0, NULL, NULL, 0, "", "", 0, 0, 0, 0);
40  QIO_String *xml_file = QIO_string_create();
41  int status = QIO_read_record_info(infile, rec_info, xml_file);
42  int prec = *QIO_get_precision(rec_info);
43  QIO_destroy_record_info(rec_info);
44  QIO_string_destroy(xml_file);
45 
46  return (prec == 70) ? QUDA_SINGLE_PRECISION : QUDA_DOUBLE_PRECISION;
47 }
48 
49 int read_su3_field(QIO_Reader *infile, int count, void *field_in[], QudaPrecision cpu_prec, char *myname)
50 {
51  QIO_String *xml_record_in;
52  QIO_RecordInfo rec_info;
53  int status;
54 
55  /* Query the precision */
56  QudaPrecision file_prec = get_prec(infile);
57  size_t rec_size = file_prec*count*18;
58 
59  /* Create the record XML */
60  xml_record_in = QIO_string_create();
61 
62  /* Read the field record and convert to cpu precision*/
63  if (cpu_prec == QUDA_DOUBLE_PRECISION) {
64  if (file_prec == QUDA_DOUBLE_PRECISION) {
65  status = QIO_read(infile, &rec_info, xml_record_in, vputM<double,double,18>,
66  rec_size, QUDA_DOUBLE_PRECISION, field_in);
67  } else {
68  status = QIO_read(infile, &rec_info, xml_record_in, vputM<double,float,18>,
69  rec_size, QUDA_SINGLE_PRECISION, field_in);
70  }
71  } else {
72  if (file_prec == QUDA_DOUBLE_PRECISION) {
73  status = QIO_read(infile, &rec_info, xml_record_in, vputM<float,double,18>,
74  rec_size, QUDA_DOUBLE_PRECISION, field_in);
75  } else {
76  status = QIO_read(infile, &rec_info, xml_record_in, vputM<float,float,18>,
77  rec_size, QUDA_SINGLE_PRECISION, field_in);
78  }
79  }
80 
81  printfQuda("%s: QIO_read_record_data returns status %d\n", myname, status);
82  if(status != QIO_SUCCESS)return 1;
83  return 0;
84 }
85 
86 void read_gauge_field(char *filename, void *gauge[], QudaPrecision precision, int *X, int argc, char *argv[]) {
87  QIO_Reader *infile;
88  int status;
89  int sites_on_node = 0;
90  QMP_thread_level_t provided;
91  char myname[] = "qio_load";
92 
93  this_node = mynode();
94 
95  /* Lattice dimensions */
96  lattice_dim = 4;
97  int lattice_volume = 1;
98  for (int d=0; d<4; d++) {
99  lattice_size[d] = QMP_get_logical_dimensions()[d]*X[d];
100  lattice_volume *= lattice_size[d];
101  }
102 
103  /* Set the mapping of coordinates to nodes */
104  if(setup_layout(lattice_size, 4, QMP_get_number_of_nodes())!=0)
105  { printfQuda("Setup layout failed\n"); exit(0); }
106  printfQuda("%s layout set for %d nodes\n", myname, QMP_get_number_of_nodes());
107  sites_on_node = num_sites(this_node);
108 
109  /* Build the layout structure */
110  layout.node_number = node_number;
111  layout.node_index = node_index;
112  layout.get_coords = get_coords;
113  layout.num_sites = num_sites;
114  layout.latsize = lattice_size;
115  layout.latdim = lattice_dim;
116  layout.volume = lattice_volume;
117  layout.sites_on_node = sites_on_node;
118  layout.this_node = this_node;
119  layout.number_of_nodes = QMP_get_number_of_nodes();
120 
121  /* Open the test file for reading */
122  infile = open_test_input(filename, QIO_UNKNOWN, QIO_PARALLEL, myname);
123  if(infile == NULL) { printf("Open file failed\n"); exit(0); }
124 
125  /* Read the su3 field record */
126  printfQuda("%s: reading su3 field\n",myname); fflush(stdout);
127  status = read_su3_field(infile, 4, gauge, precision, myname);
128  if(status) { printf("read_su3_field failed %d\n", status); exit(0); }
129 
130  /* Close the file */
131  QIO_close_read(infile);
132  printfQuda("%s: Closed file for reading\n",myname);
133 
134 }
enum QudaPrecision_s QudaPrecision
void get_coords(int x[], int node, int index)
Definition: layout_hyper.c:221
QudaPrecision cpu_prec
Definition: dslash_test.cpp:34
int read_su3_field(QIO_Reader *infile, int count, void *field_in[], QudaPrecision cpu_prec, char *myname)
Definition: gauge_qio.cpp:49
QIO_Reader * open_test_input(char *filename, int volfmt, int serpar, char *myname)
Definition: gauge_qio.cpp:11
__device__ unsigned int count
Definition: reduce_core.h:112
void read_gauge_field(char *filename, void *gauge[], QudaPrecision precision, int *X, int argc, char *argv[])
Definition: gauge_qio.cpp:86
int this_node
Definition: gauge_qio.cpp:9
int setup_layout(int len[], int nd, int numnodes)
Definition: layout_hyper.c:140
QudaPrecision get_prec(QIO_Reader *infile)
Definition: gauge_qio.cpp:38
Main header file for the QUDA library.
int node_index(const int x[])
Definition: layout_hyper.c:204
#define printfQuda(...)
Definition: util_quda.h:67
QIO_Layout layout
Definition: gauge_qio.cpp:6
#define mynode
Definition: qio_util.h:6
int node_number(const int x[])
Definition: layout_hyper.c:194
int lattice_dim
Definition: gauge_qio.cpp:7
QudaPrecision prec
Definition: test_util.cpp:1551
void * gauge[4]
Definition: su3_test.cpp:15
int num_sites(int node)
Definition: layout_hyper.c:272
int lattice_size[4]
Definition: gauge_qio.cpp:8