Przejdź do treści

ScaLAPACK

Wprowadzenie

ScaLAPACK (Scalable Linear Algebra Package) to skalowalna wersja biblioteki LAPACK, umożliwiająca wykonywanie typowych operacji algebry liniowej w środowisku rozproszonym. Udostępnia podzbiór funkcji LAPACK o interfejsie zmodyfikowanym pod kątem rozpraszania obliczeń. Podobnie jak BLAS i LAPACK posiada kilka implementacji. Jest przeznaczona do obliczeń na CPU. Porównywalne rozwiązania dla GPU oferuje firma NVIDIA w formie bibliotek cuSOLVER (moduł cuSolverMG) oraz cuSOLVERMp.

ScaLAPACK wykorzystuje MPI️ do komunikacji między procesami działającymi na wielu komputerach. Tak jak BLAS i LAPACK️, biblioteka jest przeznaczona do pracy z macierzami liczb rzeczywistych lub zespolonych. Umożliwia obliczenia w pojedynczej lub podwójnej precyzji. Biblioteka jest przewidziana do pracy z macierzami gęstymi, posiada również wyspecjalizowane warianty funkcji dla niektórych typów macierzy (np. symetrycznych, trójkątnych). Z macierzy rzadkich wspierane są macierze wstęgowe (banded).

Dostępność

Referencyjna implementacja ScaLAPACK dostarcza interfejs tylko w języku Fortran (który może być wykorzystany w programach C dzięki ogólnemu mechanizmowi łączenia tych dwóch języków). Jednakże inne implementacje dostarczają również interfejs dla języka C (który naturalnie można wykorzystać w programach C++).

Aby korzystać z tej biblioteki należy pobrać wybraną implementację️ – w formie gotowej wersji binarnej lub kodu źródłowego do własnej kompilacji. Biblioteka ScaLAPACK do działania potrzebuje zainstalowanych bibliotek BLAS i LAPACK oraz MPI.


Szczegóły

ScaLAPACK został zaprojektowany w taki sposób aby jego struktura i interfejs jak najbardziej przypominał interfejs biblioteki LAPACK. W tym celu funkcjonalności dotyczące rozproszenia obliczeń na wiele maszyn zostały wydzielone do osobnych modułów:

  • BLACS (Basic Linear Algebra Communication Subprograms), odpowiada za komunikację i przesyłanie danych typowych dla algebry liniowej między procesami (ukrywa warstwę komunikacji MPI); udostępnia zarówno interfejs Fortran jak i C;
  • PBLAS (Parallel Basic Linear Algebra Subprograms), to implementacja niektórych operacji z biblioteki BLAS – czyli podstawowych operacji algebry liniowej – w architekturze pamięci rozproszonej; wykorzystuje BLACS do komunikacji oraz wywołuje funkcje z BLAS do przeprowadzenia obliczeń w obrębie jednego komputera.

Na BLACS i PBLAS można patrzeć jak na osobne biblioteki, chociaż ich kod jest udostępniany w ramach ScaLAPACK.

zależność między referencyjnymi bibliotekami BLAS, LAPACK i ScaLAPACK

zależność między referencyjnymi bibliotekami BLAS, LAPACK i ScaLAPACK [źródło]

PBLAS i ScaLAPACK to odpowiedniki bibliotek BLAS i LAPACK, które pozwalają na skalowanie obliczeń, czyli ich wykonywanie na wielu komputerach. Tak jak LAPACK został skonstruowany w oparciu o BLAS, tak ScaLAPACK jest oparty o PBLAS. Dzięki takiemu podejściu kod źródłowy funkcji ScaLAPACK (w referencyjnej implementacji) wygląda bardzo podobnie do analogicznego kodu LAPACK.

