УНИТе

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

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

Съдържание:

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

 

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

ВНИМАНИЕ! В стандартния случай е препоръчително да използвате функциите и процедурите на OpenBLAS от оптимизираната версия на библиотеката, която е включена в Intel Math Kernel Library (MKL), когато и ако е възможно.
Към момента е постижимо и компилиране на библиотеката с PGI Compilers (само с версии по-големи от 19.9), но само чрез non-llvm версията на компилаторите (в противен случай не може да се компилира частта с асемблерски инструкции в кода).

OpenBLAS е оптимизирана версия на библиотеката BLAS. Целта на този документ е да покаже как тя да бъде компилирана, инсталирана и свързвана към приложения, с използване на Intel Compilers и библиотеките му, за постигане на висока произовдителност на изпълнимия код върху работни станции или HPC нодове. Статичната и динамичната версии на библиотеката на OpenBLAS (libopenblas.a и libopenblas.so), могат да се използват от C/C++ и Fortran приложения, ако в техния код се извикват функциите, процедурите и променливите им. Освен това, изпълнимият код трябва да бъде компилиран така, че или да включва статично цялата библиотека или да е свързан динамично към нея (да я зарежда преди изпълнение).

В много случаи, е възможно да замените използването на BLAS с OpenBLAS. Интерфейсът на фунциите е (почти) същия и единственото, за което трябва да държите сметка е дали оптимизацията на BLAS, предлагана от OpenBLAS, наистина увеличава производителността във вашия случай.

 

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

Изтеглете последната версия на кода от github.com и влезте в директорията с кода (за примера по-долу се предполага, че е изтеглена версия 0.3.7; във вашия случай е възможно там да има по-нова версия):

$ mkdir ~/build
$ cd ~/build
$ wget https://github.com/xianyi/OpenBLAS/archive/v0.3.7.tar.gz -O OpenBLAS-0.3.7.tar.gz
$ tar xvf OpenBLAS-0.3.7.tar.gz
$ cd OpenBLAS-0.3.7

За да стартирате процеса на компилация, трябва да укажете компилаторите на C и Fortran, и архитектурата на процесора, за който ще извършвате оптимизацията по време на компилацията (списъкът с поддържани процесорни специфични архитектури се намира във файла TargetList.txt):

  • чрез Intel Compilers:

    • компилиране на статична версия на библиотеката (libopenblas.a):

      • компилиране за Intel процесори тип Sandy Bridge:

        $ CC=icc FC=ifort make TARGET=SANDYBRIDGE
      • компилиране за Intel процесори тип Haswell:

        $ CC=icc FC=ifort make TARGET=HASWELL
    • компилиране на статичната и динамичната версии на библиотеката (libopenblas.a и libopenblas.so):

      • компилиране за Intel процесори тип Sandy Bridge:

        $ CC=icc FC=ifort make TARGET=SANDYBRIDGE NO_SHARED=0
      • компилиране за Intel процесори тип Haswell:

        $ CC=icc FC=ifort make TARGET=HASWELL NO_SHARED=0
  • чрез PGI Compilers:

    • компилиране на статична версия на библиотеката (libopenblas.a):

      • компилиране за Intel процесори тип Sandy Bridge:

        $ PATH=/usr/unite/pgi/linux86-64-nollvm/2019/bin:$PATH C_COMPILER=PGI CC=pgcc FC=pgfortran make TARGET=SANDYBRIDGE
      • компилиране за Intel процесори тип Haswell:

        $ PATH=/usr/unite/pgi/linux86-64-nollvm/2019/bin:$PATH C_COMPILER=PGI CC=pgcc FC=pgfortran make make TARGET=HASWELL
    • компилиране на статичната и динамичната версии на библиотеката (libopenblas.a и libopenblas.so):

      • компилиране за Intel процесори тип Sandy Bridge:

        $ PATH=/usr/unite/pgi/linux86-64-nollvm/2019/bin:$PATH C_COMPILER=PGI CC=pgcc FC=pgfortran make TARGET=SANDYBRIDGE NO_SHARED=0
      • компилиране за Intel процесори тип Haswell:

        $ PATH=/usr/unite/pgi/linux86-64-nollvm/2019/bin:$PATH C_COMPILER=PGI CC=pgcc FC=pgfortran make TARGET=HASWELL NO_SHARED=0

Ако компилирате кода за друг процесорен тип, освен посочените в примерите горе, вижте дали имате описан неговия идентификатор във файла TargetList.txt (този файл се намира в директорията с кода). В случай, че го нямате, използвайте най-близкия до него в списъка.

При успешното завършване на процеса на компилация, компилираните библиотеки ще се намират в директорията с кода на OpenBLAS. Имайте предвид, че в името на файловете (понастоящем ще се намират в текущата директория с програмния код, в която сте стартирали процеса на компилация, съгласно инструкциите по-горе) стои и типа на процесора, например:

