Welche Beziehung besteht zwischen BLAS, LAPACK und ATLAS?

142

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!

Makhlaghi
quelle
3
Siehe auch scicomp.stackexchange.com/questions/8052/…
High Performance Mark

Antworten:

156

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.

Stephen Canon
quelle
Danke für die Erklärungen. Kennen Sie Beispiele für die Verwendung von ATLAS + LAPACK? Ich brauche ein paar Beispiele, um zu verstehen, wie man diese benutzt! Ich verstehe, wofür sie sind und was sie tun, aber ich kann in C kaum Beispiele finden, wie man sie in die Praxis umsetzt.
Makhlaghi
1
@astroboy: Kannst du mir ein paar Informationen darüber geben, was du eigentlich versuchst? LAPACK ist besonders eine riesige Bibliothek.
Stephen Canon
Nehmen wir zur Vereinfachung an, ich habe eine Matrix und möchte sie mit einem bestimmten Wert multiplizieren. Wie kann ich ATLAS und (LAPACK oder BLAS) in C kombinieren? Ich möchte nur sehen, wie eine dieser Funktionen implementiert wird. Es gibt einige Beispiele in netlib.org/lapack/lapacke.html, aber ATLAS wird nicht erwähnt!
Makhlaghi
Gibt es etwas wie BLAS, LAPACK oder MKL, das transparent mit Objekten arbeiten kann, die viel größer als der Speicher sind?
Skan
1
@ MinhNghĩa: Es gibt einen Standard, netlib.org/blas/blast-forum , aber (a) es gibt keine Durchsetzung - ein Standard ohne Testsuite ist nicht wirklich ein Standard - und (b) ich glaube nicht dass jeder den vollständigen Satz von Schnittstellen implementiert, die in diesem Dokument beschrieben werden. Es ist ehrgeizig.
Stephen Canon
40

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ür BLAS, LAPACKund andere grundlegende APIs, 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önnten BLAS, 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++und gfortran) kompiliert werden können . Ich habe MakeFiles erstellt, die Sie lesen können, um zu erfahren, wie Sie einzelne Fortran/FORTRANRoutinen in einem Coder einem C++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: BLASund LAPACKsind eher APIs nicht spezifisch SDKs. Sie sind lediglich eine Liste von Spezifikationen oder Spracherweiterungen und keine Implementierungen oder Bibliotheken. Trotzdem gibt es Originalimplementierungen von Netlib in FORTRAN 77, auf die sich die meisten Leute (verwirrend!) Beziehen , wenn sie über BLASund sprechen LAPACK. Also , wenn Sie eine Menge seltsamer Dinge sehen , wenn diese unter Verwendung von APIs ist , weil Sie eigentlich Aufruf wurden FORTRANRoutinen in Canstatten CBibliotheken und Funktionen. ATLASund OpenBLASsind einige der besten Implementierungen von BLASund LACPACKsoweit ich weiß. Sie entsprechen dem Original API, obwohl sie meines Wissens implementiert sindC/C++von Grund auf neu (nicht sicher!). Es gibt GPGPU Implementierungen der APIs mit OpenCL: 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 BLASund LAPACKin Clernen FORTRAN-Cmö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!

Foad
quelle
Die Wikipedia-Seite für LAPACK beginnt mit "LAPACK (Linear Algebra Package) ist eine Standard-Softwarebibliothek". Wollen Sie damit sagen, dass dies falsch ist, da es sich um eine API-Spezifikation und nicht um eine Implementierung handelt?
Noah_S
1
Nach einigen Recherchen scheinen LAPACK und BLAS tatsächlich Implementierungen zu sein. Aus der FAL von NetLib zu BLAS: "Die BLAS (Basic Linear Algebra Subprograms) sind Routinen, die Standardbausteine ​​für die Ausführung grundlegender Vektor- und Matrixoperationen bereitstellen." Auf der GitHub-Seite von LAPACK: "LAPACK ist eine Bibliothek von Fortran-Subroutinen". Auf dieser Grundlage und beim Lesen des GitHub-Projekts von LAPACK habe ich den Eindruck, dass BLAS und LAPACK tatsächlich Implementierungen sind. LAPACK baut auf BLAS auf, um komplexere Funktionen bereitzustellen.
Noah_S
1
@Noah_S Ich würde Wikipedia nicht als "Referenz" verwenden, aber meines Wissens gibt es mehrere Implementierungen von LAPACK. Ich denke, es als API zu bezeichnen, ist jetzt genauer. aber bitte korrigieren Sie mich, wenn ich falsch liege.
Foad
2
Ich denke, ein Teil der Verwirrung ist, dass BLAS eine API / Spezifikation ist, aber es gibt auch eine "Referenzimplementierung" von BLAS (von Netlib), die auch nur als "BLAS-Bibliothek" bezeichnet wird. Wenn Leute BLAS sagen, meinen sie normalerweise die API, da die Referenzimplementierung nicht optimiert ist und daher in der Praxis / Industrie nicht viel verwendet wird. ATLAS bietet eine optimierte Implementierung einiger LAPACK-Unterroutinen und zieht dann optional den Rest von LAPACK selbst ab, um eine vollständige LAPACK-Implementierung in den erstellten ATLAS lib-Dateien zu erstellen.
Andrew Janke
1
@Noah_S Es gibt keinen Widerspruch, jede Bibliothek verfügt über eine API, die es ermöglicht, die eigentliche Funktionalität neu zu implementieren, während die API-kompatibel bleibt, und genau das ist mit LAPACK geschehen.
Andrey
17

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.

Robert van de Geijn
quelle
0

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.

cdcdcd
quelle