HDF5 е библиотека и формат за съхранение и достъп до структурирани и типизирани данни. Тази библиотека намира приложение в софтуерните продукти за анализи на големи масиви данни - от астрономия и метеорология до банково дело и медицина. HDF5 библиотеката, която е включена в пакетната колеция на CentOS 7 и 8, не е изградена с помощта на някои важни оптимизации. Целта на този документ е да предложи рецепта за изграждане на серийна версия на HDF5 библиотеката, която е оптимизирана за скорост на изпълнение, чрез компилаторите от пакета Intel Compilers и/или PGI Compilers.
Ако желаете да научите как да изградите серийна версия на HDF5 библиотеката, с поддръжка на SZIP, прочетете документа "Компилиране, инсталиране и използване на серийна версия на HDF5 с поддръжка на SZIP под CentOS 7 и 8".
Ако желаете да научите как да изградите MPI версия на HDF5 библиотеката прочетете документа "Компилиране, инсталиране и използване на MPI версия на HDF5 под CentOS 7 и 8".
Ако желаете да научите как да изградите MPI версия на HDF5 библиотеката, с поддръжка на SZIP, прочетете документа "Компилиране, инсталиране и използване на MPI версия на HDF5 с поддръжка на SZIP под CentOS 7 и 8".
Трябва да имате и достъп до изпълнимите файлове на компилаторите, включени в Intel Compilers и/или PGI Compilers (в зависимост от това кой пакет компилатори ще използвате). В случая на Intel Compilers това са icc
, icpc
и ifort
, а при използване на PGI Compilers това са pgcc
, pgc++
и pgfortran
. Също така, в системата следва да са инсталирани пакетите cmake (виж бележката относно версията на cmake по-долу), zlib-devel, java-11-openjdk, java-11-openjdk-devel и java-11-openjdk-headless:
ВНИМАНИЕ! HDF5 изисква версия на CMake по-висока от 3.15. Следвайте инструкциите в документа "Компилиране и инсталиране на последна актуална версия на CMake под CentOS 7 и 8", ако искате да компилирате последната актуална версия на CMake в случай, че тя не е на разположение!
Изтеглете архива с изходния код на HDF5 библиотеката от страницата на проекта (изберете tar.bz2 или tar.gz формат на архива):
https://www.hdfgroup.org/downloads/hdf5/source-code/
В примерите по-долу се предполага, че е изтеглен файла с архива hdf5-1.10.5.tar.bz2
(по времето, по което вие изпълнявате тези инструкции, е възмжно версията да бъде по-висока от 1.10.5). Създайте директория, в която да извършите компилирането:
$ mkdir ~/build
Разпакетирайте в нея файла с архива:
$ tar xvf hdf5-1.10.5.tar.bz2 -C ~/build
влезте в новосъздадената при разпакетирането директория:
$ cd ~/build/hdf5-1.10.5
там създайте поддиректорията build
и влезте в нея:
$ mkdir build
$ cd build
Там стартирайте конфигурирането на компилационния процес чрез cmake3
по начина показан по-долу (отбележете, че директорията, в която ще бъде инсталиран готовия код е стойността на -DCMAKE_INSTALL_PREFIX
- може да я смените по ваш избор с друга):
-
ако компилирането се извършва с Intel Compilers:
Първо заредете всички променливи на средата, чрез които се задават пътищата до компилаторите и библиотеките:
$ source /usr/unite/intel/compilers_and_libraries/linux/bin/compilervars.sh intel64
и след това стартирайте конфигурирането:
$ PATH=/usr/unite/cmake-3.16.5-gnu/bin:$PATH JAVA=/usr/lib/jvm/jre-11/bin/java JAVA_HOME=/usr/lib/jvm/jre-11 FC=ifort FCFLAGS="-xHost" CC=icc CFLAGS="-xHost" CXX=icpc CXXFLAGS="-xHost" cmake .. -DCMAKE_INSTALL_PREFIX=/usr/unite/hdf5-1.10.5-icc-szip -DHDF5_ENABLE_Z_LIB_SUPPORT=ON -DHDF5_ENABLE_THREADSAFE=OFF -DHDF5_BUILD_CPP_LIB=ON -DHDF5_BUILD_FORTRAN=ON -DHDF5_BUILD_HL_LIB=ON -DZLIB_DIR=/usr -DHDF5_BUILD_JAVA=ON
-
ако компилирането се извършва с PGI Compilers:
$ PATH=/usr/unite/cmake-3.16.5-gnu/bin:$PATH JAVA=/usr/lib/jvm/jre-11/bin/java JAVA_HOME=/usr/lib/jvm/jre-11 PATH=/usr/unite/pgi/linux86-64/2019/bin:$PATH FC=pgfortran FCFLAGS="-fast" CC=pgcc CFLAGS="-fast" CXX=pgc++ CXXFLAGS="-fast" cmake .. -DCMAKE_INSTALL_PREFIX=/usr/unite/hdf5-1.10.5-pgi-szip -DHDF5_ENABLE_Z_LIB_SUPPORT=ON -DHDF5_ENABLE_THREADSAFE=OFF -DHDF5_BUILD_CPP_LIB=ON -DHDF5_BUILD_FORTRAN=ON -DHDF5_BUILD_HL_LIB=ON -DZLIB_DIR=/usr -DHDF5_BUILD_JAVA=ON
След като всичко дотук е протекло успешно, може да пристъпите към компилирането на кода:
-
ако компилирането се извършва с Intel Compilers (трябва да сте задали пътищата до Intel компилаторите, както е показано при конфигирурането по-горе):
$ make -j6
-
ако компилирането се извършва с PGI Compilers (не е нужно за задавате предварително пътищата до компилаторите):
$ PATH=/usr/unite/pgi/linux86-64/2019/bin:$PATH make -j6
След успешното завършване на компилацията, пристъпете към тестовете на получения продукт (те са начин за проверка дали компилираната HDF5 библиотека е компилирана правилно и функционалността ѝ отговаря на очакванията):
-
ако компилирането се извършва с Intel Compilers (трябва да сте задали пътищата до Intel компилаторите, както е показано при конфигирурането по-горе):
$ make test
-
ако компилирането се извършва с PGI Compilers (не е нужно за задавате предварително пътищата до компилаторите)::
$ PATH=/usr/unite/pgi/linux86-64/2019/bin:$PATH make test
В случай на компилиране с PGI Compilers, следните два теста могат да бъдат маркирани като провалени:
The following tests FAILED:
66 - H5TEST-swmr (Failed)
122 - H5TEST-shared-swmr (Failed)
За SWMR организацията на достъпа до контейнерите с данни, може да прочетете на страницата на проекта HDF5. На практика обаче, проблем няма (тестовете се провалят поради проблеми с детектирането на някои от използваните флагове за стаертиране на PGI компилаторите - това следва да се вземе предвид при компилиране на код, който е зависим от HDF5, чрез PGI Compilers, където да се направи пак реален предварителен тест - да се използват правилните флагове).
Ако само посочените по-горе тестове са маркирани като провалени, пристъпете към инсталирането:
$ make install
След успешно извършване на инсталацията, може да изведете списък с библиотеките, към които е динамично свързана библиотеката libhdf5.so
. Това става по следния начин:
-
ако компилирането се извършва с Intel Compilers:
$ ldd /usr/unite/hdf5-1.10.5-icc/lib/libhdf5.so
Трябва да получите изход, който е подобен на:
linux-vdso.so.1 (0x00007ffcf9ac0000)
libm.so.6 => /lib64/libm.so.6 (0x00007fae25645000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fae25441000)
libz.so.1 => /lib64/libz.so.1 (0x00007fae2522a000)
libimf.so => /usr/unite/hdf5-1.10.5-icc/lib/../lib/libimf.so (0x00007fae24c8a000)
libsvml.so => /usr/unite/hdf5-1.10.5-icc/lib/../lib/libsvml.so (0x00007fae232e7000)
libirng.so => /usr/unite/hdf5-1.10.5-icc/lib/../lib/libirng.so (0x00007fae22f75000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fae22d5d000)
libintlc.so.5 => /usr/unite/hdf5-1.10.5-icc/lib/../lib/libintlc.so.5 (0x00007fae22aeb000)
libc.so.6 => /lib64/libc.so.6 (0x00007fae22727000)
/lib64/ld-linux-x86-64.so.2 (0x00007fae2600c000)
-
ако компилирането се извършва с PGI Compilers:
$ LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-pgi/lib:$LD_LIBRARY_PATH ldd /usr/unite/hdf5-1.10.5-pgi/lib/libhdf5.so
Трябва да получите изход, който е подобен на:
linux-vdso.so.1 (0x00007ffd0cbe0000)
libm.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libm.so.6 (0x00007f598361e000)
libdl.so.2 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libdl.so.2 (0x00007f598341a000)
libz.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libz.so.1 (0x00007f5983203000)
libpgatm.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgatm.so (0x00007f5982ffa000)
libpgkomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgkomp.so (0x00007f5982df7000)
libomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libomp.so (0x00007f5982b26000)
libpthread.so.0 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libpthread.so.0 (0x00007f5982906000)
libpgmath.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgmath.so (0x00007f59824f1000)
libpgc.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgc.so (0x00007f5982198000)
libc.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libc.so.6 (0x00007f5981dd4000)
libgcc_s.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libgcc_s.so.1 (0x00007f5981bbc000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5983ff7000)
Най-важното, за което трябва да проверите в този списък с библиотеки, е наличието на свързани библиотеки от колекцията от Intel Compilers и/или PGI Compilers (виж редовете оцветени в светло синьо). Отбележете, че за случая на библиотеката, компилирана с Intel Compilers, нужните библиотеки от пакета с компилатори са копирани в инсталационната директория на библиотеката!
ВНИМАНИЕ! Ако в bin/
директорията на инсталацията (ако сте следвали горния пример това ще е /usr/unite/hdf5-1.10.5-icc/bin
или /usr/unite/hdf5-1.10.5-pgi/bin
) не намирате h5fc
, ще се наложи да го създадете по следния начин:
-
за инсталацията създадена с Intel Compilers:
$ sudo sed 's/icc/ifort/g' /usr/unite/hdf5-1.10.5-icc/bin/h5cc > /usr/unite/hdf5-1.10.5-icc/bin/h5fc
$ sudo chmod 755 /usr/unite/hdf5-1.10.5-icc/bin/h5fc
-
за инсталацията създадена с PGI Compilers:
$ sudo sed 's/pgcc/pgfortran/g' /usr/unite/hdf5-1.10.5-pgi/bin/h5cc > /usr/unite/hdf5-1.10.5-pgi/bin/h5fc
$ sudo chmod 755 /usr/unite/hdf5-1.10.5-pgi/bin/h5fc
За да може даден код да бъде компилиран спрямо динамичната версия на HDF5 библиотеките (компилирани по процедурата показана по-горе), освен описание на използваните от нея функции в кода, в процеса на конфигурацията или компилацията му трябва да бъдат указани HDF5 компилаторите и посочени пътищата до хедър файловете и библиотеките:
-
за инсталацията създадена с Intel Compilers:
$ CC=h5cc CXX=h5c++ FC=h5fc F77=h5fc F90=h5fc F95=h5fc ./configure ... CGLAGS="-I/usr/unite/hdf5-1.10.5-icc/include" LFLAGS="-L/usr/unite/hdf5-1.10.5-icc/lib -lhdf5"
или
$ CC=h5cc CXX=h5c++ FC=h5fc F77=h5fc F90=h5fc F95=h5fc make ... CGLAGS="-I/usr/unite/hdf5-1.10.5-icc/include" LFLAGS="-L/usr/unite/hdf5-1.10.5-icc/lib -lhdf5"
-
за инсталацията създадена с PGI Compilers:
$ CC=h5cc CXX=h5c++ FC=h5fc F77=h5fc F90=h5fc F95=h5fc ./configure ... CGLAGS="-I/usr/unite/hdf5-1.10.5-pgi/include" LFLAGS="-L/usr/unite/hdf5-1.10.5-pgi/lib -lhdf5"
или
$ CC=h5cc CXX=h5c++ FC=h5fc F77=h5fc F90=h5fc F95=h5fc make ... CGLAGS="-I/usr/unite/hdf5-1.10.5-pgi/include" LFLAGS="-L/usr/unite/hdf5-1.10.5-pgi/lib -lhdf5"
След успешна компилация спрямо динамичната версия на библиотеката, изпълнимият код трябва да може да зарежда HDF5 библиотеките при стартиране. За целта, в текущата сесия на bash
, в която ще става стартирането, трябва да се зареди пътя до тях:
-
за инсталацията създадена с Intel Compilers:
$ export LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-icc/lib:$LD_LIBRARY_PATH
-
за инсталацията създадена с PGI Compilers:
$ export LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-pgi/lib:$LD_LIBRARY_PATH
Това зареждане може да бъде направено инцидентно (примера по-горе) или да стане част от постоянните настройки за bash
сесията (те са обикновено във файла ~/.bashrc
).
ВАЖНО! В състемата, в която ще се изпълнява кода на приложението, към което са динамично свързани HDF5 библиотеките, трябва да са налични и съответните библиотеки от пакета на използвания компилатор (виж примера с извеждането на техния списък по-горе).
Когато се използва статичната версия на HDF5 библиотеките, самия файл с библиотеката се задава в списъка с бинарни обекти, на база на които компилатора създава изпълнимия код. Например:
-
за инсталацията създадена с Intel Compilers:
$ h5cc -o test test.c file1.o file2.o /usr/unite/hdf5-1.10.5-icc/lib/libhdf5.a
-
за инсталацията създадена с PGI Compilers:
$ h5cc -o test test.c file1.o file2.o /usr/unite/hdf5-1.10.5-pgi/lib/libhdf5.a