Wie ist die Beziehung zwischen BLAS, LAPACK und ATLAS

Lesezeit: 8 Minuten

Benutzeravatar von makhlaghi
Makhlaghi

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 damit zusammenhängt diese zwei.

Ich versuche, an Matrizen auf niedrigem Niveau zu arbeiten, und meine Hauptsprache ist C. Zuerst wollte ich GSL verwenden, aber es heißt, dass Sie BLAS und ATLAS verwenden sollten, wenn Sie die beste Leistung erzielen möchten. Gibt es eine gute Webseite, die einige nette Beispiele dafür gibt, wie man diese (in C) alle zusammen verwendet? Mit anderen Worten, ich suche nach einem Tutorial zur Verwendung dieser drei (oder einer Teilmenge davon!). Kurz gesagt, ich bin verwirrt!

Benutzeravatar von Stephen Canon
Stefan Kanon

BLAS ist eine Sammlung von Matrix- und Vektorarithmetikoperationen auf niedriger Ebene („Multiplizieren Sie einen Vektor mit einem Skalar“, „Multiplizieren Sie zwei Matrizen und addieren Sie zu einer dritten Matrix“ usw.).

LAPACK ist eine Sammlung von linearen Algebra-Operationen auf höherer Ebene. Dinge wie Matrixfaktorisierungen (LU, LLt, QR, SVD, Schur usw.), die verwendet werden, um Dinge wie „Finde die Eigenwerte einer Matrix“ oder „Finde die singulären Werte einer Matrix“ oder „Löse ein lineares System“ zu tun “. LAPACK wird auf dem BLAS gebaut; viele Benutzer von LAPACK nur Verwenden Sie die LAPACK-Schnittstellen und müssen Sie 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 etwas von den Details dessen ab, was Sie zu tun versuchen und welche Plattform Sie verwenden. Mit „ATLAS + LAPACK verwenden“ machen Sie jedoch nicht viel falsch.

  • Danke für die Erläuterungen. Kennen Sie Beispiele für die Verwendung von ATLAS+LAPACK? Ich muss ein paar Beispiele sehen, um zu verstehen, wie man diese benutzt! Ich verstehe, wofür sie sind und die Theorie, was sie tun, aber ich kann kaum Beispiele in C finden, wie man sie in die Praxis umsetzt.

    – Makhlaghi

    25. Juli 2013 um 12:47 Uhr


  • @astroboy: kannst du mir ein paar Informationen darüber geben, was du eigentlich vorhast? LAPACK ist besonders ein enorm Bibliothek.

    – Stefan Kanon

    25. Juli 2013 um 12:48 Uhr

  • Nehmen wir der Einfachheit halber an, ich habe eine Matrix und möchte sie mit einem bestimmten Wert multiplizieren. Wie kann ich dies tun, indem ich ATLAS und (LAPACK oder BLAS) in C kombiniere? Ich möchte nur sehen, wie man eine dieser Funktionen implementiert. Ein paar Beispiele sind drin netlib.org/lapack/lapacke.html aber ATLAS wird nicht erwähnt!

    – Makhlaghi

    25. Juli 2013 um 12:54 Uhr


  • Ist BLAS eine Schnittstelle? Wie müssen alle BLAS-Implementierungen einer BLAS-Spezifikation entsprechen, damit sie austauschbar verwendet werden können? Soweit ich gelesen habe, gibt es keine offizielle BLAS-Schnittstelle, nur die Implementierung imitiert sich gegenseitig.

    – Minh Nghĩa

    9. November 2019 um 8:01 Uhr


  • @MinhNghĩa: Es gibt einen Standard, netlib.org/blas/blast-forum, aber (a) es gibt keine Durchsetzung – ein Standard ohne eine Testsuite ist nicht wirklich ein Standard – und (b) ich glaube nicht, dass irgendjemand den vollständigen Satz von Schnittstellen implementiert, die in diesem Dokument beschrieben werden. Es ist, äh, ehrgeizig.

    – Stefan Kanon

    10. November 2019 um 19:42 Uhr

