Jaki jest związek między BLASEM, LAPACKIEM i ATLASEM

143

Nie rozumiem, jak BLAS, LAPACK i ATLAS są powiązane i jak mam ich używać razem! Przejrzałem wszystkie ich podręczniki i mam ogólny pomysł na BLAS i LAPACK oraz jak ich używać z kilkoma przykładami, które znalazłem, ale nie mogę znaleźć żadnych rzeczywistych przykładów użycia ATLAS, aby zobaczyć, jak to jest powiązane z tych dwóch.

Próbuję trochę popracować nad matrycami, a moim podstawowym językiem jest C. Najpierw chciałem użyć GSL, ale jest napisane, że jeśli chcesz uzyskać najlepszą wydajność, powinieneś użyć BLAS i ATLAS. Czy jest jakaś dobra strona internetowa zawierająca fajne przykłady tego, jak używać tych (w języku C) razem? Innymi słowy, szukam samouczka na temat korzystania z tych trzech (lub dowolnego ich podzbioru!). Krótko mówiąc, jestem zdezorientowany!

makhlaghi
źródło
3
Zobacz także scicomp.stackexchange.com/questions/8052/ ...
Znak wysokiej wydajności

Odpowiedzi:

156

BLAS jest zbiorem niskopoziomowych operacji arytmetycznych na macierzach i wektorach („pomnóż wektor przez skalar”, „pomnóż dwie macierze i dodaj do trzeciej macierzy” itd.).

LAPACK to zbiór operacji algebry liniowej wyższego poziomu. Rzeczy takie jak faktoryzacje macierzy (LU, LLt, QR, SVD, Schur itp.), Które są używane do wykonywania takich czynności, jak „znajdowanie wartości własnych macierzy”, „znajdowanie wartości osobliwych macierzy” lub „rozwiązywanie układu liniowego ”. LAPACK jest zbudowany na BLAS; wielu użytkowników LAPACK używa tylko interfejsów LAPACK i nigdy nie musi w ogóle zdawać sobie sprawy z BLAS. LAPACK jest generalnie kompilowany niezależnie od BLAS-a i może używać dowolnej wysoce zoptymalizowanej implementacji BLAS-a, jaką masz.

ATLAS to przenośna, dość dobra implementacja interfejsów BLAS, która implementuje również kilka najczęściej używanych operacji LAPACK.

To, czego „powinieneś używać”, zależy w pewnym stopniu od szczegółów tego, co próbujesz zrobić i jakiej platformy używasz. Nie pomylisz się jednak zbytnio z „użyj ATLAS + LAPACK”.

Stephen Canon
źródło
Dzięki za wyjaśnienia. Czy znasz jakieś przykłady JAK używać ATLAS + LAPACK? Muszę zobaczyć kilka przykładów, aby zrozumieć, jak ich używać! Rozumiem, do czego służą i teorię tego, co robią, ale w C nie mogę znaleźć żadnych przykładów, jak zastosować je w praktyce.
makhlaghi
1
@astroboy: czy możesz podać mi informacje o tym, co tak naprawdę próbujesz zrobić? Szczególnie LAPACK to ogromna biblioteka.
Stephen Canon,
Dla uproszczenia powiedzmy, że mam macierz i chcę ją pomnożyć przez określoną wartość. Jak mogę to zrobić łącząc ATLAS i (LAPACK lub BLAS) w C? Chcę tylko zobaczyć, jak zaimplementować którąkolwiek z tych funkcji. Jest kilka przykładów na netlib.org/lapack/lapacke.html, ale nie ma tam wzmianki o ATLAS!
makhlaghi
Czy jest coś takiego jak BLAS, LAPACK lub MKL, które jest w stanie pracować transparentnie z obiektami znacznie większymi niż pamięć?
skan
1
@ MinhNghĩa: Istnieje standard, netlib.org/blas/blast-forum , ale (a) nie ma egzekwowania - standard bez zestawu testów tak naprawdę nie jest standardem - i (b) nie sądzę że każdy implementuje pełny zestaw interfejsów opisanych w tym dokumencie. To jest aspiracyjne.
Stephen Canon
40

Jakiś czas temu, kiedy zacząłem robić trochę algebry liniowej w C, przyszedł do mnie zaskoczeniem, aby zobaczyć tak mało tutoriale do BLAS, LAPACKi inne podstawowe APIs, pomimo faktu, że są one w jakiś sposób podwaliny wielu innych bibliotekach. Z tego powodu zacząłem zbieranie wszystkich przykładów / samouczki udało mi się znaleźć w całym internecie BLAS, CBLAS, LAPACK, CLAPACK, LAPACKE, ATLAS, OpenBLAS... w tym GitHub repo .

Cóż, powinienem cię ostrzec, że jako inżynier mechanik mam niewielkie doświadczenie w zarządzaniu takim repozytorium git czy GitHub. Na początku będzie to dla was kompletny bałagan. Jeśli jednak uda Ci się pokonać bałaganiarską strukturę, znajdziesz wiele przykładów i instrukcji, które mogą być pomocne. Wypróbowałem większość z nich, aby mieć pewność, że się kompilują. A te, które się nie kompilują, wspomniałem. I zostały zmodyfikowane wielu z nich będzie compilable z GNU compilers( gcc, g++i gfortran). Zrobiłem te, MakeFilektóre możesz przeczytać, aby dowiedzieć się, jak wywoływać poszczególne Fortran/FORTRANprocedury w programie Club C++. Umieściłem również instrukcje instalacji dla Maca i Linuksa (przepraszam, chłopaki od Windows!) Zrobiłem też trochębash .sh pliki do automatycznej kompilacji niektórych z tych bibliotek.

