Kompilacja aplikacji to proces tłumaczenia kodu źródłowego napisanego przez programistę na kod maszynowy zrozumiały dla komputera. Jest to kluczowy etap w tworzeniu oprogramowania, który umożliwia jego uruchomienie na docelowej platformie.
Wymagania:
Jeśli nie spełniasz powyższych wymagań kliknij tutaj.
Użytkownik może kompilować swoje oprogramowanie zgodnie z regułami pracy na klastrze. Kompilacją należy wprowadzić wyłącznie na węzłach obliczeniowych jako jedno z zadań uruchomionych w ramach systemu kolejkowym SLURM.
Niedopuszczalna jest kompilacja na węźle dostępowym, ui.wcss.pl.
Najprościej to uruchomić zadanie w trybie interaktywnym.
Jak uruchomić na partycjach
sub-interactive -c 24 -m 32 -t 5
sub-interactive-lem-cpu -c 24 -m 32 -t 5
sub-interactive-lem-gpu -c 24 -m 32 -t 5
Wówczas system kolejkowy przydziela powłokę (ang. shell) umożliwiając interaktywną pracę na węzłach obliczeniowych.
Po przyznaniu zasobów i otrzymaniu powłoki należy wybrać odpowiedni kompilator oraz przygotować swoje środowisko do kompilacji korzystając z modułów. Do wyboru mamy dwa kompilatory:
abcd@r13ch01b02:~ >module load GCC/13.3.0
Loading GCC/13.3.0
Loading requirement: GCCcore/13.3.0 zlib/1.3.1-GCCcore-13.3.0 binutils/2.42-GCCcore-13.3.0
abcd@r13ch01b02:~ >module libxml2/2.12.7-GCCcore-13.3.0
Loading libxml2/2.12.7-GCCcore-13.3.0
Loading requirement: GCCcore/13.3.0 XZ/5.4.5-GCCcore-13.3.0 zlib/1.3.1-GCCcore-13.3.0
abcd@r13ch01b02:~ > gcc hello_world.c -o hello
abcd@r13ch01b02:~ >module load intel/2024a
Loading intel/2024a
Loading requirement: GCCcore/13.3.0 zlib/1.3.1-GCCcore-13.3.0 binutils/2.42-GCCcore-13.3.0 intel-compilers/2024.2.0 numactl/2.0.18-GCCcore-13.3.0 UCX/1.16.0-GCCcore-13.3.0 impi/2021.13.0-intel-compilers-2024.2.0 imkl/2024.2.0 iimpi/2024a imkl-FFTW/2024.2.0-iimpi-2024a
abcd@r13ch01b02:~ >load libxml2/2.12.7-GCCcore-13.3.0
Loading libxml2/2.12.7-GCCcore-13.3.0
Loading requirement: GCCcore/13.3.0 XZ/5.4.5-GCCcore-13.3.0 zlib/1.3.1-GCCcore-13.3.0
abcd@r13ch01b02:~ > icx hello_world.c -o hello
Po załadowaniu odpowiednich modułów, można rozpocząć kompilacji.
Proces kompilacji jest zależny od pakietu i do tego celu należy zapoznać się z instrukcją instalacji danego programu.
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
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 | Opensource |
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 są zainstalowane 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:
MKL 2022.1:
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
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
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.
Pełna wersja dokumentacji użytkownika WCSS znajduje się tutaj.
Jeśli nie znajdziesz rozwiązania w powyżej dokumentacji, prosimy o kontakt z kdm@wcss.pl