mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-11 14:40:46 +01:00
Merge branch 'develop' into feature/hadrons
This commit is contained in:
commit
97c579f637
109
benchmarks/Benchmark_IO.cc
Normal file
109
benchmarks/Benchmark_IO.cc
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
#ifdef HAVE_LIME
|
||||||
|
#include <Grid/Grid.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace Grid;
|
||||||
|
using namespace Grid::QCD;
|
||||||
|
|
||||||
|
#define MSG cout << GridLogMessage
|
||||||
|
#define SEP \
|
||||||
|
"============================================================================="
|
||||||
|
#ifndef BENCH_IO_LMAX
|
||||||
|
#define BENCH_IO_LMAX 40
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef function<void(const string, LatticeFermion &)> WriterFn;
|
||||||
|
typedef function<void(LatticeFermion &, const string)> ReaderFn;
|
||||||
|
|
||||||
|
string filestem(const int l)
|
||||||
|
{
|
||||||
|
return "iobench_l" + to_string(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
void limeWrite(const string filestem, LatticeFermion &vec)
|
||||||
|
{
|
||||||
|
emptyUserRecord record;
|
||||||
|
ScidacWriter binWriter;
|
||||||
|
|
||||||
|
binWriter.open(filestem + ".bin");
|
||||||
|
binWriter.writeScidacFieldRecord(vec, record);
|
||||||
|
binWriter.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void limeRead(LatticeFermion &vec, const string filestem)
|
||||||
|
{
|
||||||
|
emptyUserRecord record;
|
||||||
|
ScidacReader binReader;
|
||||||
|
|
||||||
|
binReader.open(filestem + ".bin");
|
||||||
|
binReader.readScidacFieldRecord(vec, record);
|
||||||
|
binReader.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeBenchmark(const int l, const WriterFn &write)
|
||||||
|
{
|
||||||
|
auto mpi = GridDefaultMpi();
|
||||||
|
auto simd = GridDefaultSimd(Nd, vComplex::Nsimd());
|
||||||
|
vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
|
||||||
|
unique_ptr<GridCartesian> gPt(SpaceTimeGrid::makeFourDimGrid(latt, simd, mpi));
|
||||||
|
GridCartesian *g = gPt.get();
|
||||||
|
GridParallelRNG rng(g);
|
||||||
|
LatticeFermion vec(g);
|
||||||
|
emptyUserRecord record;
|
||||||
|
ScidacWriter binWriter;
|
||||||
|
|
||||||
|
cout << "-- Local volume " << l << "^4" << endl;
|
||||||
|
random(rng, vec);
|
||||||
|
write(filestem(l), vec);
|
||||||
|
}
|
||||||
|
|
||||||
|
void readBenchmark(const int l, const ReaderFn &read)
|
||||||
|
{
|
||||||
|
auto mpi = GridDefaultMpi();
|
||||||
|
auto simd = GridDefaultSimd(Nd, vComplex::Nsimd());
|
||||||
|
vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
|
||||||
|
unique_ptr<GridCartesian> gPt(SpaceTimeGrid::makeFourDimGrid(latt, simd, mpi));
|
||||||
|
GridCartesian *g = gPt.get();
|
||||||
|
LatticeFermion vec(g);
|
||||||
|
emptyUserRecord record;
|
||||||
|
ScidacReader binReader;
|
||||||
|
|
||||||
|
cout << "-- Local volume " << l << "^4" << endl;
|
||||||
|
read(vec, filestem(l));
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, char ** argv)
|
||||||
|
{
|
||||||
|
Grid_init(&argc,&argv);
|
||||||
|
|
||||||
|
auto simd = GridDefaultSimd(Nd,vComplex::Nsimd());
|
||||||
|
auto mpi = GridDefaultMpi();
|
||||||
|
|
||||||
|
int64_t threads = GridThread::GetThreads();
|
||||||
|
MSG << "Grid is setup to use " << threads << " threads" << endl;
|
||||||
|
MSG << SEP << endl;
|
||||||
|
MSG << "Benchmark Lime write" << endl;
|
||||||
|
MSG << SEP << endl;
|
||||||
|
for (int l = 4; l <= BENCH_IO_LMAX; l += 2)
|
||||||
|
{
|
||||||
|
writeBenchmark(l, limeWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
MSG << "Benchmark Lime read" << endl;
|
||||||
|
MSG << SEP << endl;
|
||||||
|
for (int l = 4; l <= BENCH_IO_LMAX; l += 2)
|
||||||
|
{
|
||||||
|
readBenchmark(l, limeRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
Grid_finalize();
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#include <Grid/Grid.h>
|
||||||
|
int main (int argc, char ** argv)
|
||||||
|
{
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
@ -372,7 +372,7 @@ class BinaryIO {
|
|||||||
std::cout << GridLogMessage <<"IOobject: C++ read I/O " << file << " : "
|
std::cout << GridLogMessage <<"IOobject: C++ read I/O " << file << " : "
|
||||||
<< iodata.size() * sizeof(fobj) << " bytes" << std::endl;
|
<< iodata.size() * sizeof(fobj) << " bytes" << std::endl;
|
||||||
std::ifstream fin;
|
std::ifstream fin;
|
||||||
fin.open(file, std::ios::binary | std::ios::in);
|
fin.open(file, std::ios::binary | std::ios::in);
|
||||||
if (control & BINARYIO_MASTER_APPEND)
|
if (control & BINARYIO_MASTER_APPEND)
|
||||||
{
|
{
|
||||||
fin.seekg(-sizeof(fobj), fin.end);
|
fin.seekg(-sizeof(fobj), fin.end);
|
||||||
@ -453,11 +453,15 @@ class BinaryIO {
|
|||||||
std::ofstream fout;
|
std::ofstream fout;
|
||||||
fout.exceptions ( std::fstream::failbit | std::fstream::badbit );
|
fout.exceptions ( std::fstream::failbit | std::fstream::badbit );
|
||||||
try {
|
try {
|
||||||
fout.open(file,std::ios::binary|std::ios::out|std::ios::in);
|
if (offset) { // Must already exist and contain data
|
||||||
|
fout.open(file,std::ios::binary|std::ios::out|std::ios::in);
|
||||||
|
} else { // Allow create
|
||||||
|
fout.open(file,std::ios::binary|std::ios::out);
|
||||||
|
}
|
||||||
} catch (const std::fstream::failure& exc) {
|
} catch (const std::fstream::failure& exc) {
|
||||||
std::cout << GridLogError << "Error in opening the file " << file << " for output" <<std::endl;
|
std::cout << GridLogError << "Error in opening the file " << file << " for output" <<std::endl;
|
||||||
std::cout << GridLogError << "Exception description: " << exc.what() << std::endl;
|
std::cout << GridLogError << "Exception description: " << exc.what() << std::endl;
|
||||||
std::cout << GridLogError << "Probable cause: wrong path, inaccessible location "<< std::endl;
|
// std::cout << GridLogError << "Probable cause: wrong path, inaccessible location "<< std::endl;
|
||||||
#ifdef USE_MPI_IO
|
#ifdef USE_MPI_IO
|
||||||
MPI_Abort(MPI_COMM_WORLD,1);
|
MPI_Abort(MPI_COMM_WORLD,1);
|
||||||
#else
|
#else
|
||||||
|
@ -350,26 +350,36 @@ class GridLimeWriter : public BinaryIO {
|
|||||||
// iv) fseek on FILE * to end of this disjoint section.
|
// iv) fseek on FILE * to end of this disjoint section.
|
||||||
// v) Continue writing scidac record.
|
// v) Continue writing scidac record.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
GridBase *grid = field._grid;
|
||||||
////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
// Create record header
|
// Create record header
|
||||||
////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
typedef typename vobj::scalar_object sobj;
|
typedef typename vobj::scalar_object sobj;
|
||||||
int err;
|
int err;
|
||||||
uint32_t nersc_csum,scidac_csuma,scidac_csumb;
|
uint32_t nersc_csum,scidac_csuma,scidac_csumb;
|
||||||
uint64_t PayloadSize = sizeof(sobj) * field._grid->_gsites;
|
uint64_t PayloadSize = sizeof(sobj) * grid->_gsites;
|
||||||
createLimeRecordHeader(record_name, 0, 0, PayloadSize);
|
createLimeRecordHeader(record_name, 0, 0, PayloadSize);
|
||||||
|
fflush(File);
|
||||||
|
|
||||||
// std::cout << "W sizeof(sobj)" <<sizeof(sobj)<<std::endl;
|
// std::cout << "W sizeof(sobj)" <<sizeof(sobj)<<std::endl;
|
||||||
// std::cout << "W Gsites " <<field._grid->_gsites<<std::endl;
|
// std::cout << "W Gsites " <<field._grid->_gsites<<std::endl;
|
||||||
// std::cout << "W Payload expected " <<PayloadSize<<std::endl;
|
// std::cout << "W Payload expected " <<PayloadSize<<std::endl;
|
||||||
|
|
||||||
fflush(File);
|
////////////////////////////////////////////////
|
||||||
|
// Check all nodes agree on file position
|
||||||
|
////////////////////////////////////////////////
|
||||||
|
uint64_t offset1 = ftello(File);
|
||||||
|
|
||||||
|
uint64_t compare = offset1;
|
||||||
|
grid->Broadcast(0,(void *)&compare,sizeof(compare));
|
||||||
|
|
||||||
|
assert(compare == offset1 );
|
||||||
|
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
// Write by other means into the binary record
|
// Write by other means into the binary record
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
uint64_t offset1 = ftello(File); // std::cout << " Writing to offset "<<offset1 << std::endl;
|
|
||||||
std::string format = getFormatString<vobj>();
|
std::string format = getFormatString<vobj>();
|
||||||
BinarySimpleMunger<sobj,sobj> munge;
|
BinarySimpleMunger<sobj,sobj> munge;
|
||||||
BinaryIO::writeLatticeObject<vobj,sobj>(field, filename, munge, offset1, format,nersc_csum,scidac_csuma,scidac_csumb);
|
BinaryIO::writeLatticeObject<vobj,sobj>(field, filename, munge, offset1, format,nersc_csum,scidac_csuma,scidac_csumb);
|
||||||
@ -380,7 +390,15 @@ class GridLimeWriter : public BinaryIO {
|
|||||||
fseek(File,0,SEEK_END);
|
fseek(File,0,SEEK_END);
|
||||||
uint64_t offset2 = ftello(File); // std::cout << " now at offset "<<offset2 << std::endl;
|
uint64_t offset2 = ftello(File); // std::cout << " now at offset "<<offset2 << std::endl;
|
||||||
|
|
||||||
assert((offset2-offset1) == PayloadSize);
|
/////////////////////////////////////////////////////////////
|
||||||
|
// Must synchronise the nodes so no race between nodes
|
||||||
|
/////////////////////////////////////////////////////////////
|
||||||
|
grid->Barrier();
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////
|
||||||
|
// Check MPI-2 I/O did what we expect to file
|
||||||
|
/////////////////////////////////////////////////////////////
|
||||||
|
assert( (offset2-offset1) == PayloadSize);
|
||||||
|
|
||||||
err=limeWriterCloseRecord(LimeW); assert(err>=0);
|
err=limeWriterCloseRecord(LimeW); assert(err>=0);
|
||||||
|
|
||||||
|
@ -136,8 +136,9 @@ struct scidacRecord : Serializable {
|
|||||||
int, typesize,
|
int, typesize,
|
||||||
int, datacount);
|
int, datacount);
|
||||||
|
|
||||||
scidacRecord() { version =1.0; }
|
scidacRecord()
|
||||||
|
: version(1.0), recordtype(0), colors(0), spins(0), typesize(0), datacount(0)
|
||||||
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////
|
////////////////////////
|
||||||
|
@ -81,18 +81,16 @@ namespace Grid {
|
|||||||
std::string, creation_date,
|
std::string, creation_date,
|
||||||
std::string, archive_date,
|
std::string, archive_date,
|
||||||
std::string, floating_point);
|
std::string, floating_point);
|
||||||
FieldMetaData(void) {
|
// WARNING: non-initialised values might lead to twisted parallel IO
|
||||||
nd=4;
|
// issues, std::string are fine because they initliase to size 0
|
||||||
dimension.resize(4);
|
// as per C++ standard.
|
||||||
boundary.resize(4);
|
FieldMetaData(void)
|
||||||
scidac_checksuma=0;
|
: nd(4), dimension(4,0), boundary(4, ""), data_start(0),
|
||||||
scidac_checksumb=0;
|
link_trace(0.), plaquette(0.), checksum(0),
|
||||||
checksum=0;
|
scidac_checksuma(0), scidac_checksumb(0), sequence_number(0)
|
||||||
}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace QCD {
|
namespace QCD {
|
||||||
|
|
||||||
using namespace Grid;
|
using namespace Grid;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user