УНИТе

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

Компилиране, инсталиране и използване на MPI версия на HDF5 с поддръжка на SZIP под CentOS 7 и 8

Съдържание:

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

 

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

HDF5 е библиотека и формат за съхранение и достъп до структурирани и типизирани данни. Тази библиотека намира приложение в софтуерните продукти за анализи на големи масиви данни - от астрономия и метеорология до банково дело и медицина. HDF5 библиотеката, която е включена в пакетната колеция на CentOS 7 и 8, не е изградена с помощта на някои важни оптимизации. SZIP е библиотека за компресиране без загуба на структурирани и типизирани данни, чието най-важно приложение е да осигурява компресиране на съдържанието в HDF5 контейнери. Целта на този документ е да предложи рецепта за изграждане на серийна версия на HDF5 библиотеката, която поддържа компресия с използване на SZIP и е оптимизирана за скорост на изпълнение, чрез компилаторите от пакета Intel Compilers и/или PGI Compilers.

ВНИМАНИЕ! Използването на SZIP за кодиране (компресиране), включително и използването на библиотеката HDF5 с компилирана с SZIP поддържка, е обект на лицензиране. Образователните и научни организации могат да използват SZIP библиотеката свободно, без да подлежат на лицензиране, както за компресиране така и декомпресиране. Във всеки друг случай (и особено при разпространение на библиотеката като част от пакет на комерсиален софтуерен продукт) за използване на компресиращата част от библиотеката се заплащат лицензни права.

Ако желаете да научите как да изградите серийна версия на HDF5 библиотеката, с поддръжка на SZIP, прочетете документа "Компилиране, инсталиране и използване на серийна версия на HDF5 с поддръжка на SZIP под CentOS 7 и 8".

Ако желаете да научите как да изградите серийна версия на HDF5 библиотеката, без поддръжка на SZIP, прочетете документа "Компилиране, инсталиране и използване на серийна версия на HDF5 под CentOS 7 и 8".

Ако желаете да научите как да изградите MPI версия на HDF5 библиотеката, без поддръжка на SZIP, прочетете документа "Компилиране, инсталиране и използване на MPI версия на HDF5 под CentOS 7 и 8".

ВНИМАНИЕ! MPI версията на HDF5 библиотеката не поддържа Java и C++ интерфейсни библиотеки.

 

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

Преди да започнете, убедете се, че имате на разположение библиотеката SZIP, компилирана и инсталирана съгласно инструкциите в документа "Компилиране, инсталиране и използване на SZIP под CentOS 7 и 8". Трябва да имате и достъп до изпълнимите файлове на компилаторите, включени в Intel Compilers и/или PGI Compilers (в зависимост от това кой пакет компилатори ще използвате). В случая на Intel Compilers това са icc, mpiicc, icpc, mpiicpc, ifort и mpiifort, а при използване на PGI Compilers това са pgcc, mpicc, pgc++, mpicxx, pgfortran и mpifc. Нужно е да имате директен достъп до съответния mpiexec (използва се в тестовете). Също така, в системата следва да са инсталирани пакетите cmake (виж бележката относно версията на cmake по-долу) и zlib-devel:

  • CentOS 7

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

    $ sudo dnf install 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 FC=mpiifort FCFLAGS="-xHost" CC=mpiicc CFLAGS="-xHost" cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/unite/hdf5-1.10.5-icc-szip-mpi -DHDF5_ENABLE_Z_LIB_SUPPORT=ON -DHDF5_ENABLE_SZIP_SUPPORT=ON -DHDF5_ENABLE_THREADSAFE=OFF -DHDF5_BUILD_FORTRAN=ON -DHDF5_BUILD_CPP_LIB=OFF -DHDF5_BUILD_HL_LIB=ON -DSZIP_INCLUDE_DIR=/usr/unite/szip-2.1.1-icc/include -DSZIP_LIBRARY=/usr/unite/szip-2.1.1-icc/lib/libsz.so -DZLIB_DIR=/usr -DSZIP_DIR=/usr/unite/szip-2.1.1-icc -DHDF5_ENABLE_PARALLEL=YES
  • ако компилирането се извършва с PGI Compilers:

    $ PATH=/usr/unite/cmake-3.16.5-gnu/bin:/usr/unite/pgi/linux86-64/2019/bin:/usr/unite/pgi/linux86-64/2019/mpi/openmpi-3.1.3/bin:$PATH FC=mpiifort FCFLAGS="-xHost" CC=mpiicc CFLAGS="-xHost" cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/unite/hdf5-1.10.5-icc-szip-mpi -DHDF5_ENABLE_Z_LIB_SUPPORT=ON -DHDF5_ENABLE_SZIP_SUPPORT=ON -DHDF5_ENABLE_THREADSAFE=OFF -DHDF5_BUILD_FORTRAN=ON -DHDF5_BUILD_CPP_LIB=OFF -DHDF5_BUILD_HL_LIB=ON -DSZIP_INCLUDE_DIR=/usr/unite/szip-2.1.1-icc/include -DSZIP_LIBRARY=/usr/unite/szip-2.1.1-icc/lib/libsz.so -DZLIB_DIR=/usr -DSZIP_DIR=/usr/unite/szip-2.1.1-icc -DHDF5_ENABLE_PARALLEL=YES

