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!
Odpowiedzi:
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”.
źródło
Jakiś czas temu, kiedy zacząłem robić trochę algebry liniowej w
C
, przyszedł do mnie zaskoczeniem, aby zobaczyć tak mało tutoriale doBLAS
,LAPACK
i inne podstawoweAPI
s, 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 internecieBLAS
,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++
igfortran
). Zrobiłem te,MakeFile
które możesz przeczytać, aby dowiedzieć się, jak wywoływać poszczególneFortran/FORTRAN
procedury w programieC
lubC++
. 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:
BLAS
iLAPACK
raczejAPI
nie są to konkretne pytaniaSDK
. To tylko lista specyfikacji lub rozszerzeń językowych, a nie implementacje lub biblioteki. Mając to na uwadze , istnieją oryginalne implementacje Netlib w programieFORTRAN 77
, do których większość ludzi odnosi się ( myląco !), Gdy mówi oBLAS
iLAPACK
. Więc jeśli widzisz wiele dziwnych rzeczy podczas korzystania z tych funkcji,API
jest to spowodowane tym, że w rzeczywistości wywoływałeśFORTRAN
procedury,C
a nieC
biblioteki i funkcje.ATLAS
iOpenBLAS
są jednymi z najlepszych wdrożeńBLAS
iLACPACK
o ile wiem. Są zgodne z oryginałemAPI
, mimo że, o ile wiem, zostały zaimplementowaneC/C++
od zera (nie jestem pewien!). Istnieją implementacje GPGPUAPI
wykorzystująceOpenCL
: 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
BLAS
iLAPACK
in, najpierwC
nauczyć sięFORTRAN-C
programowania 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!
źródło
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.
źródło
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.
źródło