Ale przechodząc do drugiego pytania: BLASi LAPACKraczej APInie są to konkretne pytania SDK. To tylko lista specyfikacji lub rozszerzeń językowych, a nie implementacje lub biblioteki. Mając to na uwadze , istnieją oryginalne implementacje Netlib w programie FORTRAN 77, do których większość ludzi odnosi się ( myląco !), Gdy mówi o BLASi LAPACK. Więc jeśli widzisz wiele dziwnych rzeczy podczas korzystania z tych funkcji, APIjest to spowodowane tym, że w rzeczywistości wywoływałeś FORTRANprocedury, Ca nie Cbiblioteki i funkcje. ATLASi OpenBLASsą jednymi z najlepszych wdrożeń BLASi LACPACKo ile wiem. Są zgodne z oryginałem API, mimo że, o ile wiem, zostały zaimplementowaneC/C++od zera (nie jestem pewien!). Istnieją implementacje GPGPU APIwykorzystujące OpenCL: CLBlast , clBLAS , clMAGMA , ArrayFire i ViennaCL, aby wymienić tylko niektóre. Istnieją również implementacje specyficzne dla dostawców, zoptymalizowane pod kątem konkretnego sprzętu lub platformy, których zdecydowanie odradzam.

Polecam każdemu, kto chce się uczyć używając BLASi LAPACKin, najpierw Cnauczyć się FORTRAN-Cprogramowania mieszanego. Pierwszy rozdział wspomnianego repozytorium jest poświęcony tej sprawie i tam zebrałem wiele różnych przykładów.

PS Od czasu do czasu pracowałem nad wersją deweloperską repozytorium . Wydaje się nieco mniej niechlujny!

Foad
źródło
Strona Wikipedii dla LAPACK zaczyna się od „LAPACK (Linear Algebra Package) to standardowa biblioteka oprogramowania”. Czy mówisz, że to niepoprawne, ponieważ jest to specyfikacja API, a nie implementacja?
Noah_S
1
Po kilku badaniach wydaje się, że LAPACK i BLAS to w rzeczywistości implementacje. Z FAQ NetLib na temat BLAS: „BLAS (Podprogramy podstawowej algebry liniowej) to procedury, które zapewniają standardowe bloki konstrukcyjne do wykonywania podstawowych operacji na wektorach i macierzach”. Ze strony GitHub firmy LAPACK: „LAPACK to biblioteka podprogramów języka Fortran”. Opierając się na tym i czytając projekt GitHub firmy LAPACK, mam wrażenie, że BLAS i LAPACK w rzeczywistości są implementacjami - LAPACK opiera się na BLAS, aby zapewnić bardziej wyrafinowaną funkcjonalność.
Noah_S
1
@Noah_S Nie używałbym Wikipedii jako „odniesienia”, ale według mojej ograniczonej wiedzy istnieje kilka implementacji LAPACK. Myślę, że nazywanie go API jest teraz dokładniejsze. ale proszę mnie poprawić, jeśli się mylę.
Foad
2
Myślę, że część zamieszania polega na tym, że BLAS jest API / specyfikacją, ale istnieje również „implementacja referencyjna” BLAS (z Netlib), która jest również nazywana po prostu „biblioteką BLAS”. Zwykle kiedy ludzie mówią BLAS, mają na myśli API, ponieważ implementacja referencyjna nie jest zoptymalizowana, więc nie jest często używana w praktyce / przemyśle. ATLAS zapewnia zoptymalizowaną implementację kilku podprogramów LAPACK, a następnie opcjonalnie pobiera pozostałe z samego LAPACK, aby utworzyć pełną implementację LAPACK w zbudowanych plikach biblioteki ATLAS.
Andrew Janke
1
@Noah_S Nie ma sprzeczności, każda biblioteka ma API, które umożliwia reimplementację rzeczywistej funkcjonalności przy zachowaniu kompatybilności z API i tak właśnie stało się z LAPACK.
Andrey
17

ATLAS jest już dość przestarzały. Został opracowany w czasie, gdy uważano, że optymalizacja BLAS dla różnych platform wykracza poza możliwości ludzi, w wyniku czego autogeneracja i autotuning były drogą do zrobienia.

Na początku XXI wieku pojawił się Kazushige Goto, który pokazał, jak bardzo wydajne implementacje można kodować ręcznie. Możesz cieszyć się interesującym artykułem w New York Times: https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human- computer-keeps.html .

Kazushige z jednej strony miał lepszy wgląd w teorię stojącą za wysokowydajnymi implementacjami mnożenia macierzy, az drugiej strony lepiej je zaprojektował. Jego podejście, które na obecnych procesorach jest zwykle najbardziej wydajne, nie znajduje się w przestrzeni wyszukiwania autotune ATLAS. Dlatego ATLAS jest z natury gorszy. Wdrożenie BLAS przez Kazushige stało się znane jako GotoBLAS. Został rozwidlony jako OpenBLAS, kiedy dołączył do przemysłu.

Pomysły stojące za GotoBLAS zostały przeformułowane w nową implementację, podobną do BLAS strukturę Library Instantiation Software (BLIS) ( https://github.com/flame/blis ), która implementuje te same algorytmy, ale strukturyzuje kod tak, aby mniej musi zostać zaimplementowany na zamówienie dla nowej architektury. BLIS jest kodowany w C.

Ta dyskusja pokazuje, że istnieje wiele implementacji BLAS. Same BLAS są de facto standardem interfejsu. ATLAS był kiedyś supernowoczesny. Nie jest już dłużej.

Robert van de Geijn
źródło
0

O ile mi wiadomo, i po przejrzeniu repozytorium ATLAS wydaje się, że zawiera on ponowną implementację BLAS-a w C. Jest w tym trochę więcej, ale mam nadzieję, że odpowiada na pytanie.

cdcdcd
źródło