libopenblas.a -> libopenblas_sandybridgep-r0.3.7.a
libopenblas_sandybridgep-r0.3.7.a
libopenblas_sandybridgep-r0.3.7.so
libopenblas.so -> libopenblas_sandybridgep-r0.3.7.so
libopenblas.so.0 -> libopenblas_sandybridgep-r0.3.7.so

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

$ ldd libopenblas.so
  • ако компилацията е извършена с Intel Compilers:

            linux-vdso.so.1 (0x00007fff4e289000)
    	libm.so.6 => /lib64/libm.so.6 (0x00007f921a277000)
    	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f921a057000)
    	libifport.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libifport.so.5 (0x00007f9219e29000)
    	libifcoremt.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libifcoremt.so.5 (0x00007f9219a95000)
    	libimf.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libimf.so (0x00007f92194f5000)
    	libsvml.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libsvml.so (0x00007f9217b52000)
    	libintlc.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007f92178e0000)
    	libc.so.6 => /lib64/libc.so.6 (0x00007f921751c000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007f921b8d2000)
    	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f9217304000)
    	libdl.so.2 => /lib64/libdl.so.2 (0x00007f9217100000)

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

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

    	linux-vdso.so.1 (0x00007ffe1f0ff000)
    	libm.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libm.so.6 (0x00007f7308f7a000)
    	libpthread.so.0 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libpthread.so.0 (0x00007f7308d5a000)
    	libpgmp.so => /usr/unite/pgi/linux86-64-nollvm/19.10/lib/libpgmp.so (0x00007f7308ad9000)
    	libnuma.so.1 => /usr/unite/linux86-64-nollvm/19.10/lib/libnuma.so.1 (0x00007f73088cd000)
    	libpgmath.so => /usr/unite/linux86-64-nollvm/19.10/lib/libpgmath.so (0x00007f73084b8000)
    	libpgc.so => /usr/unite/linux86-64-nollvm/19.10/lib/libpgc.so (0x00007f7308260000)
    	libc.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libc.so.6 (0x00007f7307e9c000)
    	libgcc_s.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libgcc_s.so.1 (0x00007f7307c84000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007f730aa17000)

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

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

 

3. Инсталиране на библиотеката и хедър файловете

Инсталирането на библиотеката става чрез извикване на make и посочване на пътя до инсталационната директория като стойност на променливата PREFIX:

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

    $ make PREFIX=/usr/unite/openblas-0.3.7-icc-sandybridge install
  • ако компилацията е извършена чрез PGI Compilers:

    $ make PREFIX=/usr/unite/openblas-0.3.7-pgi-sandybridge install

Използваната инсталационна директория е примерна и най-вероятно във вашия случай ще използвате друга.

 

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

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

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

    $ ./configure ... CGLAGS="-I/usr/unite/openblas-0.3.7-icc-sandybridge/include" LFLAGS="-L/usr/unite/openblas-0.3.7-icc-sandybridge/lib -lopenblas"

    или

    $ make ... CGLAGS="-I/usr/unite/openblas-0.3.7-icc-sandybridge/include" LFLAGS="-L/usr/unite/openblas-0.3.7-icc-sandybridge/lib -lopenblas"
  • ако библиотеката е компилирана чрез PGI Compilers:

    $ ./configure ... CGLAGS="-I/usr/unite/openblas-0.3.7-pgi-sandybridge/include" LFLAGS="-L/usr/unite/openblas-0.3.7-pgi-sandybridge/lib -lopenblas"

    или

    $ make ... CGLAGS="-I/usr/unite/openblas-0.3.7-pgi-sandybridge/include" LFLAGS="-L/usr/unite/openblas-0.3.7-pgi-sandybridge/lib -lopenblas"

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

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

    $ export LD_LIBRARY_PATH=/usr/unite/openblas-0.3.7-icc-sandybridge/lib:$LD_LIBRARY_PATH
  • ако библиотеката е компилирана чрез PGI Compilers:

    $ export LD_LIBRARY_PATH=/usr/unite/openblas-0.3.7-pgi-sandybridge/lib:$LD_LIBRARY_PATH

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

ВАЖНО! В състемата, в която ще се изпълнява кода на приложението, към което е динамично свързана библиотеката libopenblas.so, трябва да са налични и съответните библиотеки от пакета Intel Compilers или PGI Compilers, в зависимост от това с какъв компилатор е извършена компилацията ѝ (виж примера с извеждането на техния списък по-горе).

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

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

    $ icc -o test test.c file1.o file2.o /usr/unite/openblas-0.3.7-icc-sandybridge/lib/libopenblas.a

    или

    $ ifort -o test test.c file1.o file2.o /usr/unite/openblas-0.3.7-icc-sandybridge/lib/libopenblas.a
  • ако библиотеката е компилирана чрез PGI Compilers:

    $ pgcc -o test test.c file1.o file2.o /usr/unite/openblas-0.3.7-pgi-sandybridge/lib/libopenblas.a

    или

    $ pgfortran -o test test.c file1.o file2.o /usr/unite/openblas-0.3.7-pgi-sandybridge/lib/libopenblas.a

 


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

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