Портал > Документация > Компилиране, инсталиране и използване на BLAS под CentOS 7 и 8
Компилиране, инсталиране и използване на BLAS под CentOS 7 и 8
Съдържание: 
   - Предварителна информация
 
   - Изтегляне на изходния код и компилирането му с Intel Compilers и PGI Compilers
 
   - Инсталиране на библиотеката
 
   - Динамично свързване на компилираната библиотека към C/C++ и Fortran приложения
 
 
  
1. Предварителна информация
BLAS е математическа библиотека, която предлага реализация на числени методи от линейната алгебра. 
ВНИМАНИЕ! В стандартния случай е препоръчително да използвате функциите и процедурите включени в Intel Math Kernel Library (MKL) или тези, които са вградени в дистрибуцията на PGI Compilers, когато и ако е възможно. 
Целта на този документ е да покаже как да бъде компилирана, инсталирана и използвана тази библиотека (вкл. и създаване на библиотека за динамично свързване), с помощта на Intel Compilers, за постигане на висока произовдителност, ако се налага да модифицирате кода на библиотеката (ако не се налага подобна модификация, използвайте Intel Math Kernel Library (MKL) или в библиотеките, които са част от PGI Compilers. 
В случай, че това е възможно, използвайте OpenBLAS, която е нова и оптимизирана версия на BLAS. Вижте документа "Компилиране, инсталиране и използване на OpenBLAS под CentOS 7" за повече детайли относно компилирането на тази библиотека под CentOS 7 и 8 за нуждите на изпълнение на код за работни станции или HPC нодове. 
 
  
2. Изтегляне на изходния код и компилирането му с Intel Compilers и PGI Compilers
Изтеглете последната стабилна версия на кода на проекта от неговата страница: 
http://www.netlib.org/blas/#_software 
За примерите по-долу се предполага, че текущата стабилна версия на кода е 3.8.0. Изтеглянето на архива може да стане с wget, след което архива трябва да се разпакетира, да влезете в директорията с кода и да компилирате: 
$ cd ~/build
$ wget http://www.netlib.org/blas/blas-3.8.0.tgz
$ tar xvf blas-3.8.0.tgz
$ cd BLAS-3.8.0 
   - 
      
с използване на Intel Compilers: 
$ make FORTRAN=ifort OPTS="-xHost -fPIC" 
    
   - 
      
с използване на PGI Compilers: 
$ make FORTRAN=pgfortran OPTS="-fast -Mcache_align -Mpreprocess -Mlarge_arrays -fPIC" 
    
 
Като резултат от тази компилация, ще получите статичната библиотека във файла blas_LINUX.a. Самият Makefile не включва опция за създаването на динамично свързана версия на библиотеката и поради това, ще се наложи да я създадете ръчно. За целта, в същата директория, в която се намира вече създадената статичната версия, изпълнете: 
   - 
      
с използване на Intel Compilers: 
$ ifort -xHost -shared -o libblas.so *.o 
    
   - 
      
с използване на PGI Compilers: 
$ pgfortran -fast -Mcache_align -Mpreprocess -Mlarge_arrays -shared -o libblas.so *.o 
    
 
Резултата от тази операция ще бъде файла libblas.so, който е и версията на библиотеката, позволяваща динамично свързване към изпълним код. 
След успешно създаване на библиотеката за динамично свързване по рецептата по-горе, е добра идея да изведете списък с библиотеките, към които тя е динамично свързана, изпълнявайки: 
$ ldd libblas.so 
Трябва да получите изход, който е подобен на: 
   - 
      
с използване на Intel Compilers: 
	linux-vdso.so.1 (0x00007ffc0398d000)
	libifport.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libifport.so.5 (0x00007fbaacc43000)
	libifcoremt.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libifcoremt.so.5 (0x00007fbaac8af000)
	libimf.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libimf.so (0x00007fbaac30f000)
	libsvml.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libsvml.so (0x00007fbaaa96c000)
	libm.so.6 => /lib64/libm.so.6 (0x00007fbaaa5ea000)
	libintlc.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007fbaaa378000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbaaa158000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fbaa9d94000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fbaa9b7c000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fbaa9978000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fbaad112000) 
    
   - 
      
