Ich verstehe nicht, wie BLAS, LAPACK und ATLAS zusammenhängen und wie ich sie zusammen verwenden soll! Ich habe alle ihre Handbücher durchgesehen und habe eine allgemeine Vorstellung von BLAS und LAPACK und wie man sie mit den wenigen Beispielen verwendet, die ich finde, aber ich kann keine tatsächlichen Beispiele finden, die ATLAS verwenden, um zu sehen, wie es zusammenhängt diese zwei.
Ich versuche, auf niedriger Ebene an Matrizen zu arbeiten, und meine Hauptsprache ist C. Zuerst wollte ich GSL verwenden, aber es heißt, wenn Sie die beste Leistung erzielen möchten, sollten Sie BLAS und ATLAS verwenden. Gibt es eine gute Webseite mit einigen schönen Beispielen, wie man diese (in C) zusammen verwendet? Mit anderen Worten, ich suche nach einem Tutorial zur Verwendung dieser drei (oder einer beliebigen Teilmenge davon!). Kurz gesagt, ich bin verwirrt!
Antworten:
BLAS ist eine Sammlung von Matrix- und Vektorarithmetikoperationen auf niedriger Ebene ("Multiplizieren eines Vektors mit einem Skalar", "Multiplizieren von zwei Matrizen und Addieren zu einer dritten Matrix" usw.).
LAPACK ist eine Sammlung übergeordneter linearer Algebraoperationen. Dinge wie Matrixfaktorisierungen (LU, LLt, QR, SVD, Schur usw.), die verwendet werden, um Dinge wie "Finden der Eigenwerte einer Matrix" oder "Finden der Singularwerte einer Matrix" oder "Lösen eines linearen Systems" auszuführen ”. LAPACK ist auf dem BLAS aufgebaut; Viele Benutzer von LAPACK verwenden nur die LAPACK-Schnittstellen und müssen sich der BLAS überhaupt nicht bewusst sein. LAPACK wird im Allgemeinen separat von BLAS kompiliert und kann jede hochoptimierte BLAS-Implementierung verwenden, die Ihnen zur Verfügung steht.
ATLAS ist eine tragbare, einigermaßen gute Implementierung der BLAS-Schnittstellen, die auch einige der am häufigsten verwendeten LAPACK-Operationen implementiert.
Was Sie verwenden sollten, hängt in gewissem Maße davon ab, was Sie tun möchten und welche Plattform Sie verwenden. Mit „ATLAS + LAPACK verwenden“ werden Sie jedoch nicht zu weit falsch liegen.
quelle
Vor einiger Zeit, als ich dabei einige der linearen Algebra begann
C
, kam es mir als Überraschung dort zu sehen gibt so wenige Tutorials fürBLAS
,LAPACK
und andere grundlegendeAPI
s, trotz der Tatsache , dass sie irgendwie die Eckpfeiler vieler anderer Bibliotheken sind. Aus diesem Grund begann ich alle Beispiele / Tutorials Sammeln ich alle über das Internet für nicht finden könntenBLAS
,CBLAS
,LAPACK
,CLAPACK
,LAPACKE
,ATLAS
,OpenBLAS
... in diesem Github Repo .Nun, ich sollte Sie warnen, dass ich als Maschinenbauingenieur wenig Erfahrung mit der Verwaltung eines solchen Git-Repositorys oder GitHubs habe. Es wird euch zunächst als komplettes Durcheinander erscheinen. Wenn Sie es jedoch schaffen, die chaotische Struktur zu überwinden, finden Sie alle möglichen Beispiele und Anweisungen, die hilfreich sein können. Ich habe die meisten von ihnen ausprobiert, um sicherzugehen, dass sie kompiliert werden. Und diejenigen, die nicht kompilieren, habe ich erwähnt. Ich habe viele davon so geändert, dass sie mit
GNU compilers
(gcc
,g++
undgfortran
) kompiliert werden können . Ich habeMakeFile
s erstellt, die Sie lesen können, um zu erfahren, wie Sie einzelneFortran/FORTRAN
Routinen in einemC
oder einemC++
Programm aufrufen können . Ich habe auch einige Installationsanweisungen für Mac und Linux (sorry Windows Jungs!). Ich habe auch einige gemachtbash
.sh
Dateien zum automatischen Kompilieren einiger dieser Bibliotheken.Aber gehen Sie zu Ihrer anderen Frage:
BLAS
undLAPACK
sind eherAPI
s nicht spezifischSDK
s. Sie sind lediglich eine Liste von Spezifikationen oder Spracherweiterungen und keine Implementierungen oder Bibliotheken. Trotzdem gibt es Originalimplementierungen von Netlib inFORTRAN 77
, auf die sich die meisten Leute (verwirrend!) Beziehen , wenn sie überBLAS
und sprechenLAPACK
. Also , wenn Sie eine Menge seltsamer Dinge sehen , wenn diese unter Verwendung vonAPI
s ist , weil Sie eigentlich Aufruf wurdenFORTRAN
Routinen inC
anstattenC
Bibliotheken und Funktionen.ATLAS
undOpenBLAS
sind einige der besten Implementierungen vonBLAS
undLACPACK
soweit ich weiß. Sie entsprechen dem OriginalAPI
, obwohl sie meines Wissens implementiert sindC/C++
von Grund auf neu (nicht sicher!). Es gibt GPGPU Implementierungen derAPI
s mitOpenCL
: CLBlast , clBLAS , clMAGMA , ArrayFire und ViennaCL einige zu nennen. Es gibt auch herstellerspezifische Implementierungen, die für bestimmte Hardware oder Plattform optimiert sind. Ich rate daher dringend davon ab, sie zu verwenden.Meine Empfehlung an alle, die mit
BLAS
undLAPACK
inC
lernenFORTRAN-C
möchten, ist, zuerst gemischte Programmierung zu lernen . Das erste Kapitel des erwähnten Repos ist dieser Angelegenheit gewidmet und dort habe ich viele verschiedene Beispiele gesammelt.PS Ich habe von Zeit zu Zeit am Entwicklungszweig des Repositorys gearbeitet . Es scheint etwas weniger chaotisch!
quelle
ATLAS ist mittlerweile ziemlich veraltet. Es wurde zu einer Zeit entwickelt, als man glaubte, dass die Optimierung des BLAS für verschiedene Plattformen außerhalb der Möglichkeiten des Menschen liegt, und daher war Autogeneration und Autotuning der richtige Weg.
In den frühen 2000er Jahren kam Kazushige Goto, der zeigte, wie hocheffiziente Implementierungen von Hand codiert werden können. Sie können einen interessanten Artikel in der New York Times genießen: https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human- computer-keeps.html .
Kazushiges hatte einerseits bessere Einblicke in die Theorie hinter Hochleistungsimplementierungen der Matrix-Matrix-Multiplikation und entwickelte diese andererseits besser. Sein Ansatz, der auf aktuellen CPUs normalerweise die höchste Leistung erbringt, befindet sich nicht im Suchbereich, den ATLAS automatisch abstimmt. Daher ist ATLAS von Natur aus minderwertig. Kazushiges Implementierung der BLAS wurde als GotoBLAS bekannt. Es wurde als OpenBLAS gegabelt, als er in die Industrie eintrat.
Die Ideen hinter dem GotoBLAS wurden in eine neue Implementierung umgestaltet, das BLAS-ähnliche BLIS-Framework (Library Instantiation Software) ( https://github.com/flame/blis ), das dieselben Algorithmen implementiert, den Code jedoch so strukturiert, dass weniger muss für eine neue Architektur benutzerdefiniert implementiert werden. BLIS ist in C codiert.
Diese Diskussion zeigt, dass es viele Implementierungen des BLAS gibt. Die BLAS selbst sind de facto ein Standard für die Schnittstelle. ATLAS war einst Stand der Technik. Es ist nicht länger.
quelle
Soweit mir bekannt ist und nachdem ich das ATLAS-Repository durchgearbeitet habe, scheint es eine Neuimplementierung von BLAS in C zu beinhalten. Es steckt noch ein bisschen mehr dahinter, aber ich hoffe, es beantwortet die Frage.
quelle