ScaLAPACK oraz PBLAS, poza rozpraszaniem obliczeń, na najniższym poziomie wywołują funkcje z BLAS. Z tego powodu wydajność biblioteki zależy przede wszystkim od wydajności użytej implementacji BLAS/LAPACK oraz, w mniejszym stopniu, od wydajności biblioteki MPI. Korzystając z wielowątkowości na poziomie BLAS można uzyskać hybrydowe zrównoleglenie obliczeń (MPI + wiele rdzeni).

Zgodność środowiska MPI

Korzystając ze ScaLAPACK należy pamiętać aby kompilować program przy użyciu tej samej biblioteki MPI z którą została zbudowana biblioteka ScaLAPACK. Użycie innej wersji może prowadzić do błędów.

Rozproszenie danych

W celu rozproszenia obliczeń użytkownik musi odpowiednio podzielić dane z wektorów i macierzy między wiele procesów. ScaLAPACK wykorzystuje blokowo cykliczny rozkład danych (block cyclic data distribution) między procesy tworzące 2-wymiarową siatkę procesów (process grid). Taka siatka procesów jest tworzona za pomocą funkcji BLACS i jest reprezentowana przez tzw. kontekst (context). Konteksty pozwalają na odizolowanie od siebie różnych obliczeń wykonywanych przez te same procesy – dane wymieniane w ramach jednego kontekstu nie trafią przez pomyłkę do innego kontekstu. Każdy proces przechowuje tylko swój fragment danych, tzw. macierz lokalna, razem reprezentują one jedną macierz globalną.

macierz rozproszona na 4 procesy (siatka 2x2) według blokowo cyklicznego rozkładu danych

macierz rozproszona na 4 procesy (siatka 2x2) według blokowo cyklicznego rozkładu danych [źródło]

Podział macierzy globalnej na lokalne jest opisywany za pomocą deskryptorów (array descriptor). Rozproszona macierz może zostać zainicjowana w sposób lokalny, tj. każdy proces w sposób niezależny wypełnia swój fragment danych. Możliwe jest również wzięcie macierzy z jednego procesu i rozdzielenie jej między siatkę procesów lub zmiana sposobu podziału macierzy, czyli redystrybucja danych (patrz funkcja PDGEMR2D). ScaLAPACK dostarcza różnych funkcji pomocniczych do pracy z macierzami lokalnymi i globalnymi. Przykładowo są to zamiana indeksów lokalnych na globalne (INDXL2G, INDXG2L), czy obliczanie liczby wierszy/kolumn dla danego procesu (NUMROC).

Nazewnictwo funkcji

konwencja nazewnictwa funkcji ScaLAPACK

konwencja nazewnictwa funkcji ScaLAPACK [źródło]

Główne funkcje ScaLAPACK noszą takie same nazwy jak ich odpowiedniki z BLAS/LAPACK, poprzedzone literą “P”. Interfejs funkcji jest niemal identyczny. Różnica w ScaLAPACK dotyczy określenia w jaki sposób macierz jest podzielona między procesy, tj. poprzez podanie współrzędnych globalnych oraz deskryptora macierzy. Jako przykład można porównać dgesv z pdgesv.

porównanie interfejsu DGESV z jego odpowiednikiem w ScaLAPACK

porównanie interfejsu DGESV z jego odpowiednikiem w ScaLAPACK [źródło]

Funkcje ScaLAPACK są podzielone na kategorie analogicznie do LAPACK. Są to funkcje: sterujące (driver routines), obliczeniowe (computational routines), oraz pomocnicze (auxiliary routines). Dodatkowo można wyróżnić funkcje użytkowe (jak DESCINIT do inicjalizacji deskryptorów, czy wspomniane wcześniej NUMROC oraz INDXL2G) oraz funkcje redystrybucji danych (jak PDGEMR2D).

Schemat programu

Zasadnicze funkcje ScaLAPACK bazują na macierzach już podzielonych na lokalne fragmenty. Inicjalizacja komunikacji oraz konfiguracja siatki procesów i podziału danych zależy od użytkownika. Program korzystający z ScaLAPACK jest więc stosunkowo złożony i wymaga uważnej realizacji poszczególnych kroków.