След като процеса по конфигураця приключи успешно и отворите файла H5pubconf.h (той ще бъде създаден след успешното изпълнение на горния команден ред, който извършва конфигурацията, описанието на която е поставен в този файл), в него задължително трябва да фигурира реда:

#define H5_HAVE_FILTER_SZIP 1

Ако стойността след H5_HAVE_FILTER_SZIP не е 1, то конфигурацията не е успешна (или библиотеката SZIP не е намерена, или използването ѝ не е зададено) и е безпредметно да продължавате с компилацията, преди да установите какво е причинило проблема и да го отстраните.

След като всичко дотук е протекло успешно, може да пристъпите към компилирането на кода:

  • ако компилирането се извършва с Intel Compilers (трябва да сте задали пътищата до Intel компилаторите, както е показано при конфигирурането по-горе):

    $ LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-icc/lib:$LD_LIBRARY_PATH make -j6
  • ако компилирането се извършва с PGI Compilers (не е нужно за задавате предварително пътищата до компилаторите):

    $ PATH=/usr/unite/pgi/linux86-64/2019/bin:/usr/unite/pgi/linux86-64/2019/mpi/openmpi-3.1.3/bin:$PATH LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-pgi/lib:$LD_LIBRARY_PATH make -j6

След успешното завършване на компилацията, пристъпете към тестовете на получения продукт (те са начин за проверка дали компилираната HDF5 библиотека е компилирана правилно и функционалността ѝ отговаря на очакванията):

  • ако компилирането се извършва с Intel Compilers (трябва да сте задали пътищата до Intel компилаторите, както е показано при конфигирурането по-горе):

    $ LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-icc/lib:$LD_LIBRARY_PATH make test
  • ако компилирането се извършва с PGI Compilers (не е нужно за задавате предварително пътищата до компилаторите)::

    $ PATH=/usr/unite/pgi/linux86-64/2019/bin:/usr/unite/pgi/linux86-64/2019/mpi/openmpi-3.1.3/bin:$PATH LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-pgi/lib:$LD_LIBRARY_PATH make test

Поради разминаване на изхода от изпълнението на тестовите програми и регулярните изрази за прихващане на резултата от тестовия скрипт, тестът с име "H5REPACK-testh5repack_detect_szip" може да бъде показан като неуспешен (ако само този тест е провален при използване на Intel Compilers):

The following tests FAILED:
	930 - H5REPACK-testh5repack_detect_szip (Failed)

