20 for(
int i=0; i < s1.size(); ++i)
38 goffsets.resize(nodeSites);
39 srcnode.resize(nodeSites);
40 dstnode.resize(nodeSites);
49#pragma omp parallel for
50 for(
int linear=0; linear < nodeSites; ++linear)
67 srcnode[linear] = fnode;
70 dstnode[linear] = bnode;
73 QDP_info(
"linear=%d coord=%d %d %d %d fcoord=%d %d %d %d bcoord=%d %d %d %d goffsets=%d",
75 coord[0], coord[1], coord[2], coord[3],
76 fcoord[0], fcoord[1], fcoord[2], fcoord[3],
77 bcoord[0], bcoord[1], bcoord[2], bcoord[3],
90 int cnt_srcenodes = 0;
91 for(
int i=0; i < srcenodes_tmp.
size(); ++i)
92 if (srcenodes_tmp[i] != my_node)
95 int cnt_destnodes = 0;
96 for(
int i=0; i < destnodes_tmp.
size(); ++i)
97 if (destnodes_tmp[i] != my_node)
102 for(
int i=0; i < srcenodes_tmp.
size(); ++i)
103 QDP_info(
"srcenodes_tmp(%d) = %d",i,srcenodes_tmp[i]);
105 for(
int i=0; i < destnodes_tmp.
size(); ++i)
106 QDP_info(
"destnodes_tmp(%d) = %d",i,destnodes_tmp[i]);
108 QDP_info(
"cnt_srcenodes = %d", cnt_srcenodes);
109 QDP_info(
"cnt_destnodes = %d", cnt_destnodes);
113 if (cnt_srcenodes > 0 && cnt_destnodes == 0)
114 QDP_error_exit(
"Map: some bizarre error - no dest nodes but have srce nodes");
116 if (cnt_srcenodes == 0 && cnt_destnodes > 0)
117 QDP_error_exit(
"Map: some bizarre error - no srce nodes but have dest nodes");
120 offnodeP = (cnt_srcenodes > 0) ?
true :
false;
129 QDP_info(
"no off-node communications: exiting Map::make");
135 srcenodes.resize(cnt_srcenodes);
136 destnodes.resize(cnt_destnodes);
138 for(
int i=0, j=0; i < srcenodes_tmp.
size(); ++i)
139 if (srcenodes_tmp[i] != my_node)
140 srcenodes[j++] = srcenodes_tmp[i];
142 for(
int i=0, j=0; i < destnodes_tmp.
size(); ++i)
143 if (destnodes_tmp[i] != my_node)
144 destnodes[j++] = destnodes_tmp[i];
148 for(
int i=0; i < srcenodes.size(); ++i)
149 QDP_info(
"srcenodes(%d) = %d",i,srcenodes(i));
151 for(
int i=0; i < destnodes.size(); ++i)
152 QDP_info(
"destnodes(%d) = %d",i,destnodes(i));
156 srcenodes_num.
resize(srcenodes.size());
157 destnodes_num.resize(destnodes.size());
163 for(
int linear=0; linear < nodeSites; ++linear)
165 int this_node = srcnode[linear];
166 if (this_node != my_node)
167 for(
int i=0; i < srcenodes_num.size(); ++i)
169 if (srcenodes[i] == this_node)
176 int that_node = dstnode[linear];
177 if (that_node != my_node)
178 for(
int i=0; i < destnodes_num.size(); ++i)
180 if (destnodes[i] == that_node)
190 for(
int i=0; i < destnodes.size(); ++i)
192 QDP_info(
"srcenodes(%d) = %d",i,srcenodes(i));
193 QDP_info(
"destnodes(%d) = %d",i,destnodes(i));
196 for(
int i=0; i < destnodes_num.size(); ++i)
198 QDP_info(
"srcenodes_num(%d) = %d",i,srcenodes_num(i));
199 QDP_info(
"destnodes_num(%d) = %d",i,destnodes_num(i));
205 if (srcenodes.size() != 1)
208 if (destnodes.size() != 1)
216 soffsets.resize(destnodes_num[0]);
221 for(
int i=0, si=0; i < nodeSites; ++i)
229 if (fnode == my_node)
230 soffsets[si++] = fline;
235 for(
int i=0; i < soffsets.size(); ++i)
236 QDP_info(
"soffsets(%d) = %d",i,soffsets(i));
261 lleng = result.length();
268 dd_tmp =
new(std::nothrow)
char[lleng];
269 if( dd_tmp == 0x0 ) {
274 memcpy(dd_tmp, result.c_str(), lleng);
283 result.assign(dd_tmp, lleng);
293 return (QMP_get_msg_passing_type() == QMP_GRID) ? true :
false;
310 void route(
void *buffer,
int srce_node,
int dest_node,
int count)
313 QDP_info(
"starting a route, count=%d, srcenode=%d destnode=%d",
314 count,srce_node,dest_node);
330 QDP_info(
"starting a sendToWait, count=%d, destnode=%d", count,dest_node);
333 QMP_msgmem_t request_msg = QMP_declare_msgmem(send_buf, count);
334 QMP_msghandle_t request_mh = QMP_declare_send_to(request_msg, dest_node, 0);
336 if (QMP_start(request_mh) != QMP_SUCCESS)
339 QMP_wait(request_mh);
341 QMP_free_msghandle(request_mh);
342 QMP_free_msgmem(request_msg);
354 QDP_info(
"starting a recvFromWait, count=%d, srcenode=%d", count, srce_node);
357 QMP_msgmem_t request_msg = QMP_declare_msgmem(recv_buf, count);
358 QMP_msghandle_t request_mh = QMP_declare_receive_from(request_msg, srce_node, 0);
360 if (QMP_start(request_mh) != QMP_SUCCESS)
363 QMP_wait(request_mh);
365 QMP_free_msghandle(request_mh);
366 QMP_free_msgmem(request_msg);
369 QDP_info(
"finished a recvFromWait");
379 const char* output,
size_t size,
size_t nmemb)
383 size_t sizemem = size*nmemb;
384 size_t tot_size = sizemem*xinc;
385 char *recv_buf =
new(std::nothrow)
char[tot_size];
386 if( recv_buf == 0x0 ) {
393 for(
int site=0; site <
Layout::vol(); site += xinc)
400 if (node != old_node)
410 for(
int i=0; i < xinc; ++i)
413 memcpy(recv_buf+i*sizemem, output+linear*sizemem, sizemem);
441 const char* output,
size_t size,
size_t nmemb,
444 size_t tot_size = size*nmemb;
445 char *recv_buf =
new(std::nothrow)
char[tot_size];
446 if( recv_buf == 0x0 ) {
461 memcpy(recv_buf, output+linear*tot_size, tot_size);
487 const char* output,
size_t size,
size_t nmemb,
493 const int color = sub.
color();
497 size_t sizemem = size*nmemb;
498 size_t max_tot_size = sizemem*xinc;
499 char *recv_buf =
new(std::nothrow)
char[max_tot_size];
500 if( recv_buf == 0x0 ) {
504 char *recv_buf_size =
new(std::nothrow)
char[
sizeof(
int)];
505 if( recv_buf_size == 0x0 ) {
512 for(
int site=0; site <
Layout::vol(); site += xinc)
524 if (node != old_node)
535 for(
int i=0; i < xinc; ++i)
538 if (lat_color[linear] == color)
540 memcpy(recv_buf+site_cnt*sizemem, output+linear*sizemem, sizemem);
544 memcpy(recv_buf_size, (
void *)&site_cnt,
sizeof(
int));
560 memcpy((
void *)&site_cnt, recv_buf_size,
sizeof(
int));
575 delete[] recv_buf_size;
584 char* input,
size_t size,
size_t nmemb)
588 size_t sizemem = size*nmemb;
589 size_t tot_size = sizemem*xinc;
590 char *recv_buf =
new(std::nothrow)
char[tot_size];
591 if( recv_buf == 0x0 ) {
596 for(
int site=0; site <
Layout::vol(); site += xinc)
621 for(
int i=0; i < xinc; ++i)
625 memcpy(input+linear*sizemem, recv_buf+i*sizemem, sizemem);
636 char* input,
size_t size,
size_t nmemb,
639 size_t tot_size = size*nmemb;
640 char *recv_buf =
new(std::nothrow)
char[tot_size];
641 if( recv_buf == 0x0 ) {
669 memcpy(input+linear*tot_size, recv_buf, tot_size);
677 char* input,
size_t size,
size_t nmemb,
683 const int color = sub.
color();
687 size_t sizemem = size*nmemb;
688 size_t max_tot_size = sizemem*xinc;
689 char *recv_buf =
new(std::nothrow)
char[max_tot_size];
690 if( recv_buf == 0x0 ) {
694 char *recv_buf_size =
new(std::nothrow)
char[
sizeof(
int)];
695 if( recv_buf_size == 0x0 ) {
700 for(
int site=0; site <
Layout::vol(); site += xinc)
715 for(
int i=0; i < xinc; ++i)
718 if (lat_color[linear] == color)
723 memcpy(recv_buf_size, (
void *)&site_cnt,
sizeof(
int));
733 memcpy((
void *)&site_cnt, recv_buf_size,
sizeof(
int));
765 for(
int i=0,j=0; i < xinc; ++i)
768 if (lat_color[linear] == color)
770 memcpy(input+linear*sizemem, recv_buf+j*sizemem, sizemem);
777 delete[] recv_buf_size;
786 size_t size,
size_t nmemb,
787 int start_lexico,
int stop_lexico)
791 if ((stop_lexico % xinc) != 0)
793 QDPIO::cerr << __func__ <<
": erorr: stop_lexico= " << stop_lexico <<
" xinc= " << xinc << std::endl;
797 size_t sizemem = size*nmemb;
798 size_t tot_size = sizemem*xinc;
799 char *recv_buf =
new(std::nothrow)
char[tot_size];
800 if( recv_buf == 0x0 ) {
804 for (
int site=start_lexico; site < stop_lexico; site += xinc)
828 for(
int i=0; i < xinc; ++i)
831 memcpy(input+linear*sizemem, recv_buf+i*sizemem, sizemem);
842 size_t size,
size_t nmemb,
843 int start_lexico,
int stop_lexico)
847 if ((stop_lexico % xinc) != 0)
849 QDPIO::cerr << __func__ <<
": erorr: stop_lexico= " << stop_lexico <<
" xinc= " << xinc << std::endl;
853 size_t sizemem = size*nmemb;
854 size_t tot_size = sizemem*xinc;
855 char *recv_buf =
new(std::nothrow)
char[tot_size];
856 if( recv_buf == 0x0 ) {
862 for (
int site=start_lexico; site < stop_lexico; site += xinc)
869 if (node != old_node){
876 for(
int i=0; i < xinc; ++i){
878 memcpy(recv_buf+i*sizemem, output+linear*sizemem, sizemem);
916 size_t size =
sizeof(
REAL32);
917 size_t su3_size = size*mat_size;
918 n_uint32_t checksum = 0;
923 for(
int dd=0; dd<
Nd; dd++)
929 char *chk_buf =
new(std::nothrow)
char[su3_size];
930 if( chk_buf == 0x0 ) {
934 for(
int linear=0; linear < nodeSites; ++linear)
936 for(
int dd=0; dd<
Nd; dd++)
944 for(
int kk=0; kk<
Nc; kk++)
945 for(
int ii=0; ii<2; ii++)
952 memcpy(chk_buf, &(su3[0][0][0]), su3_size);
960 for(
int kk=0; kk<
Nc; kk++)
961 for(
int ii=0; ii<
Nc; ii++)
968 memcpy(chk_buf, &(su3[0][0][0]), su3_size);
973 QDPIO::cerr << __func__ <<
": unexpected size" << std::endl;
978 n_uint32_t* chk_ptr = (n_uint32_t*)chk_buf;
979 for(
unsigned int i=0; i < mat_size*size/
sizeof(n_uint32_t); ++i)
980 checksum += chk_ptr[i];
1004 n_uint32_t& checksum,
int mat_size,
int float_size)
1006 size_t size = float_size;
1007 size_t su3_size = size*mat_size;
1008 size_t tot_size = su3_size*
Nd;
1011 char *input =
new(std::nothrow)
char[tot_size*nodeSites];
1012 if( input == 0x0 ) {
1016 char *recv_buf =
new(std::nothrow)
char[tot_size];
1017 if( recv_buf == 0x0 ) {
1037 n_uint32_t* chk_ptr = (n_uint32_t*)recv_buf;
1038 for(
unsigned int i=0; i < mat_size*
Nd*size/
sizeof(n_uint32_t); ++i)
1039 checksum += chk_ptr[i];
1058 memcpy(input+linear*tot_size, recv_buf, tot_size);
1069 for(
int linear=0; linear < nodeSites; ++linear)
1071 for(
int dd=0; dd<
Nd; dd++)
1074 if (float_size == 4)
1078 for(
int cp_index=0; cp_index < mat_size; cp_index++) {
1079 su3_p[cp_index] = (
REAL)(input_p[cp_index]);
1082 else if (float_size == 8)
1087 for(
int cp_index=0; cp_index < mat_size; cp_index++) {
1088 su3_p[cp_index] = (
REAL)input_p[cp_index];
1092 QDPIO::cerr << __func__ <<
": Unknown mat size" << std::endl;
1099 su3[2][0][0] = su3[0][1][0]*su3[1][2][0] - su3[0][1][1]*su3[1][2][1]
1100 - su3[0][2][0]*su3[1][1][0] + su3[0][2][1]*su3[1][1][1];
1101 su3[2][0][1] = su3[0][2][0]*su3[1][1][1] + su3[0][2][1]*su3[1][1][0]
1102 - su3[0][1][0]*su3[1][2][1] - su3[0][1][1]*su3[1][2][0];
1104 su3[2][1][0] = su3[0][2][0]*su3[1][0][0] - su3[0][2][1]*su3[1][0][1]
1105 - su3[0][0][0]*su3[1][2][0] + su3[0][0][1]*su3[1][2][1];
1106 su3[2][1][1] = su3[0][0][0]*su3[1][2][1] + su3[0][0][1]*su3[1][2][0]
1107 - su3[0][2][0]*su3[1][0][1] - su3[0][2][1]*su3[1][0][0];
1109 su3[2][2][0] = su3[0][0][0]*su3[1][1][0] - su3[0][0][1]*su3[1][1][1]
1110 - su3[0][1][0]*su3[1][0][0] + su3[0][1][1]*su3[1][0][1];
1111 su3[2][2][1] = su3[0][1][0]*su3[1][0][1] + su3[0][1][1]*su3[1][0][0]
1112 - su3[0][0][0]*su3[1][1][1] - su3[0][0][1]*su3[1][1][0];
1116 for(
int kk=0; kk<
Nc; kk++)
1118 for(
int ii=0; ii<
Nc; ii++)
1125 u[dd].elem(linear) = sitefield.
elem();
1145 size_t size =
sizeof(
REAL32);
1146 size_t su3_size = size*mat_size;
1147 size_t tot_size = su3_size*
Nd;
1148 char *recv_buf =
new(std::nothrow)
char[tot_size];
1149 if( recv_buf == 0x0 ) {
1157 for(
int dd=0; dd<
Nd; dd++)
1159 sa[dd].
resize(nodeSites);
1174 char *recv_buf_tmp = recv_buf;
1176 for(
int dd=0; dd<
Nd; dd++)
1178 if ( mat_size == 12 )
1182 for(
int kk=0; kk<
Nc; kk++)
1183 for(
int ii=0; ii<2; ii++)
1190 memcpy(recv_buf_tmp, &(su3[0][0][0]), su3_size);
1196 for(
int kk=0; kk<
Nc; kk++)
1197 for(
int ii=0; ii<
Nc; ii++)
1204 memcpy(recv_buf_tmp, &(su3[0][0][0]), su3_size);
1207 recv_buf_tmp += su3_size;
1233 QDPIO::cerr << __func__ <<
": error writing configuration" << std::endl;
virtual void readArrayPrimaryNode(char *output, size_t nbytes, size_t nmemb)
Read data on the primary node only.
Binary writer base class.
virtual void writeArrayPrimaryNode(const char *output, size_t nbytes, size_t nmemb)
Write data on the primary node only.
virtual void writeArray(const char *output, size_t nbytes, size_t nmemb)
Write data from the primary node.
virtual bool fail()
Checks status of the previous IO operation.
void make(const MapFunc &func)
Actual constructor from a function object.
Set - collection of subsets controlling which sites are involved in an operation.
const multi1d< int > & latticeColoring() const
The coloring of the lattice sites.
Subsets - controls how lattices are looped.
int color() const
Access the coloring for this subset.
const Set & getSet() const
The super-set of this subset.
Container for a multi-dimensional 1D array.
int size() const
Size of array.
void resize(int ns1)
Resize routine, call a templated resize, using *this to disambiguate.
int DML_route_bytes(char *buf, size_t size, int fromnode, int tonode)
OScalar< PScalar< PScalar< RComplex< REAL > > > > Complex
OScalar< PScalar< PColorMatrix< RComplex< REAL >, Nc > > > ColorMatrix
OScalar< PScalar< PScalar< RScalar< REAL > > > > Real
void QDP_extract(multi1d< OScalar< T > > &dest, const OLattice< T > &src, const Subset &s)
Copy data values from field src to array dest.
void readArchiv(BinaryReader &cfg_in, multi1d< LatticeColorMatrix > &u, n_uint32_t &checksum, int mat_size, int float_size)
Read a NERSC Gauge Connection Archive file.
TextWriter & operator<<(TextWriter &txt, const std::string &output)
void writeArchiv(BinaryWriter &cfg_out, const multi1d< LatticeColorMatrix > &u, int mat_size)
Writes a NERSC Gauge Connection Archive gauge configuration file.
float toFloat(const IScalar< T > &s)
QDP Real to float primitive in conversion routine.
Subset all
Default all subset.
void writeOLatticeSlice(BinaryWriter &bin, const char *output, size_t size, size_t nmemb, int start_lexico, int stop_lexico)
void readOLatticeSlice(BinaryReader &bin, char *input, size_t size, size_t nmemb, int start_lexico, int stop_lexico)
Lattice time slice reader.
int nodeNumber()
Returns the node number of this node.
int linearSiteIndex(int site)
The linearized site index for the corresponding lexicographic site.
int sitesOnNode()
Subgrid lattice volume.
multi1d< int > siteCoords(int node, int index) QDP_CONST
Reconstruct the lattice coordinate from the node and site number.
const multi1d< int > & lattSize()
Virtual grid (problem grid) lattice size.
const multi1d< int > & subgridLattSize()
Subgrid (grid on each node) lattice size.
int vol()
Total lattice volume.
bool primaryNode()
Returns whether this is the primary node.
StandardOutputStream cerr
void broadcast(T &dest)
Broadcast from primary node to all other nodes.
void sendToWait(void *send_buf, int dest_node, int count)
Send to another node (wait).
void clearToSend(void *buffer, int count, int node)
Send a clear-to-send.
void route(void *buffer, int srce_node, int dest_node, int count)
Route to another node (blocking).
bool gridArch()
Is this a grid architecture.
void recvFromWait(void *recv_buf, int srce_node, int count)
Receive from another node (wait).
void broadcast_str(std::string &result)
Broadcast a string from primary node to all other nodes.
void globalSumArray(unsigned int *dest, int len)
Wrapper to get a functional unsigned global sum.
Yet another random number generator.
MakeReturn< UnaryNode< FnReal, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnReal >::Type_t >::Expression_t real(const QDPExpr< T1, C1 > &l)
MakeReturn< UnaryNode< FnPeekColorMatrix, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, C1 >::Expression_t peekColor(const QDPExpr< T1, C1 > &l, int row, int col)
void QDP_error_exit(const char *format,...)
Simple error display and abort routine.
void readOLattice(BinaryReader &bin, char *input, size_t size, size_t nmemb)
Read a lattice quantity.
multi1d< int > uniquify_list(const multi1d< int > &ll)
Unique-ify a list.
C1 & pokeColor(QDPType< T1, C1 > &l, const QDPExpr< T2, C2 > &r, int row, int col)
void writeOLattice(BinaryWriter &bin, const char *output, size_t size, size_t nmemb)
Write a lattice quantity.
void QDP_abort(int status)
Panic button.
MakeReturn< BinaryNode< FnCmplx, typenameCreateLeaf< QDPType< T1, C1 > >::Leaf_t, typenameCreateLeaf< QDPExpr< T2, C2 > >::Leaf_t >, typenameBinaryReturn< C1, C2, FnCmplx >::Type_t >::Expression_t cmplx(const QDPType< T1, C1 > &l, const QDPExpr< T2, C2 > &r)
n_uint32_t computeChecksum(const multi1d< LatticeColorMatrix > &u, int mat_size)
Compute simple NERSC-like checksum of a gauge field.
MakeReturn< UnaryNode< FnImag, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnImag >::Type_t >::Expression_t imag(const QDPExpr< T1, C1 > &l)
multi1d< int > crtesn(int ipos, const multi1d< int > &latt_size)
Decompose a lexicographic site into coordinates.
int QDP_info(const char *format,...)
Simple information display routine.
Primary include file for QDP.