139 template<
class fobj>
static inline void ScidacChecksum(
GridBase *grid,std::vector<fobj> &fbuf,uint32_t &scidac_csuma,uint32_t &scidac_csumb)
143 uint64_t lsites =grid->
lSites();
144 if (fbuf.size()==1) {
154 uint32_t scidac_csuma_thr=0;
155 uint32_t scidac_csumb_thr=0;
161 uint32_t * site_buf = (uint32_t *)&fbuf[local_site];
170 Lexicographic::CoorFromIndex(coor,local_site,local_vol);
172 for(
int d=0;d<nd;d++) {
173 coor[d] = coor[d]+local_start[d];
176 Lexicographic::IndexFromCoor(coor,global_site,global_vol);
178 uint64_t gsite29 = global_site%29;
179 uint64_t gsite31 = global_site%31;
181 site_crc = crc32(0,(
unsigned char *)site_buf,
sizeof(fobj));
184 scidac_csuma_thr ^= site_crc<<gsite29 | site_crc>>(32-gsite29);
185 scidac_csumb_thr ^= site_crc<<gsite31 | site_crc>>(32-gsite31);
190 scidac_csuma^= scidac_csuma_thr;
191 scidac_csumb^= scidac_csumb_thr;
265 std::vector<fobj> &iodata,
268 const std::string &format,
int control,
269 uint32_t &nersc_csum,
270 uint32_t &scidac_csuma,
271 uint32_t &scidac_csumb)
294 uint64_t lsites = grid->
lSites();
296 assert(iodata.size()==1);
298 assert(lsites==iodata.size());
300 for(
int d=0;d<ndim;d++){
301 gStart[d] = lLattice[d]*pcoor[d];
306 std::vector<int> distribs(ndim,MPI_DISTRIBUTE_BLOCK);
307 std::vector<int> dargs (ndim,MPI_DISTRIBUTE_DFLT_DARG);
308 MPI_Datatype mpiObject;
309 MPI_Datatype fileArray;
310 MPI_Datatype localArray;
311 MPI_Datatype mpiword;
312 MPI_Offset disp = offset;
317 if (
sizeof( word ) ==
sizeof(
float ) ) {
318 numword =
sizeof(fobj)/
sizeof(
float);
321 numword =
sizeof(fobj)/
sizeof(
double);
322 mpiword = MPI_DOUBLE;
329 ierr = MPI_Type_contiguous(numword,mpiword,&mpiObject); assert(ierr==0);
330 ierr = MPI_Type_commit(&mpiObject);
335 ierr=MPI_Type_create_subarray(ndim,&gLattice[0],&lLattice[0],&gStart[0],MPI_ORDER_FORTRAN, mpiObject,&fileArray); assert(ierr==0);
336 ierr=MPI_Type_commit(&fileArray); assert(ierr==0);
341 ierr=MPI_Type_create_subarray(ndim,&lLattice[0],&lLattice[0],&lStart[0],MPI_ORDER_FORTRAN, mpiObject,&localArray); assert(ierr==0);
342 ierr=MPI_Type_commit(&localArray); assert(ierr==0);
348 int ieee32big = (format == std::string(
"IEEE32BIG"));
349 int ieee32 = (format == std::string(
"IEEE32"));
350 int ieee64big = (format == std::string(
"IEEE64BIG"));
351 int ieee64 = (format == std::string(
"IEEE64") || format == std::string(
"IEEE64LITTLE"));
352 assert(ieee64||ieee32|ieee64big||ieee32big);
353 assert((ieee64+ieee32+ieee64big+ieee32big)==1);
363 std::cout<<
GridLogMessage<<
"IOobject: MPI read I/O "<< file<< std::endl;
364 ierr=MPI_File_open(grid->
communicator,(
char *) file.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &fh); assert(ierr==0);
365 ierr=MPI_File_set_view(fh, disp, mpiObject, fileArray,
"native", MPI_INFO_NULL); assert(ierr==0);
366 ierr=MPI_File_read_all(fh, &iodata[0], 1, localArray, &status); assert(ierr==0);
368 MPI_Type_free(&fileArray);
369 MPI_Type_free(&localArray);
374 std::cout <<
GridLogMessage <<
"IOobject: C++ read I/O " << file <<
" : "
375 << iodata.size() *
sizeof(fobj) <<
" bytes and offset " << offset << std::endl;
377 fin.open(file, std::ios::binary | std::ios::in);
380 fin.seekg(-
sizeof(fobj), fin.end);
384 fin.seekg(offset + myrank * lsites *
sizeof(fobj));
386 fin.read((
char *)&iodata[0], iodata.size() *
sizeof(fobj));
387 assert(fin.fail() == 0);
396 if (ieee32big)
be32toh_v((
void *)&iodata[0],
sizeof(fobj)*iodata.size());
397 if (ieee32)
le32toh_v((
void *)&iodata[0],
sizeof(fobj)*iodata.size());
398 if (ieee64big)
be64toh_v((
void *)&iodata[0],
sizeof(fobj)*iodata.size());
399 if (ieee64)
le64toh_v((
void *)&iodata[0],
sizeof(fobj)*iodata.size());
408 if (ieee32big)
htobe32_v((
void *)&iodata[0],
sizeof(fobj)*iodata.size());
409 if (ieee32)
htole32_v((
void *)&iodata[0],
sizeof(fobj)*iodata.size());
410 if (ieee64big)
htobe64_v((
void *)&iodata[0],
sizeof(fobj)*iodata.size());
411 if (ieee64)
htole64_v((
void *)&iodata[0],
sizeof(fobj)*iodata.size());
420 std::cout <<
GridLogMessage <<
"IOobject: MPI write I/O " << file << std::endl;
421 ierr = MPI_File_open(grid->
communicator, (
char *)file.c_str(), MPI_MODE_RDWR | MPI_MODE_CREATE, MPI_INFO_NULL, &fh);
423 if (ierr != MPI_SUCCESS)
425 char error_string[BUFSIZ];
426 int length_of_error_string, error_class;
428 MPI_Error_class(ierr, &error_class);
429 MPI_Error_string(error_class, error_string, &length_of_error_string);
430 fprintf(stderr,
"%3d: %s\n", myrank, error_string);
431 MPI_Error_string(ierr, error_string, &length_of_error_string);
432 fprintf(stderr,
"%3d: %s\n", myrank, error_string);
433 MPI_Abort(MPI_COMM_WORLD, 1);
436 std::cout <<
GridLogDebug <<
"MPI write I/O set view " << file << std::endl;
437 ierr = MPI_File_set_view(fh, disp, mpiObject, fileArray,
"native", MPI_INFO_NULL);
440 std::cout <<
GridLogDebug <<
"MPI write I/O write all " << file << std::endl;
441 ierr = MPI_File_write_all(fh, &iodata[0], 1, localArray, &status);
445 MPI_File_get_position(fh, &os);
446 MPI_File_get_byte_offset(fh, os, &disp);
451 MPI_Type_free(&fileArray);
452 MPI_Type_free(&localArray);
458 std::cout <<
GridLogMessage <<
"IOobject: C++ write I/O " << file <<
" : "
459 << iodata.size() *
sizeof(fobj) <<
" bytes and offset " << offset << std::endl;
462 fout.exceptions ( std::fstream::failbit | std::fstream::badbit );
465 fout.open(file,std::ios::binary|std::ios::out|std::ios::in);
467 fout.open(file,std::ios::binary|std::ios::out);
469 }
catch (
const std::fstream::failure& exc) {
470 std::cout <<
GridLogError <<
"Error in opening the file " << file <<
" for output" <<std::endl;
471 std::cout <<
GridLogError <<
"Exception description: " << exc.what() << std::endl;
474 MPI_Abort(MPI_COMM_WORLD,1);
482 fout.seekp(0,fout.end);
483 }
catch (
const std::fstream::failure& exc) {
484 std::cout <<
"Exception in seeking file end " << file << std::endl;
488 fout.seekp(offset+myrank*lsites*
sizeof(fobj));
489 }
catch (
const std::fstream::failure& exc) {
490 std::cout <<
"Exception in seeking file " << file <<
" offset "<< offset << std::endl;
495 fout.write((
char *)&iodata[0],iodata.size()*
sizeof(fobj));
497 catch (
const std::fstream::failure& exc) {
498 std::cout <<
"Exception in writing file " << file << std::endl;
499 std::cout <<
GridLogError <<
"Exception description: "<< exc.what() << std::endl;
501 MPI_Abort(MPI_COMM_WORLD,1);
506 offset = fout.tellp();
512 lastPerf.size =
sizeof(fobj)*iodata.size()*nrank;
517 else std::cout <<
" write ";
518 uint64_t bytes =
sizeof(fobj)*iodata.size()*nrank;
520 <<
lastPerf.mbytesPerSecond <<
" MB/s "<<std::endl;
528 if (iodata.size() != 1){
584 const std::string &format,
585 uint32_t &nersc_csum,
586 uint32_t &scidac_csuma,
587 uint32_t &scidac_csumb,
590 typedef typename vobj::scalar_object sobj;
591 typedef typename vobj::Realified::scalar_type word; word w=0;
593 uint64_t lsites = grid->
lSites(), offsetCopy = offset;
597 std::vector<sobj> scalardata(lsites);
598 std::vector<fobj> iodata(lsites);
606 thread_for(x, lsites, { munge(scalardata[x],iodata[x]); });
610 while (attemptsLeft >= 0)
614 nersc_csum,scidac_csuma,scidac_csumb);
617 std::vector<fobj> ckiodata(lsites);
618 uint32_t cknersc_csum, ckscidac_csuma, ckscidac_csumb;
619 uint64_t ckoffset = offsetCopy;
621 std::cout <<
GridLogMessage <<
"writeLatticeObject: read back object" << std::endl;
624 cknersc_csum,ckscidac_csuma,ckscidac_csumb);
625 if ((cknersc_csum != nersc_csum) or (ckscidac_csuma != scidac_csuma) or (ckscidac_csumb != scidac_csumb))
627 std::cout <<
GridLogMessage <<
"writeLatticeObject: read test checksum failure, re-writing (" << attemptsLeft <<
" attempt(s) remaining)" << std::endl;
629 thread_for(x,lsites, { munge(scalardata[x],iodata[x]); });
633 std::cout <<
GridLogMessage <<
"writeLatticeObject: read test checksum correct" << std::endl;
651 uint32_t &nersc_csum,
652 uint32_t &scidac_csuma,
653 uint32_t &scidac_csumb)
655 typedef typename GridSerialRNG::RngStateType RngStateType;
656 const int RngStateCount = GridSerialRNG::RngStateCount;
657 typedef std::array<RngStateType,RngStateCount> RNGstate;
658 typedef RngStateType word; word w=0;
660 std::string format =
"IEEE32BIG";
663 uint64_t gsites = grid->
gSites();
664 uint64_t lsites = grid->
lSites();
666 uint32_t nersc_csum_tmp = 0;
667 uint32_t scidac_csuma_tmp = 0;
668 uint32_t scidac_csumb_tmp = 0;
672 std::cout <<
GridLogMessage <<
"RNG read I/O on file " << file << std::endl;
674 std::vector<RNGstate> iodata(lsites);
676 nersc_csum,scidac_csuma,scidac_csumb);
680 std::vector<RngStateType> tmp(RngStateCount);
681 std::copy(iodata[lidx].begin(),iodata[lidx].end(),tmp.begin());
684 int o_idx=grid->
oIndex(lcoor);
685 int i_idx=grid->
iIndex(lcoor);
693 nersc_csum_tmp,scidac_csuma_tmp,scidac_csumb_tmp);
696 std::vector<RngStateType> tmp(RngStateCount);
697 std::copy(iodata[0].begin(),iodata[0].end(),tmp.begin());
701 nersc_csum = nersc_csum + nersc_csum_tmp;
702 scidac_csuma = scidac_csuma ^ scidac_csuma_tmp;
703 scidac_csumb = scidac_csumb ^ scidac_csumb_tmp;
705 std::cout <<
GridLogMessage <<
"RNG file nersc_checksum " << std::hex << nersc_csum << std::dec << std::endl;
706 std::cout <<
GridLogMessage <<
"RNG file scidac_checksuma " << std::hex << scidac_csuma << std::dec << std::endl;
707 std::cout <<
GridLogMessage <<
"RNG file scidac_checksumb " << std::hex << scidac_csumb << std::dec << std::endl;
718 uint32_t &nersc_csum,
719 uint32_t &scidac_csuma,
720 uint32_t &scidac_csumb)
722 typedef typename GridSerialRNG::RngStateType RngStateType;
723 typedef RngStateType word; word w=0;
724 const int RngStateCount = GridSerialRNG::RngStateCount;
725 typedef std::array<RngStateType,RngStateCount> RNGstate;
728 uint64_t gsites = grid->
gSites();
729 uint64_t lsites = grid->
lSites();
731 uint32_t nersc_csum_tmp;
732 uint32_t scidac_csuma_tmp;
733 uint32_t scidac_csumb_tmp;
736 std::string format =
"IEEE32BIG";
738 std::cout <<
GridLogMessage <<
"RNG write I/O on file " << file << std::endl;
741 std::vector<RNGstate> iodata(lsites);
743 std::vector<RngStateType> tmp(RngStateCount);
746 int o_idx=grid->
oIndex(lcoor);
747 int i_idx=grid->
iIndex(lcoor);
750 std::copy(tmp.begin(),tmp.end(),iodata[lidx].begin());
755 nersc_csum,scidac_csuma,scidac_csumb);
758 std::vector<RngStateType> tmp(RngStateCount);
760 std::copy(tmp.begin(),tmp.end(),iodata[0].begin());
763 nersc_csum_tmp,scidac_csuma_tmp,scidac_csumb_tmp);
765 nersc_csum = nersc_csum + nersc_csum_tmp;
766 scidac_csuma = scidac_csuma ^ scidac_csuma_tmp;
767 scidac_csumb = scidac_csumb ^ scidac_csumb_tmp;
769 std::cout <<
GridLogMessage <<
"RNG file checksum " << std::hex << nersc_csum << std::dec << std::endl;
770 std::cout <<
GridLogMessage <<
"RNG file checksuma " << std::hex << scidac_csuma << std::dec << std::endl;
771 std::cout <<
GridLogMessage <<
"RNG file checksumb " << std::hex << scidac_csumb << std::dec << std::endl;