BLAS/LAPACK
Wprowadzenie¶
BLAS i LAPACK to powszechnie uznane biblioteki matematyczne służące do wykonywania typowych operacji algebry liniowej na wektorach i macierzach liczb rzeczywistych lub zespolonych. Ich interfejs stał się swego rodzaju standardem, który obecnie posiada wiele implementacji. Są przeznaczone do obliczeń na CPU w modelu pamięci współdzielonej. Dostawcy GPU oferują biblioteki o tym samym lub zbliżonym interfejsie, które potrafią wykonać część obliczeń na akceleratorze (np. NVBLAS, cuBLAS, rocBLAS).
Biblioteki są przewidziane do pracy z macierzami gęstymi (dense linear algebra), ale posiadają specjalizacje funkcji dla niektórych typów macierzy (symetrycznych, hermitowskich, trójkątnych). Dla macierzy rzadkich bezpośrednio wspierane są macierze wstęgowe (banded). Niektóre implementacje lub dodatkowe biblioteki udostępniają wsparcie dla macierzy rzadkich (często określane jako “sparse BLAS” oraz “sparse solver”).
Dostępność¶
Podstawowe interfejsy BLAS i LAPACK zostały zdefiniowane dla języka Fortran. Odpowiadające im interfejsy dla języka C to CBLAS oraz LAPACKE, przy czym ten drugi jest nieco mniej popularny. W naturalny sposób w programach C++ można używać interfejsu C. Aby korzystać z tych bibliotek należy pobrać wybraną implementację – w formie gotowej wersji binarnej lub kodu źródłowego do własnej kompilacji. Dostępne są również interfejsy dla innych języków, np. dla Python poprzez pakiet SciPy.
Interfejs BLAS (Fortran) w programach napisanych w C
Można spotkać się z przykładami wykorzystywania interfejsu BLAS (Fortran) w programach napisanych w C. Jest to możliwe dzięki mechanizmowi bezpośredniego wywołania funkcji napisanej w innym języku. Dla języków C i Fortran taka integracja kodu pisanego w jednym z nich z biblioteką przewidzianą dla drugiego jest stosunkowo prosta.
Szczegóły¶
BLAS¶
BLAS (Basic Linear Algebra Subprograms) to zbiór podstawowych operacji na wektorach i macierzach. Ze względu na stopień złożoności wyróżnia się 3 poziomy funkcji:
-
poziom 1: operacje na wektorach (np. ),
-
poziom 2: operacje typu macierz-wektor (np. ),
-
poziom 3: operacje typu macierz-macierz (np. ).
Wiele funkcji pozwala na podanie opcji, które wykonają daną operację dla macierzy transponowanej lub sprzężenia hermitowskiego, bez konieczności zmiany postaci macierzy w pamięci programu. Ułatwia to prowadzenie obliczeń odpowiadających zapisowi matematycznemu.
BLAS określa interfejs dla języka Fortran (w tym języku była zaimplementowana pierwsza biblioteka). Dla języka C standardem jest natomiast interfejs CBLAS. Poszczególne implementacje realizują właściwe obliczenia w jednym z tych dwóch języków, a interfejs dla drugiego udostępniają poprzez funkcje pośredniczące.
Cechą charakterystyczną BLAS jest konwencja nazewnictwa funkcji. Wszystkie nazwy są nie dłuższe niż 6 znaków i niejako kodują w sobie opis operacji. Przykładowo pierwsza litera odpowiada za oznaczenie czy obliczenia mają być prowadzone dla liczb rzeczywistych (“s” – pojedyncza precyzja, “d” – podwójna precyzja) czy zespolonych (odpowiednio “c” oraz “z”).
LAPACK¶
LAPACK (Linear Algebra Package) to zbiór bardziej zaawansowanych operacji na macierzach, takich jak:
- rozwiązywanie układów równań liniowych,
- aproksymacja liniowa,
- wartości własne i osobliwe (eigenvalues, singular values),
- rozkład macierzy (LU, Cholesky, QR, SVD, Schur).
Implementacje LAPACK na ogół bazują na bibliotece BLAS i są od niej zależne. Funkcje z LAPACK można traktować jako wyżej poziomowe algorytmy, które wywołują podstawowe operacje dostarczane przez bibliotekę BLAS. Wydajność LAPACK zależy więc w głównej mierze od wydajności używanej biblioteki BLAS.
LAPACK zawiera dużo więcej funkcji niż BLAS. Funkcje te można podzielić na trzy kategorie:
- sterujące (driver routines) – rozwiązują cały zadany problem poprzez serię odwołań do funkcji obliczeniowych;
- obliczeniowe (computational routines) – realizują pojedyncze zadanie obliczeniowe;
- pomocnicze (auxiliary routines) – czyli wszystkie pozostałe.
Podobnie jak w przypadku BLAS, LAPACK definiuje interfejs dla języka Fortran. Dla języka C określono interfejs LAPACKE, przy czym jego popularność jest nieco mniejsza niż CBLAS. Podobnie jak w BLAS, wszystkie nazwy funkcji są nie dłuższe niż 6 znaków i stosują się do ustalonej konwencji nazewnictwa funkcji.
Implementacje¶
Historycznie BLAS i LAPACK były konkretnymi bibliotekami, które obecnie – pod nazwą Netlib BLAS/LAPACK – są traktowane jako implementacje referencyjne. Przez ponad 30 lat od ich pierwszego wydania powstało wiele innych implementacji, zoptymalizowanych pod kątem możliwości nowszych procesorów. Ważną cechą tych implementacji jest wsparcie dla wielowątkowości. Oznacza to, że biblioteka potrafi automatycznie zrównoleglić obliczenia na wiele rdzeni procesora, bez żadnej dodatkowej akcji ze strony użytkownika.
Współczesne implementacje możemy podzielić na dwie grupy:
- implementacje zoptymalizowane pod konkretną architekturę sprzętową, tworzone głównie przez producentów danego sprzętu (np. oneMKL od Intel, AOCL od AMD), najczęściej ich źródła nie są publicznie dostępne;
- implementacje ogólne, niezależne od konkretnej platformy sprzętowej (np. OpenBLAS, BLIS) o publicznie dostępnym kodzie źródłowym.
Z założenia na danym procesorze najlepsze wyniki powinna osiągać implementacja od jego producenta. Wszystko jednak zależy od konkretnego przypadku użycia – implementacje ogólne (a nawet innego producenta) mogą osiągać bardzo podobną wydajność.
Zgodność z tym samym interfejsem sprawia, że w stosunkowo łatwy sposób można przełączać się między różnymi implementacjami. Podmiana implementacji zwykle nie wymaga żadnych zmian w kodzie programu albo trzeba ich wykonać niewiele. Niestety czasem mogą wystąpić pewne techniczne trudności. Dla ułatwienia tego zadania została stworzona biblioteka pośrednicząca FlexiBLAS (szczegóły w następnej sekcji).
Poniżej zaprezentowane są wybrane implementacje. Szerszy wybór można znaleźć sprawdzając: lista implementacji BLAS oraz lista implementacji LAPACK.
Netlib¶
Netlib BLAS oraz LAPACK to biblioteki powstałe w latach 1970-1990, które na ówczesne czasy (jednordzeniowe procesory) były bardzo efektywne. LAPACK zastąpił m.in. wcześniej używaną bibliotekę LINPACK. Traktowane jako referencyjne implementacje, wyznaczają standard oraz poprawność procedur. Nie oferują wysokiej wydajności w obliczeniach i nie wspierają wielordzeniowości.
Biblioteki są napisane w języku Fortran (dokładniej Fortran 77). Dla języka C udostępniają odpowiednio interfejs CBLAS oraz LAPACKE i dostarczają ich implementacje w formie bibliotek pośredniczących. Na stronie Netlib można również znaleźć interfejs LAPACK95, który wykorzystuje własności języka Fortran 95 do uproszczenia interfejsu LAPACK (nie jest on jednak traktowany jako standard).
Netlib LAPACK został zoptymalizowany pod kątem korzystania z funkcji BLAS 3-poziomu. Dzięki temu referencyjny LAPACK w połączeniu z zoptymalizowaną wersją BLAS może osiągać bardzo dobrą wydajność. Z tego powodu LAPACK nie posiada aż tak wielu innych implementacji co BLAS.
Informacje o wydaniu¶
Obecna wersja to 3.11.0, wydana w listopadzie 2022 roku. Mniej więcej co roku pojawia się drobna aktualizacja. Implementacje Netlib znajdują się w repozytoriach popularnych systemów operacyjnych z rodziny Linux i mogą być zainstalowane 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 BLAS/LAPACK:
- na stronie BLAS dostępne są osobne paczki z kodem BLAS oraz CBLAS,
- na stronie LAPACK dostępny jest kod LAPACK, który zawiera w sobie również BLAS, CBLAS jak i LAPACKE.
Przykładowy sposób linkowania dla kompilatora GNU GCC
gcc -o start start.c -lblas -llapack
Więcej informacji¶
OpenBLAS¶
OpenBLAS to zoptymalizowana wersja BLAS wywodząca się z nierozwijanej już biblioteki GotoBLAS2. Wspiera wielordzeniowość, podział rdzeni na bloki NUMA, instrukcje wektorowe, a także posiada optymalizacje specyficzne dla architektur konkretnych procesorów (patrz lista wspieranych procesorów). Zawiera zarówno implementację funkcji BLAS jak i LAPACK, dzięki czemu na etapie kompilacji wystarczy linkować się tylko do biblioteki OpenBLAS.
Biblioteka jest napisana w języku C ze wstawkami assemblera (optymalizacje pod konkretne architektury procesorów). Udostępnia bazowy interfejs BLAS/LAPACK w języku Fortran, a dla języka C odpowiednio interfejsy CBLAS i LAPACKE. Implementacja LAPACK częściowo bazuje na referencyjnym kodzie ale w przypadku niektórych funkcji również została zoptymalizowana. Dodatkowo zaimplementowane zostały rozszerzenia BLAS podobne do tych wprowadzonych przez bibliotekę Intel oneMKL.
W trakcie wykonania programu, OpenBLAS wykrywa zestawy instrukcji wspierane przez CPU (np. AVX2 czy AVX512). Dzięki temu może wybrać najlepszy kernel obliczeniowy dla aktualnie używanego procesora (spośród kerneli zbudowanych w trakcie kompilacji biblioteki). Biblioteka pozwala na kontrolę liczby wątków użytych do zrównoleglenia obliczeń poprzez zmienną środowiskową OPENBLAS_NUM_THREADS
lub (klasyczną dla OpenMP) zmienną OMP_NUM_THREADS
. Liczba wątków może być również kontrolowana w kodzie, przez wywołanie funkcji openblas_set_num_threads
. Należy pamiętać, że maksymalna liczba wątków do wykorzystania jest definiowana w momencie kompilacji biblioteki.
Informacje o wydaniu¶
Obecna wersja OpenBLAS to 0.3.21, wydana w sierpniu 2022 roku. Implementacja jest systematycznie rozwijana. OpenBLAS znajduje się w repozytoriach popularnych systemów operacyjnych z rodziny Linux i może być zainstalowana bezpośrednio z użyciem wbudowanych menedżerów pakietów, jak apt/dnf/yum/zypper/pacman. Kod źródłowy biblioteki można pobrać ze strony oraz repozytorium OpenBLAS.
Przykładowy sposób linkowania dla kompilatora GNU GCC
gcc -o start start.c -lopenblas
Przykładowy sposób uruchomienia z określoną liczbą wątków
OPENBLAS_NUM_THREADS=4 ./start
Więcej informacji¶
- strona OpenBLAS
- repozytorium
- dokumentacja: README / wiki / USAGE
ATLAS¶
ATLAS (Automatically Tuned Linear Algebra Software) to implementacja BLAS zorientowana na automatyczne uzyskanie wysokiej wydajności na etapie kompilacji biblioteki. Jest w pełni zgodna z BLAS, zawiera tylko kilka funkcji LAPACK. Wspiera wielordzeniowość.
Status projektu
Projekt ATLAS nie jest aktywnie rozwijany. Z tego powodu na obecnych procesorach uzyskany kod nie oferuje najwyższej wydajności. Powinien on jednak być istotnie szybszy niż referencyjna implementacja Netlib.
Szczegóły biblioteki ATLAS
Biblioteka dostarcza klasyczny interfejs BLAS (Fortan) oraz CBLAS. Zaimplementowane funkcje z biblioteki LAPACK (patrz wykaz w FAQ) są dostarczane w wersji zgodnej z interfejsem Fortran. Dla języka C biblioteka ATLAS udostępnia własny interfejs (nazwy funkcji są w nim poprzedzone przedrostkiem clapack_
). Możliwe jest skompilowanie ATLAS wraz z Netlib LAPACK celem dostarczenia pełnego interfejsu LAPACK.
Głównym założeniem ATLAS jest automatyczne wygenerowanie zoptymalizowanego kodu binarnego w momencie kompilacji biblioteki. Kod będzie dostosowany pod architekturę komputera, na którym odbywa się kompilacja. Optymalizacja jest realizowana poprzez automatyczne przetestowanie wydajności różnych sposobów implementacji funkcji z biblioteki i sprawdzenie wielu parametrów sterujących obliczeniami. Wybrana zostaje najbardziej efektywna wersja, przez co wersja binarna nie posiada kilku kerneli dla różnych architektur procesora. Stąd przenaszalność zbudowanej biblioteki pomiędzy komputerami jest dyskusyjna (najprawdopodobniej nie zadziała lub będzie działać wolniej, niż gdyby została ponownie skompilowana).
Informacje o wydaniu¶
Ostatnia stabilna wersja to 3.10.3, wydana w lipcu 2016 roku ⚠️. Dostępna jest również wersja rozwojowa 3.11.41, z października 2018 roku. Projekt nie jest rozwijany w ostatnich latach. Implementacje ATLAS mogą znajdować się w repozytoriach popularnych systemów operacyjnych z rodziny Linux. Zazwyczaj są to wersje kompilowane z użyciem dość ogólnych flag i wersja skompilowana bezpośrednio na maszynie może działać wydajniej.
Przykładowy sposób linkowania dla kompilatora GNU GCC
gcc -o start start.c -latlas
Więcej informacji¶
Intel oneMKL¶
Biblioteka Intel oneMKL️ (Intel oneAPI Math Kernel Library, w skrócie MKL), oprócz implementacji wielu innych funkcji obliczeniowych, zawiera bardzo wydajną implementację BLAS/LAPACK. Jest ona zoptymalizowana szczególnie pod procesory firmy Intel. Wspiera wielordzeniowość oraz najnowsze zestawy instrukcji tych procesorów (np. AVX-512).
MKL udostępnia bazowy interfejs BLAS/LAPACK w języku Fortran (dokładniej Fortran 77), a dla języka C odpowiednio interfejsy CBLAS i LAPACKE. Dodatkowo dostarcza:
- interfejs Fortran 95 będący uproszczeniem standardowego interfejsu BLAS/LAPACK,
- Sparse BLAS, tj. funkcje do obliczeń na wektorach rzadkich,
- BLAS-like Extensions, czyli rozszerzenia funkcjonalności BLAS.
Biblioteka może również być używana w innych językach programowania i bibliotekach obliczeniowych.
MKL dostępny jest w dwóch wersjach: szeregowej oraz wielowątkowej. Wersja szeregowa wykonuje obliczenia tylko na jednym rdzeniu procesora. Wersja wielowątkowa zrównolegla obliczenia i pozwala na kontrolę zachowania wątków. Jest ona dostępna w dwóch wariantach – podstawowym opartym o technologię OpenMP oraz dodatkowym opartym o technologię Intel TBB. W wariancie podstawowym liczbę wątków użytych do zrównoleglenia obliczeń można określić poprzez zmienną środowiskową MKL_NUM_THREADS
lub OMP_NUM_THREADS
, przy czym ta pierwsza ma priorytet.
Informacje o wydaniu¶
Biblioteka 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). 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
gcc -o start start.c -lmkl_rt -Wl,--no-as-needed -lpthread -lm -ldl
Przykładowy sposób linkowania dla kompilatorów Intel (icc, ifort, icx, ifx)
icx -o start start.c -qmkl # wersja wielowątkowa
icx -o start start.c -qmkl=sequential # wersja szeregowa
Inne sposoby linkowania
Intel oneMKL jest bardzo rozbudowaną biblioteką i umożliwia kilka sposobów linkowania. Przykładowo SDL (Single Dynamic Library) pozwala na sterowanie zachowaniem biblioteki już na etapie wykonania programu, poprzez zmienne środowiskowe.
Więcej informacji na ten temat w dokumentacji Linking Quick Start.
Więcej informacji¶
- strona Intel oneMKL
- dokumentacja:
- funkcje BLAS (C) / BLAS (Fortran), w tym Sparse BLAS i rozszerzenia
- funkcje LAPACK (C) / LAPACK (Fortran)
- przewodnik programisty - dodatkowe informacje o interfejsach
BLIS / libFLAME¶
BLIS (BLAS-like Library Instantiation Software) oraz libFLAME to wydajne biblioteki do obliczeń z dziedziny algebry liniowej, stanowiące alternatywę dla BLAS/LAPACK. Ich rozwój został zapoczątkowany przez naukowców z grupy SHPC z Uniwersytetu Teksasu w Austin. Zostały napisane wedle innych założeń i posiadają swój własny, nowszy interfejs dla typowych operacji i algorytmów algebry liniowej. Jednocześnie zachowują kompatybilność z BLAS oraz LAPACK.
Obydwie biblioteki zostały napisane w języku C. BLIS udostępnia zarówno interfejs BLAS jak i CBLAS (ten drugi pod warunkiem, że został włączony na etapie kompilacji biblioteki). Biblioteka rozszerza funkcjonalności BLAS, ale w celu ich wykorzystania trzeba odwołać się do natywnego interfejsu BLIS. Z kolei libFLAME posiada warstwę kompatybilności liblapack2flame, która umożliwia korzystanie z biblioteki poprzez klasyczny interfejs LAPACK.
BLIS posiada rozbudowane wsparcie dla wielowątkowości, przy czym najlepiej działa w obrębie jednego NUMA. Podstawowa zmienna do określania liczby wątków to BLIS_NUM_THREADS
. Do kontroli przypięcia wątków (affinity) służą zmienne GOMP_CPU_AFFINITY
(pod warunkiem korzystania z biblioteki skompilowanej GCC) oraz OMP_PROC_BIND
i OMP_PLACES
(należące do standardu OpenMP).
Informacje o wydaniu¶
BLIS jest aktywnie rozwijaną i uznaną biblioteką. Obecna wersja BLIS to 0.9.0, wydana w kwietniu 2022 roku. Z kolei kod libFLAME nie jest zbyt często zmieniany, ale na pewno nie został porzucony. Ostatnia udokumentowana wersja libFLAME to 5.2 z sierpnia 2019 roku. Kod źródłowy bibliotek jest dostepny w repozytoriach. Dodatkowo BLIS jest dostępny w skompilowanej wersji w repozytoriach niektórych systemów operacyjnych.
Przykładowy sposób linkowania dla kompilatora GNU GCC
gcc -o start start.c -lblis -lm -lpthread
Więcej informacji¶
- strona oprogramowania grupy SHPC
- BLIS
- libFLAME
AMD AOCL¶
W ramach zestawu bibliotek firmy AMD dostępne są zoptymalizowane pod kątem procesorów firmy AMD implementacje alternatywnych dla BLAS/LAPACK bibliotek BLIS oraz libFLAME. Są to odpowiednio AOCL-BLIS oraz AOCL-libFLAME. Oferują one dużą wydajność, wspierają wielordzeniowość oraz zawierają optymalizacje dla architektur najnowszych procesorów AMD.
Podobnie jak referencyjne BLIS/libFLAME, wersje AMD udostępniają interfejs BLAS, CBLAS oraz LAPACK (obecna wersja jest zgodna z LAPACK w wersji 3.10.1). Dodatkowo, oprócz natywnego interfejsu BLIS, AOCL-BLIS udostępnia wzorowany na CBLAS interfejs dla C++ (który wykorzystuje szablony). Z kolei AOCL-libFLAME udostępnia również interfejs LAPACKE oraz uproszczony interfejs dla C++.
Tak jak w BLIS, do kontroli liczby wątków użytych do zrównoleglenia obliczeń wykorzystywana jest zmienna BLIS_NUM_THREADS
, która ma pierwszeństwo przed OMP_NUM_THREADS
. Dokumentacja precyzyjnie określa sposób ustalania liczby wątków przez AOCL-BLIS, co w szczególności pozwala na używanie przez aplikację innej liczby wątków niż biblioteka (patrz AOCL-BLIS Thread Control). Dodatkowo można skorzystać z mechanizmu AOCL Dynamic, który dla niektórych funkcji w sposób automatyczny wyznaczy liczbę wątków.
W przypadku AOCL-libFLAME, niektóre funkcje posiadają wsparcie dla wielowątkowości z wykorzystaniem OpenMP. W ich przypadku biblioteka sama wyznaczy odpowiednią liczbę wątków (biorąc pod uwagę ustawienie zmiennej OMP_NUM_THREADS
). Oprócz kontroli wielowątkowości AOCL-BLIS udostępnia mechanizmy do logowania działania funkcji, jednak wymagają one skompilowania biblioteki w specjalny sposób.
Informacje o wydaniu¶
Najnowsza wersja bibliotek to 4.0, opublikowana w listopadzie 2022 (numeracja bibliotek jest zgodna z numeracją całego pakietu AOCL). Dostępne są pliki binarne bibliotek skompilowane kompilatorami GCC oraz AOCC (zoptymalizowany kompilator AMD). Co ciekawe, możliwe jest również pobranie plików źródłowych do własnej kompilacji z odpowiednich repozytoriów, gdyż AMD udostępnia publicznie implementację tych bibliotek.
Przykładowy sposób linkowania dla kompilatora GNU GCC
gcc -o start start.c -lblis-mt -lm -fopenmp
Więcej informacji¶
- strona AOCL-BLIS i AOCL-libFLAME
- repozytorium: blis / libflame
- dokumentacja
Biblioteka FlexiBLAS¶
FlexiBLAS jest biblioteką pośredniczącą (tzw. wrapper), tj. dostarcza funkcje o interfejsie zgodnym z BLAS/LAPACK, ale samemu nie implementuje właściwych obliczeń tylko wywołuje funkcje z konkretnych implementacji (np. OpenBLAS czy oneMKL). Zasadniczym celem tej biblioteki jest ułatwienie podmiany właściwej implementacji bez konieczności rekompilacji programu oraz umożliwienie profilowania i logowania wywołań funkcji BLAS/LAPACK.
Schemat pracy¶
Implementacje których wywołanie umożliwia FlexiBLAS, są określane na etapie kompilacji biblioteki FlexiBLAS. Schemat pracy wygląda więc następująco:
- administrator kompiluje FlexiBLAS z różnymi backendami (np. OpenBLAS, oneMKL) oraz wskazuje, który z nich ma być używany domyślnie;
- programista pisze program zgodny z API BLAS/LAPACK i kompiluje go linkując z FlexiBLAS;
- użytkownik na etapie uruchomienia programu:
- decyduje który z backendów BLAS/LAPACK ma zostać użyty (w przypadku braku wskazania zostanie użyty backend ustawiony jako domyślny),
- kontroluje dodatkowe funkcjonalności dostarczane przez FlexiBLAS jak logowanie czy profilowanie wywołań.
FlexiBLAS współpracuje z głównymi implementacjami BLAS/LAPACK (m.in. OpenBLAS, BLIS, Intel oneMKL), a samemu zawiera w sobie referencyjny kod Netlib.
Konfiguracja¶
Konfiguracja zachowania na etapie uruchomienia jest możliwa poprzez zmienne środowiskowe oraz pliki konfiguracyjne. Przykładowo:
- zmienna
FLEXIBLAS
pozwala wskazać, która implementacja BLAS/LAPACK ma zostać użyta (można wskazać nazwę biblioteki zarejestrowaną w pliku konfiguracyjnym lub nazwę/ścieżkę pliku binarnego biblioteki), export FLEXIBLAS_HOOK=libflexiblas_hook_profile.so
włącza profilowanie.
Pliki konfiguracyjne definiują domyślne zachowanie oraz obsługiwane backendy. Są zorganizowane w hierarchię (konfiguracja globalna oraz użytkownika). Do wygodnej pracy z nimi służy narzędzie “flexiblas”. Przykładowo:
flexiblas list
poda listę dostepnych backendów,flexiblas print
wypisze ustawienia na podstawie wszystkich plików konfiguracyjnych.
Interfejsy BLAS/LAPACK¶
FlexiBLAS udostępnia standardowy interfejs BLAS/LAPACK dla języka Fortran oraz CBLAS dla języka C. Będzie również współpracował z kodem C, który wywołuje funkcje LAPACK z interfejsu dla języka Fortran. Należy jednak mieć na uwadzę, że dostępność interfejsu CBLAS oraz LAPACK jest ustawiana na etapie kompilacji biblioteki FlexiBLAS. Pracując więc z gotową instalacją może się okazać, że nie są one obsługiwane. Podcza kompilacji jest również określana wersja API z którą ma być zgodny interfejs LAPACK (numeracja API według numerów wersji referencyjnej implementacji Netlib).
Informacje o wydaniu¶
Obecna wersja biblioteki to 3.3.0, wydana w grudniu 2022 roku. FlexiBLAS jest systematycznie aktualizowany. Kod źródłowy biblioteki do ręcznego zbudowania można pobrać ze strony oraz repozytorium. W przypadku niektórych systemów operacyjnych gotowy pakiet FlexiBLAS może być zainstalowany z użyciem wbudowanego menadżera pakietów. Co ciekawe, Fedora Linux od 2020 roku wdrożyła FlexiBLAS do zarządzania implementacjami BLAS/LAPACK na poziomie całego systemu (domyślnie wykorzystując backend OpenBLAS).
Przykładowy sposób linkowania dla kompilatora GNU GCC
gcc -o start start.c –lflexiblas
Przykładowy sposób uruchomienia z wybraniem backendu innego niż domyślny
FLEXIBLAS="libblas_atlas.so" ./start
Więcej informacji¶
- strona FlexiBLAS
- repozytorium i dokumentacja
- materiały
Linki¶
-
dokumentacja interfejsu programistycznego (API)
-
wykaz funkcji
- podręczny wykaz dla BLAS / wersja HTML
- podręczny wykaz dla LAPACK: ogólny / funkcje sterujące (driver routines)
- wyszukiwarka funkcji LAPACK (Intel oneMKL)
-
konwencje nazewnictwa funkcji i interfejsów
-
materiały
- szczegółowy opis funkcji LAPACK (Netlib)
- tutorial porównujący Netlib BLAS, OpenBLAS oraz MKL
(wersje sekwencyjne, wydajność jednego rdzenia obliczeniowego)