SZIP е библиотека за компресиране без загуба на структурирани и типизирани данни, чието най-важно приложение е да осигурява компресиране на съдържанието в HDF5 контейнери. Целта на този документ е да предложи рецепта за изграждане на версия на SZIP библиотеката, оптимизирана за скорост на изпълнение, чрез компилаторите от пакета Intel Compilers и/или PGI Compilers.
ВНИМАНИЕ! Използването на SZIP за кодиране (компресиране) е обект на лиценз. Образователните и научни организации могат да използват SZIP библиотеката свободно, както за компресиране така и декомпресиране. Във всеки друг случай (и особено при разпространение на библиотеката като част от пакет на комерсиален софтуерен продукт) за използване на компресиращата част от библиотеката се заплащат лицензни права.
Преди да започнете, трябва да се убедите, че имате достъп до изпълнимите файлове на компилаторите, включени в Intel Compilers и/или PGI Compilers (в зависимост от това кой пакет компилатори ще използвате). В случай на използване на Intel Compilers това е icc
, а при използване на PGI Compilers това ще е pgcc
. След това, посетете страницата на проекта:
https://support.hdfgroup.org/doc_resource/SZIP/
Връзката за изтегляне на архива в изходния код е в текста на страницата. За примерите по-долу се предполага, че наличната към момента версия на библиотеката е 2.1.1 (по-времето, по което вие изпълнявате тези инструкции, версията може да е по-висока от 2.1.1):
$ wget https://support.hdfgroup.org/ftp/lib-external/szip/2.1.1/src/szip-2.1.1.tar.gz
Създайте директория, в която да извършите компилирането:
$ mkdir ~/build
Разпакетирайте в нея файла с архива:
$ tar szip-2.1.1.tar.gz -C ~/build
влезте в новосъздадената при разпакетирането директория:
$ cd ~/build/szip-2.1.1
и там изпълнете операциите по компилирането и инсталирането:
-
ако компилирането се извършва с Intel Compilers:
$ CC=icc cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/unite/szip-2.1.1-icc -DCMAKE_C_FLAGS="-xHost"
$ make
$ make install
$ cd /usr/unite/szip-2.1.1-icc/lib
$ ln -s libszip-shared.so.2.1 libsz.so
$ ln -s libszip-static.a libsz.a
-
ако компилирането се извършва с PGI Compilers:
$ CC=pgcc cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/unite/szip-2.1.1-pgi -DCMAKE_C_FLAGS="-fast"
$ sed -i 's/\-DSZ_BUILT_AS_DYNAMIC_LIB//g' src/CMakeFiles/szip-shared.dir/flags.make
$ make
$ make install
$ cd /usr/unite/szip-2.1.1-pgi/lib
$ ln -s libszip-shared.so.2.1 libsz.so
$ ln -s libszip-static.a libsz.a
След успешно извършване на инсталацията, може да изведете списък с библиотеките, към които е динамично свързана библиотеката libsz.so
. Това става по следния начин:
-
при използване на Intel Compilers:
$ ldd /usr/unite/szip-2.1.1-icc/lib/libsz.so
Трябва да получите изход, който е подобен на:
linux-vdso.so.1 (0x00007ffe456de000)
libm.so.6 => /lib64/libm.so.6 (0x00007f0a921ea000)
libimf.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libimf.so (0x00007f0a91c4a000)
libsvml.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libsvml.so (0x00007f0a902a7000)
libirng.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libirng.so (0x00007f0a8ff35000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f0a8fd1d000)
libintlc.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007f0a8faab000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0a8f6e7000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0a8f4e3000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0a9278d000)
-
при използване на PGI Compilers:
$ ldd /usr/unite/szip-2.1.1-pgi/lib/libsz.so
Трябва да получите изход, който е подобен на:
linux-vdso.so.1 (0x00007ffc0f9f0000)
libm.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libm.so.6 (0x00007f8408872000)
libpgatm.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgatm.so (0x00007f8408669000)
libpgkomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgkomp.so (0x00007f8408466000)
libomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libomp.so (0x00007f8408195000)
libpthread.so.0 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libpthread.so.0 (0x00007f8407f75000)
libpgmath.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgmath.so (0x00007f8407b60000)
libpgc.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgc.so (0x00007f8407807000)
libc.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libc.so.6 (0x00007f8407443000)
libgcc_s.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libgcc_s.so.1 (0x00007f840722b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8408e0f000)
libdl.so.2 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libdl.so.2 (0x00007f8407027000)
Най-важното, за което трябва да проверите в този списък с библиотеки, е наличието на свързани библиотеки от колекцията на използваните Intel и/или PGI компилатори (виж редовете оцветени в светло синьо).
За да може даден код да бъде компилиран спрямо динамичната версия на HDF5 библиотеките (компилирани по процедурата показана по-горе), освен описание на използваните от нея функции в кода, в процеса на конфигурацията или компилацията му трябва да бъдат указани HDF5 компилаторите и посочени пътищата до хедър файловете и библиотеките:
-
при използване на Intel Compilers:
$ ./configure ... CGLAGS="-I/usr/unite/szip-2.1.1-pgi/include" LFLAGS="-L/usr/unite/szip-2.1.1-icc/lib -lsz"
-
при използване на PGI Compilers:
$ ./configure ... CGLAGS="-I/usr/unite/szip-2.1.1-pgi/include" LFLAGS="-L/usr/unite/szip-2.1.1-pgi/lib -lsz"
След успешна компилация спрямо динамичната версия на библиотеката, изпълнимият код трябва да може да зарежда SZIP библиотеката при стартиране. За целта, в текущата сесия на bash
, в която ще става стартирането, трябва да се зареди пътя до нея:
-
при използване на Intel Compilers:
$ export LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-icc/lib:$LD_LIBRARY_PATH
-
при използване на PGI Compilers:
$ export LD_LIBRARY_PATH=/usr/unite/szip-2.1.1-pgi/lib:$LD_LIBRARY_PATH
Това зареждане може да бъде направено инцидентно (примера по-горе) или да стане част от постоянните настройки за bash
сесията (те са обикновено във файла ~/.bashrc
).
ВАЖНО! В състемата, в която ще се изпълнява кода на приложението, към което е динамично свързана SZIP библиотеката, трябва да са налични и съответните библиотеки от пакета на използвания компилатор (виж примера с извеждането на техния списък по-горе).
Когато се използва статичната версия на SZIP библиотеката, самия файл с библиотеката се задава в списъка с бинарни обекти, на база на които компилатора създава изпълнимия код. Например:
-
при използване на Intel Compilers:
$ icc -o test test.c file1.o file2.o /usr/unite/szip-2.1.1-icc/lib/libsz.a
(вместо icc
може да използвате icpc
, ifort
, в зависимост от проекта).
-
при използване на PGI Compilers:
$ pgcc -o test test.c file1.o file2.o /usr/unite/szip-2.1.1-pgi/lib/libsz.a
(вместо pgcc
може да използвате pgc++
, pgfortran
, в зависимост от проекта).