с използване на PGI Compilers: 
	linux-vdso.so.1 (0x00007ffe2e1fd000)
	libpgf90rtl.so => /usr/unite/pgi/linux86-64-llvm/19.4/lib/libpgf90rtl.so (0x00007fe57733a000)
	libpgf90.so => /usr/unite/pgi/linux86-64-llvm/19.4/lib/libpgf90.so (0x00007fe576de9000)
	libpgf90_rpm1.so => /usr/unite/pgi/linux86-64-llvm/19.4/lib/libpgf90_rpm1.so (0x00007fe576be8000)
	libpgf902.so => /usr/unite/pgi/linux86-64-llvm/19.4/lib/libpgf902.so (0x00007fe5769d5000)
	libpgftnrtl.so => /usr/unite/pgi/linux86-64-llvm/19.4/lib/libpgftnrtl.so (0x00007fe576796000)
	libpgatm.so => /usr/unite/pgi/linux86-64-llvm/19.4/lib/libpgatm.so (0x00007fe57658d000)
	libpgkomp.so => /usr/unite/pgi/linux86-64-llvm/19.4/lib/libpgkomp.so (0x00007fe57638a000)
	libomp.so => /usr/unite/pgi/linux86-64-llvm/19.4/lib/libomp.so (0x00007fe5760b9000)
	libpthread.so.0 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libpthread.so.0 (0x00007fe575e99000)
	libpgmath.so => /usr/unite/pgi/linux86-64-llvm/19.4/lib/libpgmath.so (0x00007fe575a87000)
	libpgc.so => /usr/unite/pgi/linux86-64-llvm/19.4/lib/libpgc.so (0x00007fe575731000)
	librt.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/librt.so.1 (0x00007fe575528000)
	libm.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libm.so.6 (0x00007fe5751a6000)
	libc.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libc.so.6 (0x00007fe574de2000)
	libgcc_s.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libgcc_s.so.1 (0x00007fe574bca000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fe577889000)
	libdl.so.2 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libdl.so.2 (0x00007fe5749c6000) 
    
 
Най-важното, за което трябва да проверите в този списък с библиотеки, е наличието на свързани библиотеки от колекцията на Intel Compilers и PGI Compilers. Трябва да виждате пълния път до файловете им, както е показано по-горе. 
 
  
3. Инсталиране на библиотеката
Инсталирането на библиотеката става ръчно, защото BLAS не предлага в своя Makefile опция, чрез която да стане инсталиране на библиотеката. Създайте директория, в която ще пазите статичната и динамичната версии на директориите и ги копирайте там: 
$ mkdir -p /usr/unite/blas-3.8.0-icc/lib
$ mv blas_LINUX.a libblas.a 
   - 
      
с използване на Intel Compilers: 
$ cp libblas.a libblas.so /usr/unite/blas-3.8.0-icc/lib 
    
   - 
      
с използване на PGI Compilers: 
$ cp libblas.a libblas.so /usr/unite/blas-3.8.0-pgi/lib 
    
 
 
  
4. Динамично свързване на компилираната библиотека към C/C++ и Fortran приложения
За да може даден код да бъде компилиран спрямо динамичната версия на BLAS библиотеката (libblas.so), трябва да бъде зададен пътя до нея и името ѝ (не са нужни include файлове): 
   - 
      
с използване на Intel Compilers: 
$ ./configure ... LFLAGS="-L/usr/unite/blas-3.8.0-icc/lib -lblas" 
      или 
$ make ... LFLAGS="-L/usr/unite/blas-3.8.0-icc/lib -lblas" 
    
   - 
      
с използване на PGI Compilers: 
$ ./configure ... LFLAGS="-L/usr/unite/blas-3.8.0-pgi/lib -lblas" 
      или 
$ make ... LFLAGS="-L/usr/unite/blas-3.8.0-pgi/lib -lblas" 
    
 
След успешна компилация спрямо динамичната версия на библиотеката, изпълнимият код трябва да може да зарежда libblas.so при стартиране. За целта, в текущата сесия на bash, в която ще става стартирането, трябва да се зареди пътя до libblas.so: 
   - 
      
с използване на Intel Compilers: 
$ export LD_LIBRARY_PATH=/usr/unite/blas-3.8.0-icc/lib:$LD_LIBRARY_PATH 
    
   - 
      
с използване на PGI Compilers: 
$ export LD_LIBRARY_PATH=/usr/unite/blas-3.8.0-pgi/lib:$LD_LIBRARY_PATH 
    
 
Това зареждане може да бъде направено инцидентно (примера по-горе) или да стане част от постоянните настройки за Bash сесията (те са обикновено във файла ~/.bashrc). 
ВАЖНО! В състемата, в която ще се изпълнява кода на приложението, към което е динамично свързана библиотеката libblas.so, трябва да са налични и съответните библиотеки от пакета Intel Compilers или PGI Compilers (виж примера с извеждането на техния списък по-горе). 
Когато се използва статичната версия на BLAS библиотеката, самия файл с библиотеката се задава в списъка с бинарни обекти, на база на които компилатора създава изпълнимия код. Например: 
   - 
      
с използване на Intel Compilers: 
$ icc -o test test.c file1.o file2.o /usr/unite/blas-3.8.0-icc/lib/libblas.a 
      или 
$ icpc -o test test.c file1.o file2.o /usr/unite/blas-3.8.0-icc/lib/libblas.a 
      или 
$ ifort -o test test.c file1.o file2.o /usr/unite/blas-3.8.0-icc/lib/libblas.a 
    
   - 
      
с използване на PGI Compilers: 
$ pgcc -o test test.c file1.o file2.o /usr/unite/blas-3.8.0-pgi/lib/libblas.a 
      или 
$ pgc++ -o test test.c file1.o file2.o /usr/unite/blas-3.8.0-pgi/lib/libblas.a 
      или 
$ pgfortran -o test test.c file1.o file2.o /usr/unite/blas-3.8.0-pgi/lib/libblas.a 
    
 
 
 |