Bibliotheken zu linearer Algebra
Einführung
BLAS (Basic Linear Algebra Subprograms) und LAPACK (Linear Algebra PACKage) sind Routinen, die Standardbausteine für eine Vielzahl von Operationen der linearen Algebra bereitstellen. Stabile Referenzimplementierungen in Fortran mit C-Schnittstellen (CBLAS bzw. LAPACKE) sind unter Netlib verfügbar. Darüber hinaus existieren mehrere optimierte Implementierungen, die schnelle Teilmengen dieser APIs bereitstellen.
Verfügbare Implementierungen
-
blas,lapack- Netlibs Referenzimplementierung der Fortran- und C-Schnittstellen. -
atlas- „Automatically Tuned Linear Algebra Software“. -
blis- „BLAS-like Library Instantiation Software“-Framework. -
openblas- OpenBLAS, ein optimiertes BLAS, basierend auf GotoBLAS2.
ATLAS, BLIS und OpenBLAS bieten BLAS und eine Teilmenge von LAPACK. Sowohl BLIS als auch OpenBLAS bieten mehrere Varianten: eine sequenzielle Version, eine Thread-Version und eine weitere mit OpenMP-Unterstützung (alle mit oder ohne Unterstützung für 64-Bit-Ganzzahlen).
Aufgrund von Implementierungsunterschieden ist es wichtig, dass alle Komponenten eines bestimmten Software-Stacks auf dieselbe BLAS/LAPACK-Implementierung verlinken. Darüber hinaus möchten Benutzer möglicherweise eine bestimmte Implementierung wählen, die für sie zur Laufzeit am besten geeignet ist. Diese Richtlinie bietet eine Struktur, die das erste erzwingt und gleichzeitig das zweite ermöglicht. Außerdem stellt sie einen transparenten Fallback-Mechanismus zur Netlib-Referenzimplementierung für diejenigen Symbole bereit, die nicht im ausgewählten Backend über FlexiBLAS enthalten sind.
BLAS/LAPACK-Wrapper
FlexiBLAS ist ein Framework, das die BLAS- und LAPACK-APIs in einer einzigen Bibliothek kapselt. BLAS/LAPACK-Nutzer müssen gegen FlexiBLAS linken. Dieser Wrapper leitet Aufrufe mit minimalem Overhead an ein ausgewähltes, optimiertes Backend weiter. Zudem bietet er einen transparenten Fallback auf die Referenzimplementierung von Netlib, falls ein bestimmtes Symbol im ausgewählten Backend nicht vorhanden ist. Die wichtigsten Funktionen sind:
-
Bietet eine vollständig BLAS- und LAPACK-kompatible ABI/API mit Schnittstellen für 32- und 64-Bit-Ganzzahlen.
-
Über eine Umgebungsvariable austauschbares BLAS- und LAPACK-Backend zur Laufzeit ohne Neukompilierung.
-
Integration von benutzereigenen BLAS-Bibliotheken ohne Administratorrechte, sogar in systemweit installierten Programmen.
-
Funktioniert mit OpenBLAS, ATLAS und BLIS sowie mit unfreien Alternativen wie Intel MKL, ACML …
-
Flexible Konfigurationsdateien pro System/Benutzer/Host.
-
Grundlegende Profiling-Unterstützung.
|
Fedora liefert |
Erstellen von BLAS/LAPACK-abhängigen Paketen
Nutzer von Teilmengen von BLAS und/oder LAPACK MÜSSEN gegen FlexiBLAS kompilieren (falls nicht unterstützt: siehe unten).
|
Ausnahmen
|
Bauabhängigkeiten
Zunächst einmal MUSS nur das Entwicklungspaket von FlexiBLAS in BuildRequires aufgeführt werden:
BuildRequires: flexiblas-devel
Dadurch werden alle notwendigen Entwicklungsdateien sowohl für die 32-Bit-Schnittstelle (die am häufigsten verwendet wird) als auch für die 64-Bit-Ganzzahl-Schnittstelle bereitgestellt.
|
Wenn das Paket nur die Schnittstelle für 64-Bit-Ganzzahlen unterstützt, müssen 32-Bit-Architekturen ausgeschlossen werden (siehe Architekturspezifische Laufzeit- und Bauabhängigkeiten). |
Konfiguration
Der Paketierer MUSS, falls zutreffend, flexiblas oder flexiblas64 (für die 32-Bit- bzw. 64-Bit-Schnittstelle) als Namen der BLAS- und LAPACK-Bibliotheken angeben. Pakete, die pkg-config verwenden, erhalten dann automatisch die korrekten Flags für die Header und Bibliotheken. Ebenso erkennen und konfigurieren CMake-basierte Projekte, die FindBLAS verwenden, die korrekten Flags für FlexiBLAS automatisch (ab CMake v3.19), sodass kein weiteres Eingreifen des Paketierers erforderlich ist.
Leider bieten viele Upstream-Projekte heterogene Zugriffsmethoden für diese APIs. Im Idealfall definiert das Build-Framework spezifische Optionen, um die BLAS- und/oder LAPACK-Bibliotheken explizit festzulegen. Häufiger muss der Paketierer jedoch sicherstellen, dass %{_includedir}/flexiblas und %{_libdir}/flexiblas (oder %{_includedir}/flexiblas64 und %{_libdir}/flexiblas64) als Header- und Bibliothekspfade in den entsprechenden Flags und Konfigurationsdateien angegeben werden und/oder -lflexiblas (oder -lflexiblas64) an den Linker übergeben wird. In seltenen Fällen MÜSSEN fest codierte Pfade in Quelldateien angepasst werden, und Patches KÖNNEN erforderlich sein. Der Paketierer sollte mit dem Upstream-Projekt zusammenarbeiten, um die Erkennung und Konfiguration dieser Bibliotheken zu standardisieren.
|
Um sicherzustellen, dass das Programm ordnungsgemäß gegen FlexiBLAS gelinkt wurde, MUSS der Paketierer überprüfen, ob die |
Tests
Optimierte BLAS/LAPACK-Backends sind deutlich schneller als die Referenzimplementierung von Netlib, die Ergebnisse können dadurch jedoch leicht variieren. Daher können Tests (mit zu engen Toleranzen) fehlschlagen. In diesen Fällen SOLLTE der Paketierer die Referenzimplementierung im Abschnitt %check wie folgt aktivieren:
export FLEXIBLAS=netlib
oder alternativ über FLEXIBLAS64 für Builds mit 64-Bit-Ganzzahlen.
Backend-Auswahl
Auswahl auf Systemebene
Ein mit FlexiBLAS kompiliertes Paket verwendet das entsprechende Teilpaket flexiblas-netlib(64), welches wiederum das standardmäßig optimierte Backend (d.h. flexiblas-openblas-openmp(64)) benötigt. Dies wird über den Schlüssel „default=IMPLEMENTIERUNGSNAME“ (standardmäßig default=openblas-openmp), der in der Hauptkonfigurationsdatei in den Haupt-Teilpaketen festgelegt ist, %{_sysconfdir}/flexiblasrc und %{_sysconfdir}/flexiblas64rc.
Um die Auswahl anderer BLAS/LAPACK-Implementierungen auf Systemebene zu ermöglichen, müssen zunächst weitere Backends installiert werden (z. B. flexiblas-atlas, flexiblas-blis-serial …). Anschließend können diese systemweit über das Befehlszeilenwerkzeug`flexiblas` oder durch manuelles Ändern des Schlüssels „default“ in der Konfigurationsdatei ausgetauscht werden.
Auswahl auf Benutzerebene
Die dauerhafte Auswahl von systemseitig bereitgestellten BLAS/LAPACK-Implementierungen auf Benutzerebene kann über das Befehlszeilenwerkzeug erfolgen:
$ flexiblas set IMPLEMENTATION-NAME $ flexiblas64 set IMPLEMENTATION-NAME
vorausgesetzt, das Teilpaket für IMPLEMENTIERUNGSNAME ist installiert.
Eine flüchtige Auswahl auf Benutzerebene kann über eine Umgebungsvariable ausgelöst werden:
$ FLEXIBLAS=IMPLEMENTATION-NAME ./yourapp $ FLEXIBLAS64=IMPLEMENTATION-NAME ./yourapp64
Die Auswahl von benutzerdefinierten BLAS/LAPACK-Bibliotheken kann auf Benutzerebene ganz einfach durch Ersetzen von IMPLEMENTIERUNGSNAME durch den Pfad zu einer beliebigen benutzerdefinierten, BLAS/LAPACK-kompatiblen Bibliothek in den obigen Beispielen erreicht werden.
Want to help? Learn how to contribute to Fedora Docs ›