From 7fbce888cffd46146b542d187021d5f7f811945f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ciro=20Santilli=20=E5=85=AD=E5=9B=9B=E4=BA=8B=E4=BB=B6=20?= =?UTF-8?q?=E6=B3=95=E8=BD=AE=E5=8A=9F?= Date: Sat, 22 Feb 2020 00:00:00 +0000 Subject: [PATCH] hdf5 --- README.adoc | 8 +++++ build | 1 + common.py | 11 +++++-- path_properties.py | 8 +++++ userland/libs/hdf5/README.adoc | 1 + userland/libs/hdf5/build | 1 + userland/libs/hdf5/hello_cpp.cpp | 54 ++++++++++++++++++++++++++++++++ userland/libs/hdf5/test | 1 + 8 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 userland/libs/hdf5/README.adoc create mode 120000 userland/libs/hdf5/build create mode 100644 userland/libs/hdf5/hello_cpp.cpp create mode 120000 userland/libs/hdf5/test diff --git a/README.adoc b/README.adoc index 727ba0c..429ab54 100644 --- a/README.adoc +++ b/README.adoc @@ -15385,6 +15385,14 @@ Tests under link:userland/libs[] require certain optional libraries to be instal See for example <>. +===== HDF5 + +https://en.wikipedia.org/wiki/Hierarchical_Data_Format + +Binary format to store data. TODO vs databases, notably SQLite: https://datascience.stackexchange.com/questions/262/hierarchical-data-format-what-are-the-advantages-compared-to-alternative-format + +Examples: link:userland/libs/hdf5[] + === Userland content filename conventions The following basenames should always refer to programs that do the same thing, but in different languages: diff --git a/build b/build index 9338805..2620142 100755 --- a/build +++ b/build @@ -386,6 +386,7 @@ so looping over all of them would waste time. 'libboost-all-dev', 'libdrm-dev', 'libeigen3-dev', + 'libhdf5-dev', 'libopenblas-dev', }, ), diff --git a/common.py b/common.py index 7204908..2610273 100644 --- a/common.py +++ b/common.py @@ -1750,19 +1750,26 @@ https://cirosantilli.com/linux-kernel-module-cheat#gem5-debug-build # Header only. 'cc_flags_after': [], }, + 'hdf5': { + 'pkg_config_id': 'hdf5-serial', + }, } package_key = dirpath_relative_root_components[2] if package_key in packages: package = packages[package_key] else: package = {} + if 'pkg_config_id' in package: + pkg_config_id = package['pkg_config_id'] + else: + pkg_config_id = package_key if 'cc_flags' in package: cc_flags.extend(package['cc_flags']) else: pkg_config_output = self.sh.check_output([ self.env['pkg_config'], '--cflags', - package_key + pkg_config_id ]).decode() cc_flags.extend(self.sh.shlex_split(pkg_config_output)) if 'cc_flags_after' in package: @@ -1771,7 +1778,7 @@ https://cirosantilli.com/linux-kernel-module-cheat#gem5-debug-build pkg_config_output = subprocess.check_output([ self.env['pkg_config'], '--libs', - package_key + pkg_config_id ]).decode() cc_flags_after.extend(self.sh.shlex_split(pkg_config_output)) os.makedirs(os.path.dirname(out_path), exist_ok=True) diff --git a/path_properties.py b/path_properties.py index ef03c23..968b53d 100644 --- a/path_properties.py +++ b/path_properties.py @@ -696,6 +696,14 @@ path_properties_tuples = ( {'requires_dynamic_library': True}, { 'libdrm': {'requires_sudo': True}, + 'hdf5': ( + {}, + { + 'hello_cpp.cpp': { + 'cc_flags_after': ['-lhdf5_cpp', LF], + }, + } + ), } ), 'linux': ( diff --git a/userland/libs/hdf5/README.adoc b/userland/libs/hdf5/README.adoc new file mode 100644 index 0000000..40c1121 --- /dev/null +++ b/userland/libs/hdf5/README.adoc @@ -0,0 +1 @@ +https://cirosantilli.com/linux-kernel-module-cheat#hdf5 diff --git a/userland/libs/hdf5/build b/userland/libs/hdf5/build new file mode 120000 index 0000000..ab18017 --- /dev/null +++ b/userland/libs/hdf5/build @@ -0,0 +1 @@ +../build \ No newline at end of file diff --git a/userland/libs/hdf5/hello_cpp.cpp b/userland/libs/hdf5/hello_cpp.cpp new file mode 100644 index 0000000..2dfa73b --- /dev/null +++ b/userland/libs/hdf5/hello_cpp.cpp @@ -0,0 +1,54 @@ +// Adapted from: https://support.hdfgroup.org/HDF5/doc/cpplus_RM/create_8cpp-example.html + +#include +#include + +#include + +using namespace H5; + +const H5std_string FILE_NAME("hello_cpp.tmp.h5"); +const H5std_string DATASET_NAME("IntArray"); +const int NX = 5; +const int NY = 6; +const int RANK = 2; + +int main (void) { + // 0 1 2 3 4 5 + // 1 2 3 4 5 6 + // 2 3 4 5 6 7 + // 3 4 5 6 7 8 + // 4 5 6 7 8 9 + int i, j; + int data[NX][NY]; + for (j = 0; j < NX; j++) { + for (i = 0; i < NY; i++) + data[j][i] = i + j; + } + + //Create a new file using H5F_ACC_TRUNC access, + //default file creation properties, and default file + //access properties. + H5File file(FILE_NAME, H5F_ACC_TRUNC); + + // Define the size of the array and create the data space for fixed + // size dataset. + hsize_t dimsf[2]; + dimsf[0] = NX; + dimsf[1] = NY; + DataSpace dataspace(RANK, dimsf); + + // Define datatype for the data in the file. + // We will store little endian INT numbers. + IntType datatype(PredType::NATIVE_INT); + datatype.setOrder(H5T_ORDER_LE); + + // Create a new dataset within the file using defined dataspace and + // datatype and default dataset creation properties. + DataSet dataset = file.createDataSet(DATASET_NAME, datatype, dataspace); + + // Write the data to the dataset using default memory space, file + // space, and transfer properties. + dataset.write(data, PredType::NATIVE_INT); + return 0; +} diff --git a/userland/libs/hdf5/test b/userland/libs/hdf5/test new file mode 120000 index 0000000..419df4f --- /dev/null +++ b/userland/libs/hdf5/test @@ -0,0 +1 @@ +../test \ No newline at end of file