Benutzeravatar von Foad S. Farimani
Foad S. Farimani

Vor einiger Zeit, als ich anfing, mich mit linearer Algebra zu beschäftigen Cwar ich überrascht, dass es so wenige Tutorials für gibt BLAS, LAPACK und andere grundlegende APIs, obwohl sie irgendwie die Eckpfeiler vieler anderer Bibliotheken sind. Aus diesem Grund habe ich angefangen, alle Beispiele/Tutorials zu sammeln, die ich im Internet finden konnte BLAS, CBLAS, LAPACK, CLAPACK, LAPACKE, ATLAS, OpenBLAS … in dieses 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 wie ein komplettes Durcheinander erscheinen. Wenn Sie es jedoch schaffen, die chaotische Struktur zu überwinden, finden Sie alle Arten von Beispielen und Anweisungen, die eine Hilfe sein könnten. Ich habe die meisten von ihnen ausprobiert, um sicherzugehen, dass sie kompilieren. Und diejenigen, die nicht kompilieren, habe ich erwähnt. Ich habe viele von ihnen so modifiziert, dass sie mit kompilierbar sind GNU compilers (gcc, g++ und gfortran). Ich habe gemacht MakeFiles, die Sie lesen können, um zu erfahren, wie Sie individuell anrufen können Fortran/FORTRAN Routinen in einem C oder C++ Programm. Ich habe auch einige Installationsanweisungen für Mac und Linux (sorry Windows-Leute!). Ich habe auch welche gemacht bash .sh Dateien für die automatische Kompilierung einiger dieser Bibliotheken.

Aber zu deiner anderen Frage: BLAS und LAPACK sind eher APIist nicht spezifisch SDKs. Sie sind nur eine Liste von Spezifikationen oder Spracherweiterungen und keine Implementierungen oder Bibliotheken. Abgesehen davon gibt es Originalimplementierungen von Netlib in FORTRAN 77auf die sich die meisten Leute (verwirrenderweise!) beziehen, wenn sie darüber sprechen BLAS und LAPACK. Wenn Sie also viele seltsame Dinge sehen, wenn Sie diese verwenden APIs liegt daran, dass Sie tatsächlich angerufen haben FORTRAN Routinen hinein C statt C Bibliotheken und Funktionen. ATLAS und OpenBLAS sind einige der besten Implementierungen von BLAS und LACPACK Soweit ich weiss. Sie entsprechen dem Original APIobwohl sie meines Wissens auf implementiert sind C/C++ von Grund auf neu (nicht sicher!). Es gibt GPGPU-Implementierungen der APIs verwendet OpenCL: CLBlast, clBLAS, clMAGMA, ArrayFire und WienCL um einige zu nennen. Es gibt auch herstellerspezifische Implementierungen, die für bestimmte Hardware oder Plattformen optimiert sind, und ich rate jedem dringend davon ab, sie zu verwenden.

Meine Empfehlung für alle, die lernen wollen, mit BLAS und LAPACK in C ist zu lernen FORTRAN-C gemischte Programmierung zuerst. Diesem Thema ist das erste Kapitel des erwähnten Repos gewidmet und dort habe ich viele verschiedene Beispiele gesammelt.