schemat pracy z biblioteką ScaLAPACK

schemat pracy z biblioteką ScaLAPACK [źródło]

Kod źródłowy referencyjnej implementacji zawiera przykładowe programy. Do zilustrowania tego schematu może posłużyć również przykładowy program – mnożenie macierzy (w oparciu o funkcję PBLAS pdgemm) zrealizowane w języku C.


Implementacje

Oprócz implementacji referencyjnej (Netlib ScaLAPACK) sa również dostępne implementacje producentów sprzętu (np. oneMKL od Intel, AOCL od AMD), z założenia zoptymalizowane pod konkretną architekturę sprzętową. Trzeba jednak przyznać, że o ile referencyjna implementacja BLAS czy LAPACK różni się znacznie od zoptymalizowanych wersji, o tyle w przypadku ScaLAPACK wersje producentów są bazowane na implementacji referencyjnej.

Należy pamiętać, że kluczem do wydajności jest biblioteka BLAS, gdyż to od niej zależą fizyczne obliczenia wykonywane na komputerach. Zaletą implementacji producentów jest to, że wchodzą one w skład pakietów oprogramowania, które integrują ze sobą zoptymalizowane wersje BLAS, LAPACK oraz ScaLAPACK.

Netlib

Netlib ScaLAPACK powstał jako kontynuacja prac nad LAPACK, implementując jego funkcjonalności w środowisko rozproszonym. Pierwsza wersja została wydana w 1995 roku. Podobnie jak Netlib BLAS i LAPACK, biblioteka ta jest referencyjną implementacją, wyznaczającą standardowy interfejs. Ponieważ jej działanie zależy od użytej biblioteki MPI oraz BLAS, jej wydajność nie powinna zbytnio odbiegać od innych implementacji.

Biblioteka jest napisana w języku Fortran, za wyjątkiem kilku procedur napisanych w C (ze względu na arytmetykę IEEE). Udostępnia zbliżony do BLAS i LAPACK interfejs dla języka Fortran. Interfejs dla C nie został zdefiniowany (korzysta się ze standardowego mechanizmu linkowania kodu w C z kodem Fortran).

Początkowo BLACS był osobną biblioteką. Posiadała ona kilka implementacji umożliwiających korzystanie z różnych technik komunikacji. Ostatecznie jednak skupiono się tylko na MPI, a kod BLACS (od wersji 2.0) został włączony do kodu ScaLAPACK. Co ciekawe, BLACS jest napisany w języku C i udostępnia zarówno interfejs Fortran jak i C.

Referencyjna wersja ScaLAPACK może zawierać funkcje lub nowe poprawki, których brakować będzie w wersjach dostarczonych przez zewnętrzne firmy.

Informacje o wydaniu

Biblioteka jest stabilna, jednak co jakiś czas zostaje zaktualizowana o drobne poprawki. Najnowsza wersja to 2.2.0, wydana w lutym 2022 r. Implementacja Netlib znajduje się w repozytoriach popularnych systemów operacyjnych z rodziny Linux i może być zainstalowana bezpośrednio z użyciem wbudowanych menadżerów pakietów (apt/dnf/yum/zypper/pacman). Kod źródłowy bibliotek można pobrać ze strony oraz repozytorium ScaLAPACK.

Przykładowy sposób linkowania

mpicc -o start start.c -lopenblas -lscalapack
W powyższym, linkowanie z OpenBLAS służy zapewnieniu dostępu do bibliotek BLAS oraz LAPACK.

Więcej informacji

Intel oneMKL

Biblioteka Intel oneMKL️ (Intel oneAPI Math Kernel Library, w skrócie MKL), oprócz implementacji BLAS, LAPACK oraz wielu innych funkcji obliczeniowych, zawiera także zoptymalizowaną implementację ScaLAPACK. Biorąc pod uwagę, że Intel dostarcza własną implementację MPI, MKL powinien oferować najlepszą wydajność w środowisku opartym o procesory Intel.

