mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-11 14:40:46 +01:00
IO benchmark on a list of directories
This commit is contained in:
parent
2f368c33fc
commit
291bc2a1f0
@ -1,108 +1,48 @@
|
|||||||
#include <Grid/Grid.h>
|
|
||||||
#ifdef HAVE_LIME
|
|
||||||
|
|
||||||
using namespace std;
|
#include "Benchmark_IO.hpp"
|
||||||
using namespace Grid;
|
|
||||||
using namespace Grid::QCD;
|
|
||||||
|
|
||||||
#define MSG cout << GridLogMessage
|
|
||||||
#define SEP \
|
|
||||||
"============================================================================="
|
|
||||||
#ifndef BENCH_IO_LMAX
|
#ifndef BENCH_IO_LMAX
|
||||||
#define BENCH_IO_LMAX 40
|
#define BENCH_IO_LMAX 40
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef function<void(const string, LatticeFermion &)> WriterFn;
|
using namespace Grid;
|
||||||
typedef function<void(LatticeFermion &, const string)> ReaderFn;
|
using namespace QCD;
|
||||||
|
|
||||||
string filestem(const int l)
|
std::string filestem(const int l)
|
||||||
{
|
{
|
||||||
return "iobench_l" + to_string(l);
|
return "iobench_l" + std::to_string(l);
|
||||||
}
|
|
||||||
|
|
||||||
void limeWrite(const string filestem, LatticeFermion &vec)
|
|
||||||
{
|
|
||||||
emptyUserRecord record;
|
|
||||||
ScidacWriter binWriter(vec._grid->IsBoss());
|
|
||||||
|
|
||||||
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(g->IsBoss());
|
|
||||||
|
|
||||||
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)
|
int main (int argc, char ** argv)
|
||||||
{
|
{
|
||||||
Grid_init(&argc,&argv);
|
Grid_init(&argc,&argv);
|
||||||
|
|
||||||
auto simd = GridDefaultSimd(Nd,vComplex::Nsimd());
|
|
||||||
auto mpi = GridDefaultMpi();
|
|
||||||
|
|
||||||
int64_t threads = GridThread::GetThreads();
|
int64_t threads = GridThread::GetThreads();
|
||||||
MSG << "Grid is setup to use " << threads << " threads" << endl;
|
MSG << "Grid is setup to use " << threads << " threads" << std::endl;
|
||||||
MSG << SEP << endl;
|
MSG << SEP << std::endl;
|
||||||
MSG << "Benchmark Lime write" << endl;
|
MSG << "Benchmark Lime write" << std::endl;
|
||||||
MSG << SEP << endl;
|
MSG << SEP << std::endl;
|
||||||
for (int l = 4; l <= BENCH_IO_LMAX; l += 2)
|
for (int l = 4; l <= BENCH_IO_LMAX; l += 2)
|
||||||
{
|
{
|
||||||
writeBenchmark(l, limeWrite);
|
auto mpi = GridDefaultMpi();
|
||||||
|
std::vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
|
||||||
|
|
||||||
|
std::cout << "-- Local volume " << l << "^4" << std::endl;
|
||||||
|
writeBenchmark<LatticeFermion>(latt, filestem(l), limeWrite<LatticeFermion>);
|
||||||
}
|
}
|
||||||
|
|
||||||
MSG << "Benchmark Lime read" << endl;
|
MSG << "Benchmark Lime read" << std::endl;
|
||||||
MSG << SEP << endl;
|
MSG << SEP << std::endl;
|
||||||
for (int l = 4; l <= BENCH_IO_LMAX; l += 2)
|
for (int l = 4; l <= BENCH_IO_LMAX; l += 2)
|
||||||
{
|
{
|
||||||
readBenchmark(l, limeRead);
|
auto mpi = GridDefaultMpi();
|
||||||
|
std::vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
|
||||||
|
|
||||||
|
std::cout << "-- Local volume " << l << "^4" << std::endl;
|
||||||
|
readBenchmark<LatticeFermion>(latt, filestem(l), limeRead<LatticeFermion>);
|
||||||
}
|
}
|
||||||
|
|
||||||
Grid_finalize();
|
Grid_finalize();
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
int main (int argc, char ** argv)
|
|
||||||
{
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
107
benchmarks/Benchmark_IO.hpp
Normal file
107
benchmarks/Benchmark_IO.hpp
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
#ifndef Benchmark_IO_hpp_
|
||||||
|
#define Benchmark_IO_hpp_
|
||||||
|
|
||||||
|
#include <Grid/Grid.h>
|
||||||
|
|
||||||
|
#define MSG std::cout << GridLogMessage
|
||||||
|
#define SEP \
|
||||||
|
"============================================================================="
|
||||||
|
|
||||||
|
namespace Grid {
|
||||||
|
|
||||||
|
template <typename Field>
|
||||||
|
using WriterFn = std::function<void(const std::string, Field &)> ;
|
||||||
|
template <typename Field>
|
||||||
|
using ReaderFn = std::function<void(Field &, const std::string)>;
|
||||||
|
|
||||||
|
template <typename Field>
|
||||||
|
void limeWrite(const std::string filestem, Field &vec)
|
||||||
|
{
|
||||||
|
emptyUserRecord record;
|
||||||
|
QCD::ScidacWriter binWriter(vec._grid->IsBoss());
|
||||||
|
|
||||||
|
binWriter.open(filestem + ".bin");
|
||||||
|
binWriter.writeScidacFieldRecord(vec, record);
|
||||||
|
binWriter.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Field>
|
||||||
|
void limeRead(Field &vec, const std::string filestem)
|
||||||
|
{
|
||||||
|
emptyUserRecord record;
|
||||||
|
QCD::ScidacReader binReader;
|
||||||
|
|
||||||
|
binReader.open(filestem + ".bin");
|
||||||
|
binReader.readScidacFieldRecord(vec, record);
|
||||||
|
binReader.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void makeGrid(std::shared_ptr<GridBase> &gPt,
|
||||||
|
const std::shared_ptr<GridCartesian> &gBasePt,
|
||||||
|
const unsigned int Ls = 1, const bool rb = false)
|
||||||
|
{
|
||||||
|
if (rb)
|
||||||
|
{
|
||||||
|
if (Ls > 1)
|
||||||
|
{
|
||||||
|
gPt.reset(QCD::SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls, gBasePt.get()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gPt.reset(QCD::SpaceTimeGrid::makeFourDimRedBlackGrid(gBasePt.get()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Ls > 1)
|
||||||
|
{
|
||||||
|
gPt.reset(QCD::SpaceTimeGrid::makeFiveDimGrid(Ls, gBasePt.get()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gPt = gBasePt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Field>
|
||||||
|
void writeBenchmark(const std::vector<int> &latt, const std::string filename,
|
||||||
|
const WriterFn<Field> &write,
|
||||||
|
const unsigned int Ls = 1, const bool rb = false)
|
||||||
|
{
|
||||||
|
auto mpi = GridDefaultMpi();
|
||||||
|
auto simd = GridDefaultSimd(latt.size(), Field::vector_type::Nsimd());
|
||||||
|
std::shared_ptr<GridCartesian> gBasePt(QCD::SpaceTimeGrid::makeFourDimGrid(latt, simd, mpi));
|
||||||
|
std::shared_ptr<GridBase> gPt;
|
||||||
|
|
||||||
|
makeGrid(gPt, gBasePt, Ls, rb);
|
||||||
|
|
||||||
|
GridBase *g = gPt.get();
|
||||||
|
GridParallelRNG rng(g);
|
||||||
|
Field vec(g);
|
||||||
|
|
||||||
|
random(rng, vec);
|
||||||
|
write(filename, vec);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Field>
|
||||||
|
void readBenchmark(const std::vector<int> &latt, const std::string filename,
|
||||||
|
const ReaderFn<Field> &read,
|
||||||
|
const unsigned int Ls = 1, const bool rb = false)
|
||||||
|
{
|
||||||
|
auto mpi = GridDefaultMpi();
|
||||||
|
auto simd = GridDefaultSimd(latt.size(), Field::vector_type::Nsimd());
|
||||||
|
std::shared_ptr<GridCartesian> gBasePt(QCD::SpaceTimeGrid::makeFourDimGrid(latt, simd, mpi));
|
||||||
|
std::shared_ptr<GridBase> gPt;
|
||||||
|
|
||||||
|
makeGrid(gPt, gBasePt, Ls, rb);
|
||||||
|
|
||||||
|
GridBase *g = gPt.get();
|
||||||
|
Field vec(g);
|
||||||
|
|
||||||
|
read(vec, filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // Benchmark_IO_hpp_
|
63
benchmarks/Benchmark_IO_vs_dir.cc
Normal file
63
benchmarks/Benchmark_IO_vs_dir.cc
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#include "Benchmark_IO.hpp"
|
||||||
|
|
||||||
|
#define MSG std::cout << GridLogMessage
|
||||||
|
#define SEP \
|
||||||
|
"============================================================================="
|
||||||
|
#ifndef BENCH_IO_LMAX
|
||||||
|
#define BENCH_IO_LMAX 40
|
||||||
|
#endif
|
||||||
|
|
||||||
|
using namespace Grid;
|
||||||
|
using namespace QCD;
|
||||||
|
|
||||||
|
int main (int argc, char ** argv)
|
||||||
|
{
|
||||||
|
std::vector<std::string> dir;
|
||||||
|
unsigned int Ls;
|
||||||
|
bool rb;
|
||||||
|
if (argc < 4)
|
||||||
|
{
|
||||||
|
std::cerr << "usage: " << argv[0] << " <Ls> <RB {0|1}> <dir1> [<dir2> ... <dirn>] [Grid options]";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
}
|
||||||
|
Ls = std::stoi(argv[1]);
|
||||||
|
rb = (std::string(argv[2]) == "1");
|
||||||
|
for (unsigned int i = 3; i < argc; ++i)
|
||||||
|
{
|
||||||
|
std::string a = argv[i];
|
||||||
|
|
||||||
|
if (a[0] != '-')
|
||||||
|
{
|
||||||
|
dir.push_back(std::string(argv[i]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Grid_init(&argc,&argv);
|
||||||
|
|
||||||
|
|
||||||
|
int64_t threads = GridThread::GetThreads();
|
||||||
|
MSG << "Grid is setup to use " << threads << " threads" << std::endl;
|
||||||
|
MSG << SEP << std::endl;
|
||||||
|
MSG << "Benchmark Lime write" << std::endl;
|
||||||
|
MSG << SEP << std::endl;
|
||||||
|
for (auto &d: dir)
|
||||||
|
{
|
||||||
|
MSG << "-- Directory " << d << std::endl;
|
||||||
|
writeBenchmark<LatticeFermion>(GridDefaultLatt(), d + "/ioBench", limeWrite<LatticeFermion>, Ls, rb);
|
||||||
|
}
|
||||||
|
|
||||||
|
MSG << "Benchmark Lime read" << std::endl;
|
||||||
|
MSG << SEP << std::endl;
|
||||||
|
for (auto &d: dir)
|
||||||
|
{
|
||||||
|
MSG << "-- Directory " << d << std::endl;
|
||||||
|
readBenchmark<LatticeFermion>(GridDefaultLatt(), d + "/ioBench", limeRead<LatticeFermion>, Ls, rb);
|
||||||
|
}
|
||||||
|
|
||||||
|
Grid_finalize();
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user