УНИТе

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

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

Съдържание:

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

 

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

MGARD (MultiGrid Adaptive Reduction of Data) е C++ библиотека, която предоставя алгоритъм за компресия (допускащ известна загуба на точност), приложим за намаляване на обема на големи масиви научни (числови) данни. Целта на този документ е да предложи рецепта за изграждане на версия на PIMx библиотеката, оптимизирана за скорост на изпълнение, чрез компилаторите от пакета Intel Compilers и/или PGI Compilers.

 

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

Преди да започнете, трябва да се убедите, че имате достъп до изпълнимите файлове на компилаторите, включени в Intel Compilers и/или PGI Compilers (в зависимост от това кой пакет компилатори ще използвате). В случай на използване на Intel Compilers това е icc, а при използване на PGI Compilers това ще е pgcc.

Преди да пристъпите към процеса на компилация, трябва да инсталирате cmake (cmake3 в CentOS 7):

  • CentOS 7:

    $ sudo yum install cmake3
  • CentOS 8:

    $ dnf yum install cmake

За да изтеглите поседната стабилна версия на изходния програмен код, посетете хранилището на проекта:

https://github.com/CODARcode/MGARD/releases

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

$ wget https://github.com/CODARcode/MGARD/archive/0.0.0.2.tar.gz -O MGARD-0.0.0.2.tar.gz

Създайте директория, в която да извършите компилирането:

$ mkdir ~/build

Разпакетирайте в нея файла с архива:

$ tar xvf MGARD-0.0.0.2.tar.gz -C ~/build

влезте в новосъздадената при разпакетирането директория:

$ cd ~/build/MGARD-0.0.0.2

и там изпълнете операциите по конфигурирането, компилирането и инсталирането:

  • компилиране чрез Intel Compilers:

    • компилиране на статичната версия на библиотеката:

      $ source /opt/intel/compilers_and_libraries/linux/bin/compilervars.sh intel64
      $ CXX=icpc CXXFLAGS=-xHost cmake3 .. -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=/usr/unite/mgard-0.0.0.2-icc -DBUILD_TESTING=OFF
      $ make -j6
      $ make install
    • компилиране на динамичната версия на библиотеката (изпълнете след компилиране на статичната):

      $ rm -fr
      $ CXX=icpc CXXFLAGS=-xHost cmake3 .. -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=/usr/unite/mgard-0.0.0.2-icc -DBUILD_TESTING=OFF
      $ make -j6
      $ make install
  • компилиране чрез PGI Compilers:

    • компилиране на статичната версия на библиотеката:

      $ PATH=/opt/pgi/linux86-64/2019/bin:$PATH CXX=pgc++ CXXFLAGS="-fast" cmake3 .. -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=/usr/unite/mgard-0.0.0.2-pgi -DBUILD_TESTING=OFF
      $ make -j6
      $ make install
    • компилиране на динамичната версия на библиотеката (изпълнете след компилиране на статичната):

      $ rm -fr
      $ PATH=/opt/pgi/linux86-64/2019/bin:$PATH CXX=pgc++ CXXFLAGS="-fast" cmake3 .. -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=/usr/unite/mgard-0.0.0.2-pgi -DBUILD_TESTING=OFF
      $ make -j6
      $ make install

След успешно извършване на инсталацията, може да изведете списък с библиотеките, към които е динамично свързана библиотеката libmgard.so. Това става по следния начин:

  • ако компилирането е извършено с Intel Compilers:

    Изпълнете:

    $ ldd /usr/unite/mgard-0.0.0.2-icc/lib/libmgard.so

    и ще получите изход, подобен на следния:

    	linux-vdso.so.1 (0x00007ffc68588000)
    	libz.so.1 => /lib64/libz.so.1 (0x00007fc7e4a2f000)
    	libdl.so.2 => /lib64/libdl.so.2 (0x00007fc7e482b000)
    	libimf.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libimf.so (0x00007fc7e428b000)
    	libsvml.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libsvml.so (0x00007fc7e28e8000)
    	libirng.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libirng.so (0x00007fc7e2576000)
    	libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fc7e21e1000)
    	libm.so.6 => /lib64/libm.so.6 (0x00007fc7e1e5f000)
    	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc7e1c47000)
    	libintlc.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007fc7e19d5000)
    	libc.so.6 => /lib64/libc.so.6 (0x00007fc7e1611000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007fc7e4e94000)
  • ако компилирането е извършено с PGI Compilers:

    Изпълнете:

    $ ldd /usr/unite/mgard-0.0.0.2-pgi/lib/libmgard.so

    и ще получите изход, подобен на следния:

    	linux-vdso.so.1 (0x00007ffeb17d3000)
    	libz.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libz.so.1 (0x00007fbcc96b4000)
    	libdl.so.2 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libdl.so.2 (0x00007fbcc94b0000)
    	libpgatm.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgatm.so (0x00007fbcc92a7000)
    	libstdc++.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libstdc++.so.6 (0x00007fbcc8f12000)
    	libpgkomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgkomp.so (0x00007fbcc8d0f000)
    	libomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libomp.so (0x00007fbcc8a3e000)
    	libpthread.so.0 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libpthread.so.0 (0x00007fbcc881e000)
    	libpgmath.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgmath.so (0x00007fbcc8409000)
    	libpgc.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgc.so (0x00007fbcc80b0000)
    	libm.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libm.so.6 (0x00007fbcc7d2e000)
    	libc.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libc.so.6 (0x00007fbcc796a000)
    	libgcc_s.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libgcc_s.so.1 (0x00007fbcc7752000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007fbcc9b34000)

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

 

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

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

  • при използване на Intel Compilers:

    $ CXX=icpc CXXGLAGS="-xHost -I/usr/unite/mgard-0.0.0.2-icc/include" LFLAGS="-L/usr/unite/mgard-0.0.0.2-icc/lib -lpmix" ./configure ...
  • при използване на PGI Compilers:

    $ CXX=pgc++ CXXGLAGS="-fast -I/usr/unite/mgard-0.0.0.2-pgi/include" LFLAGS="-L/usr/unite/mgard-0.0.0.2-pgi/lib -lpmix" ./configure ...

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

  • при използване на Intel Compilers:

    $ export LD_LIBRARY_PATH=/usr/unite/mgard-0.0.0.2-icc/lib:$LD_LIBRARY_PATH
  • при използване на PGI Compilers:

    $ export LD_LIBRARY_PATH=/usr/unite/mgard-0.0.0.2-pgi/lib:$LD_LIBRARY_PATH

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

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

Когато се използва статичната версия на MGARD библиотеката, самия файл с библиотеката се задава в списъка с бинарни обекти, на база на които компилатора създава изпълнимия код. Например:

  • при използване на Intel Compilers:

    $ icpc -o test test.c file1.o file2.o /usr/unite/mgard-0.0.0.2-icc/lib/libmgard.a

    (вместо icc може да използвате icpc, ifort, в зависимост от проекта).

  • при използване на PGI Compilers:

    $ pgc++ -o test test.c file1.o file2.o /usr/unite/mgard-0.0.0.2-pgi/lib/libmgard.a

    (вместо pgcc може да използвате pgc++, pgfortran, в зависимост от проекта).

 


Последна актуализация: 7 декември 2019

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