В случай на компилиране с 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:

    $ LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-icc/lib:/usr/unite/intel/compilers_and_libraries/linux/lib/intel64:/usr/unite/intel/compilers_and_libraries/linux/mpi/intel64/libfabric/lib:$LD_LIBRARY_PATH  ldd /usr/unite/hdf5-1.10.5-icc-szip-mpi/lib/libhdf5.so

    Трябва да получите изход, който е подобен на:

    	linux-vdso.so.1 (0x00007fff6525d000)
    	libm.so.6 => /lib64/libm.so.6 (0x00007ff3c4a73000)
    	libdl.so.2 => /lib64/libdl.so.2 (0x00007ff3c486f000)
    	libz.so.1 => /lib64/libz.so.1 (0x00007ff3c4658000)
    	libszip-shared.so.2.1 => /usr/unite/szip-2.1.1-icc/lib/libszip-shared.so.2.1 (0x00007ff3c4437000)
    	libmpifort.so.12 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/mpi/intel64/lib/libmpifort.so.12 (0x00007ff3c408a000)
    	libmpi.so.12 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/mpi/intel64/lib/debug_mt/libmpi.so.12 (0x00007ff3c11f1000)
    	librt.so.1 => /lib64/librt.so.1 (0x00007ff3c0fe8000)
    	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff3c0dc8000)
    	libimf.so => /usr/unite/szip-2.1.1-icc/lib/libimf.so (0x00007ff3c0828000)
    	libsvml.so => /usr/unite/szip-2.1.1-icc/lib/libsvml.so (0x00007ff3bee85000)
    	libirng.so => /usr/unite/szip-2.1.1-icc/lib/libirng.so (0x00007ff3beb13000)
    	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007ff3be8fb000)
    	libintlc.so.5 => /usr/unite/szip-2.1.1-icc/lib/libintlc.so.5 (0x00007ff3be689000)
    	libc.so.6 => /lib64/libc.so.6 (0x00007ff3be2c5000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007ff3c546b000)
    	libfabric.so.1 => /usr/unite/intel/compilers_and_libraries/linux/mpi/intel64/libfabric/lib/libfabric.so.1 (0x00007ff3be08c000)
  • ако компилирането се извършва с PGI Compilers:

    $ LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-pgi/lib:$LD_LIBRARY_PATH ldd /usr/unite/hdf5-1.10.5-pgi-szip/lib/libhdf5.so

    Трябва да получите изход, който е подобен на:

    	linux-vdso.so.1 (0x00007fffea3f9000)
    	libm.so.6 => /lib64/libm.so.6 (0x00007ff266633000)
    	libdl.so.2 => /lib64/libdl.so.2 (0x00007ff26642f000)
    	libz.so.1 => /lib64/libz.so.1 (0x00007ff266218000)
    	libszip-shared.so.2.1 => /usr/unite/szip-2.1.1-icc/lib/libszip-shared.so.2.1 (0x00007fed10450000)
    	libmpi.so.40 => /usr/unite/pgi/linux86-64-llvm/2019/mpi/openmpi-3.1.3/lib/libmpi.so.40 (0x00007ff2649ad000)
    	libpgatm.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgatm.so (0x00007ff2647a4000)
    	libpgkomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgkomp.so (0x00007ff2645a1000)
    	libomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libomp.so (0x00007ff2642d0000)
    	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff2640b0000)
    	libpgmath.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgmath.so (0x00007ff263c9b000)
    	libpgc.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgc.so (0x00007ff263942000)
    	libc.so.6 => /lib64/libc.so.6 (0x00007ff26357e000)
    	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007ff263366000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007ff267087000)
    	libopen-rte.so.40 => /usr/unite/pgi/linux86-64-llvm/2019/mpi/openmpi-3.1.3/lib/../lib/libopen-rte.so.40 (0x00007ff262c3a000)
    	libopen-pal.so.40 => /usr/unite/pgi/linux86-64-llvm/2019/mpi/openmpi-3.1.3/lib/../lib/libopen-pal.so.40 (0x00007ff262271000)
    	librdmacm.so.1 => /lib64/librdmacm.so.1 (0x00007ff26205a000)
    	libibverbs.so.1 => /lib64/libibverbs.so.1 (0x00007ff261e40000)
    	libnuma.so => /usr/unite/pgi/linux86-64-llvm/2019/mpi/openmpi-3.1.3/lib/../lib/libnuma.so (0x00007ff261c34000)
    	librt.so.1 => /lib64/librt.so.1 (0x00007ff261a2b000)
    	libutil.so.1 => /lib64/libutil.so.1 (0x00007ff261827000)
    	libnl-route-3.so.200 => /lib64/libnl-route-3.so.200 (0x00007ff2615ae000)
    	libnl-3.so.200 => /lib64/libnl-3.so.200 (0x00007ff26138b000)

