mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-09 21:50:45 +01:00
standard C/C++ I/O in benchmark
This commit is contained in:
parent
ace9cd64bb
commit
acac2d6938
@ -19,6 +19,31 @@ int main (int argc, char ** argv)
|
|||||||
|
|
||||||
int64_t threads = GridThread::GetThreads();
|
int64_t threads = GridThread::GetThreads();
|
||||||
MSG << "Grid is setup to use " << threads << " threads" << std::endl;
|
MSG << "Grid is setup to use " << threads << " threads" << std::endl;
|
||||||
|
|
||||||
|
MSG << SEP << std::endl;
|
||||||
|
MSG << "Benchmark std C++ write" << std::endl;
|
||||||
|
MSG << SEP << std::endl;
|
||||||
|
for (int l = 4; l <= BENCH_IO_LMAX; l += 2)
|
||||||
|
{
|
||||||
|
auto mpi = GridDefaultMpi();
|
||||||
|
std::vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
|
||||||
|
|
||||||
|
MSG << "-- Local volume " << l << "^4" << std::endl;
|
||||||
|
writeBenchmark<LatticeFermion>(latt, filestem(l), stdWrite<LatticeFermion>);
|
||||||
|
}
|
||||||
|
|
||||||
|
MSG << SEP << std::endl;
|
||||||
|
MSG << "Benchmark std C++ read" << std::endl;
|
||||||
|
MSG << SEP << std::endl;
|
||||||
|
for (int l = 4; l <= BENCH_IO_LMAX; l += 2)
|
||||||
|
{
|
||||||
|
auto mpi = GridDefaultMpi();
|
||||||
|
std::vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
|
||||||
|
|
||||||
|
MSG << "-- Local volume " << l << "^4" << std::endl;
|
||||||
|
readBenchmark<LatticeFermion>(latt, filestem(l), stdRead<LatticeFermion>);
|
||||||
|
}
|
||||||
|
|
||||||
MSG << SEP << std::endl;
|
MSG << SEP << std::endl;
|
||||||
MSG << "Benchmark Lime write" << std::endl;
|
MSG << "Benchmark Lime write" << std::endl;
|
||||||
MSG << SEP << std::endl;
|
MSG << SEP << std::endl;
|
||||||
@ -27,10 +52,11 @@ int main (int argc, char ** argv)
|
|||||||
auto mpi = GridDefaultMpi();
|
auto mpi = GridDefaultMpi();
|
||||||
std::vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
|
std::vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
|
||||||
|
|
||||||
std::cout << "-- Local volume " << l << "^4" << std::endl;
|
MSG << "-- Local volume " << l << "^4" << std::endl;
|
||||||
writeBenchmark<LatticeFermion>(latt, filestem(l), limeWrite<LatticeFermion>);
|
writeBenchmark<LatticeFermion>(latt, filestem(l), limeWrite<LatticeFermion>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MSG << SEP << std::endl;
|
||||||
MSG << "Benchmark Lime read" << std::endl;
|
MSG << "Benchmark Lime read" << std::endl;
|
||||||
MSG << SEP << std::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)
|
||||||
@ -38,7 +64,7 @@ int main (int argc, char ** argv)
|
|||||||
auto mpi = GridDefaultMpi();
|
auto mpi = GridDefaultMpi();
|
||||||
std::vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
|
std::vector<int> latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]};
|
||||||
|
|
||||||
std::cout << "-- Local volume " << l << "^4" << std::endl;
|
MSG << "-- Local volume " << l << "^4" << std::endl;
|
||||||
readBenchmark<LatticeFermion>(latt, filestem(l), limeRead<LatticeFermion>);
|
readBenchmark<LatticeFermion>(latt, filestem(l), limeRead<LatticeFermion>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,13 +14,140 @@ using WriterFn = std::function<void(const std::string, Field &)> ;
|
|||||||
template <typename Field>
|
template <typename Field>
|
||||||
using ReaderFn = std::function<void(Field &, const std::string)>;
|
using ReaderFn = std::function<void(Field &, const std::string)>;
|
||||||
|
|
||||||
|
// AP 06/10/2020: Standard C version in case one is suspicious of the C++ API
|
||||||
|
//
|
||||||
|
// template <typename Field>
|
||||||
|
// void stdWrite(const std::string filestem, Field &vec)
|
||||||
|
// {
|
||||||
|
// std::string rankStr = std::to_string(vec.Grid()->ThisRank());
|
||||||
|
// std::FILE *file = std::fopen((filestem + "." + rankStr + ".bin").c_str(), "wb");
|
||||||
|
// size_t size;
|
||||||
|
// uint32_t crc;
|
||||||
|
// GridStopWatch ioWatch, crcWatch;
|
||||||
|
|
||||||
|
// size = vec.Grid()->lSites()*sizeof(typename Field::scalar_object);
|
||||||
|
// autoView(vec_v, vec, CpuRead);
|
||||||
|
// crcWatch.Start();
|
||||||
|
// crc = GridChecksum::crc32(vec_v.cpu_ptr, size);
|
||||||
|
// std::fwrite(&crc, sizeof(uint32_t), 1, file);
|
||||||
|
// crcWatch.Stop();
|
||||||
|
// MSG << "Std I/O write: Data CRC32 " << std::hex << crc << std::dec << std::endl;
|
||||||
|
// ioWatch.Start();
|
||||||
|
// std::fwrite(vec_v.cpu_ptr, sizeof(typename Field::scalar_object), vec.Grid()->lSites(), file);
|
||||||
|
// ioWatch.Stop();
|
||||||
|
// std::fclose(file);
|
||||||
|
// size *= vec.Grid()->ProcessorCount();
|
||||||
|
// MSG << "Std I/O write: Wrote " << size << " bytes in " << ioWatch.Elapsed()
|
||||||
|
// << ", performance " << size/1024./1024./(ioWatch.useconds()/1.e6)
|
||||||
|
// << " MB/s" << std::endl;
|
||||||
|
// MSG << "Std I/O write: checksum overhead " << crcWatch.Elapsed() << std::endl;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// template <typename Field>
|
||||||
|
// void stdRead(Field &vec, const std::string filestem)
|
||||||
|
// {
|
||||||
|
// std::string rankStr = std::to_string(vec.Grid()->ThisRank());
|
||||||
|
// std::FILE *file = std::fopen((filestem + "." + rankStr + ".bin").c_str(), "rb");
|
||||||
|
// size_t size;
|
||||||
|
// uint32_t crcRead, crcData;
|
||||||
|
// GridStopWatch ioWatch, crcWatch;
|
||||||
|
|
||||||
|
// size = vec.Grid()->lSites()*sizeof(typename Field::scalar_object);
|
||||||
|
// crcWatch.Start();
|
||||||
|
// std::fread(&crcRead, sizeof(uint32_t), 1, file);
|
||||||
|
// crcWatch.Stop();
|
||||||
|
// {
|
||||||
|
// autoView(vec_v, vec, CpuWrite);
|
||||||
|
// ioWatch.Start();
|
||||||
|
// std::fread(vec_v.cpu_ptr, sizeof(typename Field::scalar_object), vec.Grid()->lSites(), file);
|
||||||
|
// ioWatch.Stop();
|
||||||
|
// std::fclose(file);
|
||||||
|
// }
|
||||||
|
// {
|
||||||
|
// autoView(vec_v, vec, CpuRead);
|
||||||
|
// crcWatch.Start();
|
||||||
|
// crcData = GridChecksum::crc32(vec_v.cpu_ptr, size);
|
||||||
|
// crcWatch.Stop();
|
||||||
|
// }
|
||||||
|
// MSG << "Std I/O read: Data CRC32 " << std::hex << crcData << std::dec << std::endl;
|
||||||
|
// assert(crcData == crcRead);
|
||||||
|
// size *= vec.Grid()->ProcessorCount();
|
||||||
|
// MSG << "Std I/O read: Read " << size << " bytes in " << ioWatch.Elapsed()
|
||||||
|
// << ", performance " << size/1024./1024./(ioWatch.useconds()/1.e6)
|
||||||
|
// << " MB/s" << std::endl;
|
||||||
|
// MSG << "Std I/O read: checksum overhead " << crcWatch.Elapsed() << std::endl;
|
||||||
|
// }
|
||||||
|
|
||||||
|
template <typename Field>
|
||||||
|
void stdWrite(const std::string filestem, Field &vec)
|
||||||
|
{
|
||||||
|
std::string rankStr = std::to_string(vec.Grid()->ThisRank());
|
||||||
|
std::ofstream file(filestem + "." + rankStr + ".bin", std::ios::out | std::ios::binary);
|
||||||
|
size_t size, sizec;
|
||||||
|
uint32_t crc;
|
||||||
|
GridStopWatch ioWatch, crcWatch;
|
||||||
|
|
||||||
|
size = vec.Grid()->lSites()*sizeof(typename Field::scalar_object);
|
||||||
|
sizec = size/sizeof(char); // just in case of...
|
||||||
|
autoView(vec_v, vec, CpuRead);
|
||||||
|
crcWatch.Start();
|
||||||
|
crc = GridChecksum::crc32(vec_v.cpu_ptr, size);
|
||||||
|
file.write(reinterpret_cast<char *>(&crc), sizeof(uint32_t)/sizeof(char));
|
||||||
|
crcWatch.Stop();
|
||||||
|
MSG << "Std I/O write: Data CRC32 " << std::hex << crc << std::dec << std::endl;
|
||||||
|
ioWatch.Start();
|
||||||
|
file.write(reinterpret_cast<char *>(vec_v.cpu_ptr), sizec);
|
||||||
|
file.flush();
|
||||||
|
ioWatch.Stop();
|
||||||
|
size *= vec.Grid()->ProcessorCount();
|
||||||
|
MSG << "Std I/O write: Wrote " << size << " bytes in " << ioWatch.Elapsed()
|
||||||
|
<< ", performance " << size/1024./1024./(ioWatch.useconds()/1.e6)
|
||||||
|
<< " MB/s" << std::endl;
|
||||||
|
MSG << "Std I/O write: checksum overhead " << crcWatch.Elapsed() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Field>
|
||||||
|
void stdRead(Field &vec, const std::string filestem)
|
||||||
|
{
|
||||||
|
std::string rankStr = std::to_string(vec.Grid()->ThisRank());
|
||||||
|
std::ifstream file(filestem + "." + rankStr + ".bin", std::ios::in | std::ios::binary);
|
||||||
|
size_t size, sizec;
|
||||||
|
uint32_t crcRead, crcData;
|
||||||
|
GridStopWatch ioWatch, crcWatch;
|
||||||
|
|
||||||
|
size = vec.Grid()->lSites()*sizeof(typename Field::scalar_object);
|
||||||
|
sizec = size/sizeof(char); // just in case of...
|
||||||
|
crcWatch.Start();
|
||||||
|
file.read(reinterpret_cast<char *>(&crcRead), sizeof(uint32_t)/sizeof(char));
|
||||||
|
crcWatch.Stop();
|
||||||
|
{
|
||||||
|
autoView(vec_v, vec, CpuWrite);
|
||||||
|
ioWatch.Start();
|
||||||
|
file.read(reinterpret_cast<char *>(vec_v.cpu_ptr), sizec);
|
||||||
|
ioWatch.Stop();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
autoView(vec_v, vec, CpuRead);
|
||||||
|
crcWatch.Start();
|
||||||
|
crcData = GridChecksum::crc32(vec_v.cpu_ptr, size);
|
||||||
|
crcWatch.Stop();
|
||||||
|
}
|
||||||
|
MSG << "Std I/O read: Data CRC32 " << std::hex << crcData << std::dec << std::endl;
|
||||||
|
assert(crcData == crcRead);
|
||||||
|
size *= vec.Grid()->ProcessorCount();
|
||||||
|
MSG << "Std I/O read: Read " << size << " bytes in " << ioWatch.Elapsed()
|
||||||
|
<< ", performance " << size/1024./1024./(ioWatch.useconds()/1.e6)
|
||||||
|
<< " MB/s" << std::endl;
|
||||||
|
MSG << "Std I/O read: checksum overhead " << crcWatch.Elapsed() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Field>
|
template <typename Field>
|
||||||
void limeWrite(const std::string filestem, Field &vec)
|
void limeWrite(const std::string filestem, Field &vec)
|
||||||
{
|
{
|
||||||
emptyUserRecord record;
|
emptyUserRecord record;
|
||||||
ScidacWriter binWriter(vec.Grid()->IsBoss());
|
ScidacWriter binWriter(vec.Grid()->IsBoss());
|
||||||
|
|
||||||
binWriter.open(filestem + ".bin");
|
binWriter.open(filestem + ".lime.bin");
|
||||||
binWriter.writeScidacFieldRecord(vec, record);
|
binWriter.writeScidacFieldRecord(vec, record);
|
||||||
binWriter.close();
|
binWriter.close();
|
||||||
}
|
}
|
||||||
@ -31,7 +158,7 @@ void limeRead(Field &vec, const std::string filestem)
|
|||||||
emptyUserRecord record;
|
emptyUserRecord record;
|
||||||
ScidacReader binReader;
|
ScidacReader binReader;
|
||||||
|
|
||||||
binReader.open(filestem + ".bin");
|
binReader.open(filestem + ".lime.bin");
|
||||||
binReader.readScidacFieldRecord(vec, record);
|
binReader.readScidacFieldRecord(vec, record);
|
||||||
binReader.close();
|
binReader.close();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user