Портал > Документация > Компилиране, инсталиране и използване на LAPACK под CentOS 7 и 8
Компилиране, инсталиране и използване на LAPACK под CentOS 7 и 8
Съдържание: 
   - Предварителна информация
 
   - Изтегляне на изходния код и компилирането му с Intel Compilers или PGI Compilers
 
   - Динамично и статично свързване на компилираната библиотека към C/C++ и Fortran приложения
 
 
  
1. Предварителна информация
ВНИМАНИЕ! В стандартния случай е препоръчително да използвате функциите и процедурите включени в Intel Math Kernel Library (MKL) или тези, които са вградени в дистрибуцията на PGI Compilers, когато и ако е възможно. 
LAPACK е колекция от библиотеки за линейна алгебра. Целта на този документ е да покаже как тя да бъде компилирана, инсталирана и свързвана към приложения, с използване на Intel Compilers или PGI Compilers, за постигане на висока произовдителност на изпълнимия код върху работни станции или HPC нодове. Статичната и динамичната версии на библиотеките на OpenBLAS (libblas.a, libblas.so, liblapack.a и liblapack.so), могат да се използват от C/C++ и Fortran приложения, ако в техния код се извикват функциите, процедурите и променливите им. Освен това, изпълнимият код трябва да бъде компилиран така, че или да включва статично цялата библиотека или да е свързан динамично към нея (да я зарежда преди изпълнение). 
 
  
2. Изтегляне на изходния код и компилирането му с Intel Compilers или PGI Compilers
Изтеглете последната стабилна версия на LAPACK (за примера по-долу тя е 3.8.0, но по времето, по което ще изпълнявате тези инструкции, е възможно да има и по-нова версия). След това разпакетирайте архива, влезте в директорията, която ще се създаде при разпакетирането, създайте там поддиректория build и в нея изпълнете процесите по конфигуриране и компилиране: 
$ wget http://www.netlib.org/lapack/lapack-3.8.0.tar.gz
$ tar xvf lapack-3.8.0.tar.gz
$ cd lapack-3.8.0
$ mkdir build
$ cd build 
   - 
      
с използване на Intel Compilers: 
$ FC=ifort FCFLAGS=-xHost cmake .. -DBUILD_SHARED_LIBS=0 -DCMAKE_INSTALL_LIBDIR=/usr/unite/lapack-3.8.0-icc/lib64
$ make -j6
$ FC=ifort FCFLAGS=-xHost cmake .. -DBUILD_SHARED_LIBS=1 -DCMAKE_INSTALL_LIBDIR=/usr/unite/lapack-3.8.0-icc/lib64
$ make 
    
   - 
      
с използване на PGI Compilers: 
$ FC=pgfortran FCFLAGS='-fast -Mcache_align -Mpreprocess -Mlarge_arrays' cmake .. -DBUILD_SHARED_LIBS=0 -DCMAKE_INSTALL_LIBDIR=/usr/unite/lapack-3.8.0-pgi/lib64
$ make -j6
$ FC=pgfortran FCFLAGS='-fast -Mcache_align -Mpreprocess -Mlarge_arrays' cmake .. -DBUILD_SHARED_LIBS=1 -DCMAKE_INSTALL_LIBDIR=/usr/unite/lapack-3.8.0-pgi/lib64
$ make 
    
 
След завършване на компилацията (която в случая е съпроводена и с инсталация при извикване на make), създадените статични и динамични версии на библиотеките libblas и liblapack ще се намират в директория: 
   - 
      
с използване на Intel Compilers: 
/usr/unite/lapack-3.8.0-icc/lib 
    
   - 
      
с използване на PGI Compilers: 
/usr/unite/lapack-3.8.0-pgi/lib 
    
 
Може да изведете списък с библиотеките, към които са динамично свързани библиотеките libblas.so и liblapack.so: 
   - 
      
с използване на Intel Compilers: 
$ ldd /usr/unite/lapack-3.8.0-icc/lib64/libblas.so
$ ldd /usr/unite/lapack-3.8.0-pgi/lib64/libblas.so 
      Във всеки един от двата случая, трябва да получите изход, който е подобен на следния: 
	linux-vdso.so.1 (0x00007ffef2388000)
	libblas.so.3 => /home/vesso/unite/lapack-3.8.0-icc/lib/libblas.so.3 (0x00007f406f83d000)
	libifport.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libifport.so.5 (0x00007f406f60f000)
	libifcoremt.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libifcoremt.so.5 (0x00007f406f27b000)
	libimf.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libimf.so (0x00007f406ecdb000)
	libsvml.so => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libsvml.so (0x00007f406d338000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f406cfb6000)
	libintlc.so.5 => /usr/unite/intel/compilers_and_libraries_2019.1.144/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007f406cd44000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f406cb24000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f406c760000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f406c548000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f406c344000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f4070506000) 
    
   - 
      