Най-важното, за което трябва да проверите в този списък с библиотеки, е наличието на свързани библиотеки от колекцията от Intel Compilers и/или PGI Compilers (виж редовете оцветени в светло синьо). Тези за Intel Compilers са пренесени в инсталационната директория на SZIP от инсталационния скрипт. Връзката към библиотеката на SZIP е оцветена в оранжево, в примерите по-горе. Задължително трябва да виждате и съответната MPI библиотека, от използвания пакет с компилатори, оцветена в примерите по-горе в зелено.

ВНИМАНИЕ! Ако в bin/ директорията на инсталацията (ако сте следвали горния пример това ще е директория /usr/unite/hdf5-1.10.5-icc-szip/bin или /usr/unite/hdf5-1.10.5-pgi-szip/bin) не намирате h5fc, ще се наложи да го създадете по следния начин:

  • за инсталацията създадена с Intel Compilers:

    $ sudo sed 's/icc/ifort/g' /usr/unite/hdf5-1.10.5-icc-szip-mpi/bin/h5cc > /usr/unite/hdf5-1.10.5-icc-szip-mpi/bin/h5fc
    $ sudo chmod 755 /usr/unite/hdf5-1.10.5-icc-szip-mpi/bin/h5fc
  • за инсталацията създадена с PGI Compilers:

    $ sudo sed 's/pgcc/pgfortran/g' /usr/unite/hdf5-1.10.5-pgi-szip-mpi/bin/h5cc > /usr/unite/hdf5-1.10.5-pgi-szip-mpi/bin/h5fc
    $ sudo chmod 755 /usr/unite/hdf5-1.10.5-pgi-szip-mpi/bin/h5fc

 

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

