УНИТе

Портал > Документация > Компилиране, инсталиране и използване на серийна версия на HDF5 под CentOS 7 и 8

Компилиране, инсталиране и използване на серийна версия на HDF5 под CentOS 7 и 8

Съдържание:

  1. Предварителна информация
  2. Изтегляне на изходния код и компилирането му с Intel Compilers и PGI Compilers
  3. Динамично свързване на компилираната библиотека към C/C++ и Fortran приложения

 

1. Предварителна информация

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".

 

2. Изтегляне на изходния код и компилирането му с Intel Compilers и PGI Compilers

Трябва да имате и достъп до изпълнимите файлове на компилаторите, включени в 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:

  • CentOS 7

    $ sudo yum install zlib-devel java-11-openjdk java-11-openjdk-devel java-11-openjdk-headless
  • CentOS 8

    $ sudo dnf install 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

 

3. Динамично свързване на компилираната библиотека към C/C++ и Fortran приложения

За да може даден код да бъде компилиран спрямо динамичната версия на 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

 


Последна актуализация: 5 март 2020

2020 УНИТе, Веселин Колев