с използване на PGI Compilers: 
$ ldd /usr/unite/lapack-3.8.0-pgi/lib/libblas.so
$ ldd /usr/unite/lapack-3.8.0-pgi/lib/liblapack.so 
      Във всеки един от двата случая, трябва да получите изход, който е подобен на следния: 
	linux-vdso.so.1 (0x00007ffd5b380000)
	libblas.so.3 => /home/vesso/unite/lapack-3.8.0-icc/lib/libblas.so.3 (0x00007f7e65c1b000)
	libpgf90rtl.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgf90rtl.so (0x00007f7e659fa000)
	libpgf90.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgf90.so (0x00007f7e654a9000)
	libpgf90_rpm1.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgf90_rpm1.so (0x00007f7e652a8000)
	libpgf902.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgf902.so (0x00007f7e65095000)
	libpgftnrtl.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgftnrtl.so (0x00007f7e64e56000)
	libpgatm.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgatm.so (0x00007f7e64c4d000)
	libpgkomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgkomp.so (0x00007f7e64a4a000)
	libomp.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libomp.so (0x00007f7e64779000)
	libpthread.so.0 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libpthread.so.0 (0x00007f7e64559000)
	libpgmath.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgmath.so (0x00007f7e64147000)
	libpgc.so => /usr/unite/pgi/linux86-64-llvm/19.10/lib/libpgc.so (0x00007f7e63df1000)
	librt.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/librt.so.1 (0x00007f7e63be8000)
	libm.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libm.so.6 (0x00007f7e63866000)
	libc.so.6 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libc.so.6 (0x00007f7e634a2000)
	libgcc_s.so.1 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libgcc_s.so.1 (0x00007f7e6328a000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f7e66990000)
	libdl.so.2 => /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libdl.so.2 (0x00007f7e63086000) 
    
 
Най-важното, за което трябва да проверите в този списък с библиотеки, е наличието на свързани библиотеки от колекцията на Intel Compilers или PGI Compilers. Трябва да виждате пълния път до файловете им, както е показано по-горе (оцветени в светло синьо). 
 
  
3. Динамично и статично свързване на компилираната библиотека към C/C++ и Fortran приложения
За да може даден код да бъде компилиран спрямо динамичните версии на LAPACK библиотеките (това са libblas.so и liblapack.so), трябва да бъде зададен пътя до тях и имената им (не са нужни include файлове): 
   - 
      
с използване на Intel Compilers: 
$ ./configure ... LFLAGS="-L/usr/unite/lapack-3.8.0-icc/lib64 -lblas -llapack" 
      или 
$ make ... LFLAGS="-L/usr/unite/lapack-3.8.0-icc/lib64 -lblas -llapack" 
    
   - 
      
с използване на PGI Compilers: 
$ ./configure ... LFLAGS="-L/usr/unite/lapack-3.8.0-pgi/lib64 -lblas -llapack" 
      или 
$ make ... LFLAGS="-L/usr/unite/lapack-3.8.0-pgi/lib64 -lblas -llapack" 
    
 
След успешна компилация спрямо динамичната версия на библиотеката, изпълнимият код трябва да може да зарежда libblas.so и liblapack.so при стартиране. За целта, в текущата сесия на bash, в която ще става стартирането, трябва да се зареди пътя до libblas.so и liblapack.so: 
   - 
      
с използване на Intel Compilers: 
$ export LD_LIBRARY_PATH=/usr/unite/lapack-3.8.0-icc/lib64:$LD_LIBRARY_PATH 
    
   - 
      
с използване на PGI Compilers: 
$ export LD_LIBRARY_PATH=/usr/unite/lapack-3.8.0-pgi/lib64:$LD_LIBRARY_PATH 
    
 
Това зареждане може да бъде направено инцидентно (примера по-горе) или да стане част от постоянните настройки за Bash сесията (те са обикновено във файла ~/.bashrc). 
ВАЖНО! В състемата, в която ще се изпълнява кода на приложението, към което са динамично свързани библиотеките libblas.so и liblapack.so, трябва да са налични и съответните библиотеки от пакета Intel Compilers или PGI Compilers (виж примера с извеждането на техния списък по-горе). 
Когато се използват статичните версии на LAPACK библиотеките (това са libblas.a и liblapack.a), самите файлове с библиотеките се задават в списъка с бинарни обекти, на база на които компилатора създава изпълнимия код. Например: 
   - 
      
с използване на Intel Compilers: 
$ icc -o test test.c file1.o file2.o /usr/unite/lapack-3.8.0-icc/lib64/libblas.a /usr/unite/lapack-3.8.0-icc/lib64/liblapack.a 
      или 
$ icpc -o test test.c file1.o file2.o /usr/unite/lapack-3.8.0-icc/lib64/libblas.a /usr/unite/lapack-3.8.0-icc/lib64/liblapack.a 
      или 
$ ifort -o test test.c file1.o file2.o /usr/unite/lapack-3.8.0-icc/lib64/libblas.a /usr/unite/lapack-3.8.0-icc/lib64/liblapack.a 
    
   - 
      
с използване на PGI Compilers: 
$ pgcc -o test test.c file1.o file2.o /usr/unite/lapack-3.8.0-pgi/lib64/libblas.a /usr/unite/lapack-3.8.0-pgi/lib64/liblapack.a 
      или 
$ pgc++ -o test test.c file1.o file2.o /usr/unite/lapack-3.8.0-pgi/lib64/libblas.a /usr/unite/lapack-3.8.0-pgi/lib64/liblapack.a 
      или 
$ pgfortran -o test test.c file1.o file2.o /usr/unite/lapack-3.8.0-pgi/lib64/libblas.a /usr/unite/lapack-3.8.0-pgi/lib64/liblapack.a 
    
 
 
 |