ZeroMQ е библиотека за бърз (атомистичен) обмен на съобщения между приложения, позволяваща клъстериране. Целта на този документ е да предложи рецепта за изграждане на версия на ZeroMQ библиотеката, оптимизирана за скорост на изпълнение, чрез компилаторите от пакета Intel Compilers и/или PGI Compilers.
Преди да започнете, трябва да се убедите, че имате достъп до изпълнимите файлове на компилаторите, включени в Intel Compilers и/или PGI Compilers (в зависимост от това кой пакет компилатори ще използвате). В случай на използване на Intel Compilers това са icc
и icpc
, а при използване на PGI Compilers това ще са pgcc
и pgc++
. След това, посетете страницата на проекта:
https://github.com/zeromq/zeromq4-1/releases
Връзката за изтегляне на архива в изходния код е в текста на страницата. За примерите по-долу се предполага, че наличната към момента версия на библиотеката е 4.1.7 (по-времето, по което вие изпълнявате тези инструкции, версията може да е по-висока от 4.1.7):
wget https://github.com/zeromq/zeromq4-1/archive/v4.1.7.tar.gz -O zeromq4-1-4.1.7.tar.gz
Създайте директория, в която да извършите компилирането:
$ mkdir ~/build
Разпакетирайте в нея файла с архива:
$ tar xvf zeromq4-1-4.1.7.tar.gz -C ~/build
влезте в новосъздадената при разпакетирането директория:
$ cd ~/build/zeromq4-1-4.1.7
и там изпълнете операциите по компилирането и инсталирането:
-
ако компилирането се извършва с Intel Compilers:
$ CC=icc CFLAGS="-xHost" CXX=icpc CXXFLAGS="-xHost" cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/unite/zeromq-4.1.7-icc
$ make -j12
$ make test
-
ако компилирането се извършва с PGI Compilers:
$ PATH=/opt/pgi/linux86-64/2019/bin:$PATH CC=pgcc CFLAGS="-fast" CXX=pgc++ CXXFLAGS="-fast" cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/unite/zeromq-4.1.7-pgi
$ PATH=/opt/pgi/linux86-64/2019/bin:$PATH make -j12
$ PATH=/opt/pgi/linux86-64/2019/bin:$PATH make test
ВНИМАНИЕ! Пристъпете към инсталирането на продукта на компилация само и единствено, ако всички тестове са проведени успешно!
$ make install
След успешно извършване на инсталацията, може да изведете списък с библиотеките, към които е динамично свързана библиотеката libzmq.so
. Това става по следния начин:
-
при използване на Intel Compilers:
$ ldd /usr/unite/zeromq-4.1.7-icc/lib/libzmq.so
Трябва да получите изход, който е подобен на:
linux-vdso.so.1 (0x00007ffc9f1f5000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fdf54b69000)
librt.so.1 => /lib64/librt.so.1 (0x00007fdf54960000)
libimf.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libimf.so (0x00007fdf543c0000)
libsvml.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libsvml.so (0x00007fdf52a1d000)
libirng.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libirng.so> (0x00007fdf526ab000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fdf52316000)
libm.so.6 => /lib64/libm.so.6 (0x00007fdf51f94000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fdf51d7c000)
libintlc.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007fdf51b0a000)
libc.so.6 => /lib64/libc.so.6 (0x00007fdf51746000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fdf51542000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdf5503d000)
-
при използване на PGI Compilers:
$ ldd /usr/unite/zeromq-4.1.7-pgi/lib/libzmq.so
Трябва да получите изход, който е подобен на:
linux-vdso.so.1 (0x00007ffc02dfb000)
librt.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/librt.so.1 (0x00007f608dbf1000)
libpgatm.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgatm.so (0x00007f608d9e8000)
libstdc++.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libstdc++.so.6 (0x00007f608d653000)
libpgkomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgkomp.so (0x00007f608d450000)
libomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libomp.so (0x00007f608d17f000)
libpthread.so.0 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libpthread.so.0 (0x00007f608cf5f000)
libpgmath.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgmath.so (0x00007f608cb4a000)
libpgc.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgc.so (0x00007f608c7f1000)
libm.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libm.so.6 (0x00007f608c46f000)
libc.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libc.so.6 (0x00007f608c0ab000)
libgcc_s.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libgcc_s.so.1 (0x00007f608be93000)
/lib64/ld-linux-x86-64.so.2 (0x00007f608e0b7000)
libdl.so.2 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libdl.so.2 (0x00007f608bc8f000)
Най-важното, за което трябва да проверите в този списък с библиотеки, е наличието на свързани библиотеки от колекцията на използваните Intel и/или PGI компилатори (виж редовете оцветени в светло синьо).
За да може даден код да бъде компилиран спрямо динамичната версия на ZeroMQ библиотеката (компилирана по процедурата показана по-горе) при използване на configure
, следвайте схемата:
-
при използване на Intel Compilers:
$ CC=icc CXX=icpc FC=ifort ./configure ... CGLAGS="-xHost -I/usr/unite/zeromq-4.1.7-icc/include" LFLAGS="-L/usr/unite/zeromq-4.1.7-icc/lib -lzmq"
-
при използване на PGI Compilers:
$ CC=pgcc CXX=pgc++ FC=pgfortran ./configure ... CGLAGS="-fast -I/usr/unite/zeromq-4.1.7-pgi/include" LFLAGS="-L/usr/unite/zeromq-4.1.7-pgi/lib -lzmq"
След успешна компилация спрямо динамичната версия на библиотеката, изпълнимият код трябва да може да зарежда ZeroMQ библиотеката при стартиране. За целта, в текущата сесия на bash
, в която ще става стартирането, трябва да се зареди пътя до нея:
-
при използване на Intel Compilers:
$ export LD_LIBRARY_PATH=/usr/unite/zeromq-4.1.7-icc/lib:$LD_LIBRARY_PATH
-
при използване на PGI Compilers:
$ export LD_LIBRARY_PATH=/usr/unite/zeromq-4.1.7-pgi/lib:$LD_LIBRARY_PATH
Това зареждане може да бъде направено инцидентно (примера по-горе) или да стане част от постоянните настройки за bash
сесията (те са обикновено във файла ~/.bashrc
).
ВАЖНО! В системата, в която ще се изпълнява кода на приложението, към което е динамично свързана ZeroMQ библиотеката, трябва да са налични и съответните библиотеки от пакета на използвания компилатор (виж примера с извеждането на техния списък по-горе).
Когато се използва статичната версия на ZeroMQ библиотеката, самия файл с библиотеката се задава в списъка с бинарни обекти, на база на които компилатора създава изпълнимия код. Например:
-
при използване на Intel Compilers:
$ icc -o test test.c file1.o file2.o /usr/unite/zeromq-4.1.7-icc/lib/libzmq-static.a
(вместо icc
може да използвате icpc
, ifort
, в зависимост от проекта).
-
при използване на PGI Compilers:
$ pgcc -o test test.c file1.o file2.o /usr/unite/zeromq-4.1.7-pgi/lib/libzmq-static.a
(вместо pgcc
може да използвате pgc++
, pgfortran
, в зависимост от проекта).