PIMx е концептуално нова библиотека за бърз (атомистичен) обмен на съобщения между приложения, позволяваща клъстериране. Целта на този документ е да предложи рецепта за изграждане на версия на PIMx библиотеката, оптимизирана за скорост на изпълнение, чрез компилаторите от пакета Intel Compilers и/или PGI Compilers.
 
Преди да започнете, трябва да се убедите, че имате достъп до изпълнимите файлове на компилаторите, включени в Intel Compilers и/или PGI Compilers (в зависимост от това кой пакет компилатори ще използвате). В случай на използване на Intel Compilers това е icc, а при използване на PGI Compilers това ще е pgcc.
Преди да пристъпите към процеса на компилация, трябва да инсталирате пакетите libevent-devel и zlib-devel:
За да изтеглите поседната стабилна версия на изходния програмен код, посетете хранилището на проекта:
https://github.com/openpmix/openpmix/releases
Връзката за изтегляне на архива в изходния код е в текста на страницата. За примерите по-долу се предполага, че наличната към момента версия на библиотеката е 2.2.3 (по-времето, по което вие изпълнявате тези инструкции, версията може да е по-висока от 2.2.3):
$ wget https://github.com/openpmix/openpmix/archive/v2.2.3.tar.gz -O openpmix-2.2.3.tar.gz
Създайте директория, в която да извършите компилирането:
$ mkdir ~/build
Разпакетирайте в нея файла с архива:
$ tar xvf openpmix-2.2.3.tar.gz -C ~/build
влезте в новосъздадената при разпакетирането директория:
$ cd ~/build/openpmix-2.2.3
и там изпълнете операциите по конфигурирането, компилирането и инсталирането:
   - 
      
ако компилирането се извършва с Intel Compilers:
$ source /opt/intel/compilers_and_libraries/linux/bin/compilervars.sh intel64
$ CC=icc CFLAGS="-xHost" ./configure --prefix=/usr/unite/openpmix-2.2.3-icc --enable-pmix-binaries --enable-static
$ make -j6
$ make install
    
   - 
      
ако компилирането се извършва с PGI Compilers:
$ PATH=/opt/pgi/linux86-64/2019/bin:$PATH CC=pgcc CFLAGS="-fast" ./configure --prefix=/usr/unite/openpmix-2.2.3-pgi --enable-pmix-binaries --enable-static
$ PATH=/opt/pgi/linux86-64/2019/bin:$PATH make -j6
$ PATH=/opt/pgi/linux86-64/2019/bin:$PATH make install
    
След успешно извършване на инсталацията, може да изведете списък с библиотеките, към които е динамично свързана библиотеката libpmix.so. Това става по следния начин:
   - 
      
ако компилирането е извършено с Intel Compilers:
      Изпълнете:
$ ldd /usr/unite/openpmix-2.2.3-icc/lib/libpmix.so
      и ще получите изход, подобен на следния:
	linux-vdso.so.1 (0x00007ffedfbbe000)
	libevent_pthreads-2.1.so.6 => /lib64/libevent_pthreads-2.1.so.6 (0x00007fd4bcb9d000)
	libevent-2.1.so.6 => /lib64/libevent-2.1.so.6 (0x00007fd4bc944000)
	libutil.so.1 => /lib64/libutil.so.1 (0x00007fd4bc740000)
	libz.so.1 => /lib64/libz.so.1 (0x00007fd4bc529000)
	libimf.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libimf.so (0x00007fd4bbf89000)
	libsvml.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libsvml.so (0x00007fd4ba5e6000)
	libirng.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libirng.so (0x00007fd4ba274000)
	libm.so.6 => /lib64/libm.so.6 (0x00007fd4b9ef2000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fd4b9cda000)
	libintlc.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007fd4b9a68000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd4b9848000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fd4b9484000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fd4b9280000)
	libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007fd4b8da8000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fd4bd075000)
    
   - 
      
ако компилирането е извършено с PGI Compilers:
      Изпълнете:
$ ldd /usr/unite/openpmix-2.2.3-pgi/lib/libpmix.so
      и ще получите изход, подобен на следния:
	linux-vdso.so.1 (0x00007ffda81cf000)
	libevent_pthreads-2.1.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libevent_pthreads-2.1.so.6 (0x00007fe972bda000)
	libevent-2.1.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libevent-2.1.so.6 (0x00007fe972981000)
	libutil.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libutil.so.1 (0x00007fe97277d000)
	libz.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libz.so.1 (0x00007fe972566000)
	libdl.so.2 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libdl.so.2 (0x00007fe972362000)
	libc.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libc.so.6 (0x00007fe971f9e000)
	libpgatm.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgatm.so (0x00007fe971d95000)
	libpgkomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgkomp.so (0x00007fe971b92000)
	libomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libomp.so (0x00007fe9718c1000)
	libpthread.so.0 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libpthread.so.0 (0x00007fe9716a1000)
	libpgmath.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgmath.so (0x00007fe97128c000)
	libpgc.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgc.so (0x00007fe970f33000)
	libm.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libm.so.6 (0x00007fe970bb1000)
	libgcc_s.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libgcc_s.so.1 (0x00007fe970999000)
	libcrypto.so.1.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libcrypto.so.1.1 (0x00007fe9704c1000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fe9730cd000)
    
Най-важното, за което трябва да проверите в този списък с библиотеки, е наличието на свързани библиотеки от колекцията на използваните Intel и/или PGI компилатори (виж редовете оцветени в светло синьо).
 
За да може даден код да бъде компилиран спрямо динамичната версия на PIMx библиотеката (компилирана по процедурата показана по-горе) при използване на configure, следвайте схемата:
   - 
      
при използване на Intel Compilers:
$ CC=icc CXX=icpc FC=ifort ./configure ... CGLAGS="-xHost -I/usr/unite/openpmix-2.2.3-icc/include" LFLAGS="-L/usr/unite/openpmix-2.2.3-icc/lib -lpmix"
    
   - 
      
при използване на PGI Compilers:
$ CC=pgcc CXX=pgc++ FC=pgfortran ./configure ... CGLAGS="-fast -I/usr/unite/openpmix-2.2.3-pgi/include" LFLAGS="-L/usr/unite/openpmix-2.2.3-pgi/lib -lpmix"
    
След успешна компилация спрямо динамичната версия на библиотеката, изпълнимият код трябва да може да зарежда PIMx библиотеката при стартиране. За целта, в текущата сесия на bash, в която ще става стартирането, трябва да се зареди пътя до нея:
   - 
      
при използване на Intel Compilers:
$ export LD_LIBRARY_PATH=/usr/unite/openpmix-2.2.3-icc/lib:$LD_LIBRARY_PATH
    
   - 
      
при използване на PGI Compilers:
$ export LD_LIBRARY_PATH=/usr/unite/openpmix-2.2.3-pgi/lib:$LD_LIBRARY_PATH
    
Това зареждане може да бъде направено инцидентно (примера по-горе) или да стане част от постоянните настройки за bash сесията (те са обикновено във файла ~/.bashrc).
ВАЖНО! В системата, в която ще се изпълнява кода на приложението, към което е динамично свързана PIMx библиотеката, трябва да са налични и съответните библиотеки от пакета на използвания компилатор (виж примера с извеждането на техния списък по-горе).
Когато се използва статичната версия на PIMx библиотеката, самия файл с библиотеката се задава в списъка с бинарни обекти, на база на които компилатора създава изпълнимия код. Например:
   - 
      
при използване на Intel Compilers:
$ icc -o test test.c file1.o file2.o /usr/unite/openpmix-2.2.3-icc/lib/libpmix.a
      (вместо icc може да използвате icpc, ifort, в зависимост от проекта).
    
   - 
      
при използване на PGI Compilers:
$ pgcc -o test test.c file1.o file2.o /usr/unite/openpmix-2.2.3-pgi/lib/libpmix.a
      (вместо pgcc може да използвате pgc++, pgfortran, в зависимост от проекта).