За да може даден код да бъде компилиран спрямо динамичната версия на HDF5 библиотеките (компилирани по процедурата показана по-горе), освен описание на използваните от нея функции в кода, в процеса на конфигурацията или компилацията му трябва да бъдат указани HDF5 компилаторите и посочени пътищата до хедър файловете и библиотеките:

  • за инсталацията създадена с Intel Compilers:

    $ PATH=/usr/unite/hdf5-1.10.5-icc-szip-mpi/bin:$PATH CC=h5pcc FC=h5pfc F77=h5pfc F90=h5pfc F95=h5pfc ./configure ... CGLAGS="-I/usr/unite/szip-2.1.1-icc/include -I/usr/unite/hdf5-1.10.5-icc-szip-mpi/include" LFLAGS="-L/usr/unite/szip-2.1.1-icc/lib -L/usr/unite/hdf5-1.10.5-icc-szip-mpi/lib -lsz -lhdf5"

    или

    $ PATH=/usr/unite/hdf5-1.10.5-icc-szip-mpi/bin:$PATH LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-icc/lib:/usr/unite/hdf5-1.10.5-icc-szip-mpi:$LD_LIBRARY_PATH CC=h5pcc FC=h5pfc F77=h5pfc F90=h5pfc F95=h5pfc make ... CGLAGS="-I/usr/unite/szip-2.1.1-icc/include -I/usr/unite/hdf5-1.10.5-icc-szip-mpi/include" LFLAGS="-L/usr/unite/szip-2.1.1-icc/lib -L/usr/unite/hdf5-1.10.5-icc-szip-mpi/lib -lsz -lhdf5"
  • за инсталацията създадена с PGI Compilers:

    $ PATH=/usr/unite/hdf5-1.10.5-pgi-szip-mpi/bin:$PATH CC=h5pcc FC=h5pfc F77=h5pfc F90=h5pfc F95=h5pfc ./configure ... CGLAGS="-I/usr/unite/szip-2.1.1-icc/include -I/usr/unite/hdf5-1.10.5-pgi-szip-mpi/include" LFLAGS="-L/usr/unite/szip-2.1.1-pgi/lib -L/usr/unite/hdf5-1.10.5-pgi-szip-mpi/lib -lsz -lhdf5"

    или

    $ PATH=/usr/unite/hdf5-1.10.5-pgi-szip-mpi/bin:$PATH LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-pgi/lib:/usr/unite/hdf5-1.10.5-pgi-szip-mpi:$LD_LIBRARY_PATH CC=h5pcc FC=h5pfc F77=h5pfc F90=h5pfc F95=h5pfc make ... CGLAGS="-I/usr/unite/szip-2.1.1-icc/include -I/usr/unite/hdf5-1.10.5-pgi-szip-mpi/include" LFLAGS="-L/usr/unite/szip-2.1.1-pgi/lib -L/usr/unite/hdf5-1.10.5-pgi-szip-mpi/lib -lsz -lhdf5"

След успешна компилация спрямо динамичната версия на библиотеката, изпълнимият код трябва да може да зарежда HDF5 библиотеките при стартиране. За целта, в текущата сесия на bash, в която ще става стартирането, трябва да се зареди пътя до тях (успоредно, трябва да заредите, когато това е нужно, пътищата то MPI библиотеките от пакета на използвания компилатор):

  • за инсталацията създадена с Intel Compilers:

    $ export LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-icc/lib:/usr/unite/hdf5-1.10.5-icc-szip-mpi/lib:$LD_LIBRARY_PATH
  • за инсталацията създадена с PGI Compilers:

    $ export LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-pgi/lib:/usr/unite/hdf5-1.10.5-pgi-szip-mpi/lib:$LD_LIBRARY_PATH

Това зареждане може да бъде направено инцидентно (примера по-горе) или да стане част от постоянните настройки за bash сесията (те са обикновено във файла ~/.bashrc).

ВАЖНО! В състемата, в която ще се изпълнява кода на приложението, към което са динамично свързани HDF5 библиотеките, трябва да са налични и съответните библиотеки от пакета на използвания компилатор (виж примера с извеждането на техния списък по-горе).

Когато се използва статичната версия на HDF5 библиотеките, самия файл с библиотеката се задава в списъка с бинарни обекти, на база на които компилатора създава изпълнимия код, като се включва и пълния път до статичната библиотека libsz.a (това е библиотеката на SZIP). Например:

  • за инсталацията създадена с Intel Compilers:

    $ PATH=/usr/unite/hdf5-1.10.5-icc-szip-mpi/bin:$PATH h5pcc -o test test.c file1.o file2.o /usr/unite/hdf5-1.10.5-icc-szip-mpi/lib/libhdf5.a /usr/unite/szip-2.1.1-icc/lib/libsz.a
  • за инсталацията създадена с PGI Compilers:

    $ PATH=/usr/unite/hdf5-1.10.5-pgi-szip-mpi/bin:$PATH h5pcc -o test test.c file1.o file2.o /usr/unite/hdf5-1.10.5-pgi-szip-mpi/lib/libhdf5.a /usr/unite/szip-2.1.1-pgi/lib/libsz.a

 


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

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