PS Ich habe daran gearbeitet der dev-Zweig des Repositorys von Zeit zu Zeit. Es scheint etwas weniger chaotisch!

  • Die Wikipedia-Seite für LAPACK beginnt mit “LAPACK (Linear Algebra Package) is a standard software library”. Wollen Sie damit sagen, dass das falsch ist, da es sich um eine API-Spezifikation und nicht um eine Implementierung handelt?

    – Noah_S

    17. August 2017 um 16:38 Uhr

  • Nach einiger Recherche scheint es, dass LAPACK und BLAS tatsächlich Implementierungen sind. Aus NetLibs FAQ zu BLAS: “Die BLAS (Basic Linear Algebra Subprograms) sind Routinen, die Standardbausteine ​​für die Durchführung grundlegender Vektor- und Matrixoperationen bereitstellen”. Von der GitHub-Seite von LAPACK: “LAPACK ist eine Bibliothek von Fortran-Subroutinen”. Basierend darauf 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 anspruchsvollere Funktionen bereitzustellen.

    – Noah_S

    17. August 2017 um 16:47 Uhr

  • @Noah_S Ich würde Wikipedia nicht als “die” Referenz verwenden, aber meines begrenzten Wissens gibt es mehrere Implementierungen von LAPACK. Ich denke, es ist jetzt genauer, es eine API zu nennen. aber korrigiert mich bitte, wenn ich falsch liege.

    – Foad S. Farimani

    17. August 2017 um 16:48 Uhr

  • Ich denke, ein Teil der Verwirrung besteht darin, dass BLAS eine API / Spezifikation ist, aber es gibt sie Auch eine “Referenzimplementierung” von BLAS (von Netlib), die auch nur als “BLAS-Bibliothek” bezeichnet wird. Wenn Leute BLAS sagen, meinen sie normalerweise die API, weil 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 die restlichen von LAPACK selbst ein, um eine vollständige LAPACK-Implementierung in den erstellten ATLAS-Bibliotheksdateien zu erzeugen.

    – Andreas Janke

    24. Januar 2019 um 10:19 Uhr

  • @Noah_S Es gibt keinen Widerspruch, jede Bibliothek hat eine API, die es ermöglicht, die eigentliche Funktionalität neu zu implementieren und gleichzeitig API-kompatibel zu bleiben, und genau das ist mit LAPACK passiert.

    – Andrej

    4. Mai 2020 um 9:35 Uhr

ATLAS ist mittlerweile ziemlich veraltet. Es wurde zu einer Zeit entwickelt, als man dachte, dass die Optimierung der BLAS für verschiedene Plattformen über die Fähigkeiten des Menschen hinausgehe, und daher sei die automatische Generierung und das automatische Tuning der richtige Weg.

In den frühen 2000er Jahren kam Kazushige Goto daher, der zeigte, wie hocheffiziente Implementierungen von Hand codiert werden können. Vielleicht gefällt Ihnen ein interessanter Artikel in der 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 hatte einerseits bessere Einblicke in die Theorie hinter Hochleistungsimplementierungen der Matrix-Matrix-Multiplikation und konstruierte diese andererseits besser. Sein Ansatz, der auf aktuellen CPUs normalerweise der leistungsstärkste ist, liegt nicht im Suchbereich, den ATLAS automatisch abstimmt. Daher ist ATLAS von Natur aus unterlegen. Kazushiges Implementierung des BLAS wurde als GotoBLAS bekannt. Es wurde als OpenBLAS abgezweigt, als er in die Industrie kam.

Die Ideen hinter GotoBLAS wurden in eine neue Implementierung umgestaltet, das BLAS-ähnliche Library Instantiation Software (BLIS) Framework (https://github.com/flame/blis), das die gleichen Algorithmen implementiert, aber den Code so strukturiert, dass für eine neue Architektur weniger angepasst werden muss. BLIS ist in C codiert.

Was diese Diskussion zeigt, ist, dass es viele Implementierungen der BLAS gibt. Die BLAS selbst sind ein De-facto-Standard für die Schnittstelle. ATLAS war einst der Stand der Technik. Es ist nicht länger.

Soweit mir bekannt ist und nachdem ich das ATLAS-Repository durchgearbeitet habe, scheint es eine Neuimplementierung von BLAS in C zu enthalten. Es steckt ein bisschen mehr dahinter, aber ich hoffe, es beantwortet die Frage.

1425170cookie-checkWie ist die Beziehung zwischen BLAS, LAPACK und ATLAS

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy