Użytkownik może kompilować swoje oprogramowanie zgodnie z regułami pracy na klastrze. Niedopuszczalna jest kompilacja na węźle dostępowym, np. ui.wcss.pl
.
Kompilację programu należy traktować jako jedno z zadań i uruchomić w systemie kolejkowym SLURM. Najprościej jest zgłosić żądanie o dostęp do zasobów w trybie interaktywnym, wówczas system kolejkowy przydziela powłokę (ang. shell) umożliwiając interaktywną pracę na węzłach obliczeniowych. W tym celu należy wykonać polecenie, np.:
srun --time=06:00:00 --mem=8gb -c 4 --pty bash
Należy podać liczbę zasobów, gdy żądamy innej niż domyślne, np.:
--mem=8gb
oznacza 8 GB pamięcia RAM na węźle obliczeniowym,
-c 4
oznacza 4 rdzenie procesora na węźle obliczeniowym.
Po przyznaniu zasobów i otrzymaniu powłoki należy przygotować swoje środowisko pracy do kompilacji korzystając z modułów.
$ srun --time=06:00:00 --mem=8gb -c 4 --pty bash
$ module load gcc
Loading GCC/11.3.0
Loading requirement: GCCcore/11.3.0 zlib/1.2.12-GCCcore-11.3.0
binutils/2.38-GCCcore-11.3.0
$ gcc hello_world.c -o hello_world
$ srun --time=06:00:00 --mem=8gb -c 4 --pty bash
$ module load intel
Loading intel/2022a
Loading requirement: GCCcore/11.3.0 zlib/1.2.12-GCCcore-11.3.0
binutils/2.38-GCCcore-11.3.0 intel-compilers/2022.1.0
numactl/2.0.14-GCCcore-11.3.0 UCX/1.12.1-GCCcore-11.3.0
impi/2021.6.0-intel-compilers-2022.1.0 imkl/2022.1.0 iimpi/2022a
imkl-FFTW/2022.1.0-iimpi-2022a
$ ifort hello_world.f -o hello_world
Znakomita większość oprogramowania na klastrze jest zainstalowana w wersji równoległej tak, aby korzystała z jednego ze sposobów wymiany informacji między procesami (m.in. MPI, OpenMP, PVM). Podczas kompilacji aplikacji równoległych należy odnieść się, odpowiednio konfigurując środowisko systemowe, do bibliotek wspomnianych wyżej środowisk równoległych.
Przygotowanie środowiska pracy polega na:
module load intel/2022a
module load OpenMPI/4.1.4-GCC-11.3.0
Należy pamiętać, aby biblioteki MPI-owe zostały zbudowane wersją kompilatora, na którą wskazują zmienne środowiskowe
module load CMake/3.23.1-GCCcore-11.3.0
Najłatwiej skorzystać z wrapera. Wraper to skrypt, który odwołuje się do właściwego kompilatora i ustawia za użytkownika odpowiednie opcje. Opcje związane są m. in. ze sposobem linkowania współdzielonych bibliotek MPI.
Nazwy kompilatorów w pakiecie Intel i odpowiadających im wraperów z openmpi dostępnych na klastrze Bem2.
nazwa kompilatora | polecenie kompilatora | nazwa wrapera |
---|---|---|
kompilator C | icc | mpicc |
kompilator C++ | icpc | mpic++ |
kompilator FORTRAN77 | ifort | mpif77 |
kompilator FORTRAN90 | ifort | mpif90 |
Czasami, gdy nie można, z różnych powodów użyć wrapera, należy ustawić flagi ręcznie. Jest to rozwiązanie zalecane dla zaawansowanych użytkowników, którzy mają pełną świadomość ustawianych opcji.
Część aplikacji wymaga linkowania z bibliotekami numerycznymi. W tabeli poniżej zestawiono najpopularniejsze, dostępne dla użytkowników WCSS.
Nazwa | Dostawca |
---|---|
MKL | Intel |
BLAS,BLACS, LAPACK, SCALAPACK | Opensource |
OpenBLAS | Opensource |
Intel® Math Kernel Library (MKL) - zestaw bibliotek matematycznych, zoptymalizowanych dla procesorów Intela. Biblioteki oferują pocedury BLAS 1, 2 i 3, Fast Fourier, LAPACK, ScaLAPACK, wsparcie dla procesorów wielordzeniowych, thread-safe, OpenMP, operacji wektorowych, ... Biblioteki zainstalowane są w katalogach, którą wskazuje zmienna środowiskowa $MKLROOT
(np. /usr/local/easybuild/software/imkl/2022.1.0/mkl/2022.1.0
).
Dokumentacja znajduje się w podkatalogu documentation/
. Biblioteki należy linkować w wersji odpowiedniej do procesora na jakim uruchamiane będą obliczenia, np. procesory Intel64 - podkatalog lib/intel64/
.
Zalecane jest linkowanie statyczne, przykłady:
icc -o program.x \
$MKLROOT/lib/intel64/libmkl_lapack95_lp64.a \
$MKLROOT/lib/intel64/libmkl_intel_ilp64.a \
-Vaxlib -lpthread
Biblioteki są zrównoleglone w trybie shared memory w oparciu o wątki. W ten sposób program, który nie jest zrównoleglony, a jest zlinkowany z MKL, może skorzystać z więcej niż jednego procesora. Skalowalność zależy od czasu jaki program spędza w procedurach pochodzących z MKL. Wywołanie kodu równoległego sterowane jest zmienną $SLURM_CPUS_PER_TASK
:
export SLURM_CPUS_PER_TASK=wymagana_liczba_procesorów
Jeśli program jest zrównoleglony sam w sobie, to nie wolno używać MKL w trybie równoległym - spowoduje to konkurowanie wątków MKL z programem właściwym! Wymuszenie trybu nierównoległego:
export MKL_SERIAL=yes
Strona domowa bibliotek
Konfigurator opcji kompilacji i linkowania
Dokumentacja producenta
OpenBLAS jest zoptymalizowaną bibllioteką procedur numerycznych, jest implementacją BLAS z bibliotekami LAPACK. OpenBLAS jest licencjonowany na bazie 3-klauzulowej licencji BSD, licencja ta jest kompatybilna z GPL. Skorzystanie z najnowszej wersji biblioteki na klastrze Bem2 umożliwia polecenie:
module load openblas
Aby skompilować swój program z użyciem OpenBLAS należy dołączyć do kompilatora gfortran
flagę: -L$OPENBLASLIBDIR -lopenblas