Biblioteka zachowuje podział na moduły BLACS oraz PBLAS. Tak jak referencyjna implementacja, ScaLAPACK z MKL jest napisany w języku Fortran z kilkoma procedurami w C. W odróżnieniu od innych implementacji, oprócz standardowego interfejsu Fortran udostępnia również bezpośredni interfejs w języku C.

Informacje o wydaniu

Biblioteka MKL jest wydawana w ramach zestawu Intel oneAPI Base Toolkit, można ją również pobrać osobno ze strony oneMKL. Obecna wersja to 2023.1.0, wydana w marcu 2023 roku (w ramach Intel oneAPI Base Toolkit 2023.1.0). Aby korzystać z ScaLAPACK dostępnego w oneMKL wraz z Intel MPI, należy skorzystać z Intel oneAPI HPC Toolkit.

Biblioteka jest udostępniania jedynie w postaci binarnej (skompilowanej przez producenta), źródła nie są publicznie dostępne. Niektóre jej wersje można znaleźć w repozytoriach popularnych systemów operacyjnych z rodziny Linux. Nazwa oneMKL jest używana od roku 2021, kiedy to Intel rozpoczął inicjatywę oneAPI. Wcześniej biblioteka była znana pod nazwą Intel MKL.

Przykładowy sposób linkowania dla kompilatora GNU GCC

mpicc -o start start.c -L${MKLROOT}/lib/intel64 -lmkl_scalapack_lp64 -Wl,--no-as-needed \
      -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lmkl_blacs_openmpi_lp64 -lpthread -lm -ldl
W powyższym, do komunikacji (MPI) wykorzystana jest biblioteka OpenMPI, oraz wybrano MKL w wersji szeregowej (bez rozpraszania obliczeń BLAS/LAPACK na wiele rdzeni).

Przykładowy sposób linkowania dla kompilatorów Intel (icc, ifort, icx, ifx)
mpicc -cc=icx -o start start.c -qmkl=cluster
Więcej informacji

AMD AOCL

W ramach zestawu bibliotek firmy AMD, oprócz AOCL-BLIS oraz AOCL-libFLAME️ implementujących funkcjonalność BLAS oraz LAPACK, dostępna jest także biblioteka AOCL-ScaLAPACK. Jest ona zoptymalizowana pod kątem procesorów AMD.

AOCL-ScaLAPACK, podobnie jak w implementacja referencyjna, dostarcza tylko interfejs w języku Fortran. Dla języka C trzeba korzystać ze standardowego mechanizmu linkowania z kodem Fortran.

ScaLAPACK z AOCL może zostać użyty z dowolną implementacją BLAS oraz LAPACK, jednak rekomenduje się skorzystanie z zoptymalizowanych bibliotek AOCL-BLIS oraz AOCL-libFLAME. AOCL dostarcza dodatkową funkcjonalność, w postaci opcjonalnego raportowania postępu wykonania funkcji (aocl_scalapack_set_progress).

Informacje o wydaniu

Najnowsza wersja biblioteki to 4.0, wydana w listopadzie 2022 (numer jest zgodny z numeracją całego pakietu AOCL). Kod źródłowy bibliotek można pobrać z repozytorium AOCL-ScaLAPACK, gdyż AMD udostępnia publicznie implementację swoich bibliotek. Wersje binarne można pobrać ze strony producenta – osobno sam ScaLAPACK lub razem cały pakiet AOCL. Dostępne są pliki binarne bibliotek skompilowane kompilatorami GCC oraz AOCC (zoptymalizowany kompilator AMD).

Przykładowy sposób linkowania

mpicc -o start start.c -lblis -lflame -lscalapack
W powyższym, jako implementacje bibliotek BLAS oraz LAPACK zostały użyte biblioteki BLIS oraz libFLAME.

Więcej informacji

Linki


Ostatnia aktualizacja: 15 września 2023