Our Expectation:

# what we got!!

PHDF5 compiled and linked against IOR from 2003 - 2019

IOR executed with transfer size and block size 1MB

srun --export ALL $INSTALL_DIR/bin/ior -a HDF5   -b 1G -t 1G -C -e

Platform: H5CLUSTER v1.0.14

Instance Type: 4xNVME 96core m5d.metal 25Mb/sec ethernet
ior  -a HDF5  -b 10GB -t 1GB ; ior  -a MPIIO -b 10GB -t 1GB
Throughput gain: 3GByte/sec with each node added

Live Web page: https://www.hdfgroup.org/solutions/hdf-kita/hdf-kita-architecture/"

Live Web page: https://nrel.github.io/hsds-viz/"

H5CPP

the first non-intrusive persistence

for modern C++

Created by Steven Varga in co-operation with Gerd Heber, HDFGroup

Online version of this presentation: http://chicago.h5cpp.org

take a header file with POD struct


typedef unsigned long long int MyUInt;
namespace sn {
	namespace example {
		struct Record {                   
			MyUInt               field_01; 
			char                 field_02;
			double            field_03[3]; 
			other::Record field_04[4];
		};
	}
}
  • typedefs are fine
  • nested namespace are OK
  • mapped to : H5T_NATIVE_CHAR
  • H5Tarray_create(H5T_NATIVE_DOUBLE,1, ... )
  • first `other::Record` is parsed: type_hid_t = ...
  • then the generated type is used: H5Tarray_create(type_hid_t, ...)

write your program

write your cpp program as if `generated.h` were already written 
#include "some_header_file.h"
#include <h5cpp/core>
	#include "generated.h"
#include <h5cpp/io>
int main(){
	std::vector<sn::example::Record> stream =
		...
	h5::fd_t fd = h5::create("example.h5",H5F_ACC_TRUNC);
	h5::pt_t pt = h5::create<::example::Record>(
		fd, "stream of struct",
		h5::max_dims{H5S_UNLIMITED,7}, h5::chunk{4,7} | h5::gzip{9} );
	...
}
  • sandwich the not-yet existing `generated.h`
  • write the TU translation unit as usual
  • using the POD type with one of the H5CPP CRUD like operators h5::create | h5::write | h5::read | h5::append will trigger the `h5cpp` compiler to generate code

Live Webpage: http://h5cpp.org