Qual è la relazione tra BLAS, LAPACK e ATLAS


143

Non capisco come BLAS, LAPACK e ATLAS siano correlati e come dovrei usarli insieme! Ho esaminato tutti i loro manuali e ho un'idea generale di BLAS e LAPACK e di come usarli con i pochissimi esempi che trovo, ma non riesco a trovare alcun esempio reale usando ATLAS per vedere come è correlato questi due.

Sto cercando di fare un lavoro di basso livello sulle matrici e la mia lingua principale è C. Innanzitutto volevo usare GSL, ma dice che se vuoi le migliori prestazioni dovresti usare BLAS e ATLAS. C'è qualche buona pagina web che fornisce alcuni esempi di come usare questi (in C) tutti insieme? In altre parole, sto cercando un tutorial sull'uso di questi tre (o di qualsiasi loro sottoinsieme!). Insomma sono confuso!


Risposte:


156

BLAS è una raccolta di matrici di basso livello e operazioni aritmetiche vettoriali ("moltiplica un vettore per uno scalare", "moltiplica due matrici e aggiungi a una terza matrice", ecc ...).

LAPACK è una raccolta di operazioni di algebra lineare di livello superiore. Cose come fattorizzazioni di matrici (LU, LLt, QR, SVD, Schur, ecc.) Che vengono utilizzate per fare cose come "trova gli autovalori di una matrice" o "trova i valori singolari di una matrice" o "risolvi un sistema lineare ”. LAPACK è costruito sopra il BLAS; molti utenti di LAPACK utilizzano solo le interfacce LAPACK e non devono mai essere consapevoli del BLAS. LAPACK è generalmente compilato separatamente dal BLAS e può utilizzare qualsiasi implementazione BLAS altamente ottimizzata disponibile.

ATLAS è un'implementazione portatile ragionevolmente buona delle interfacce BLAS, che implementa anche alcune delle operazioni LAPACK più comunemente usate.

Ciò che "dovresti usare" dipende in qualche modo dai dettagli di ciò che stai cercando di fare e della piattaforma che stai utilizzando. Tuttavia, non andrai troppo lontano con "usa ATLAS + LAPACK".


Grazie per le spiegazioni Conosci qualche esempio di COME usare ATLAS + LAPACK? Ho bisogno di vedere alcuni esempi per capire come usarli! Capisco a cosa servono e la teoria di ciò che fanno, ma non riesco quasi a trovare esempi in C su come implementarli nella pratica.
makhlaghi,

1
@astroboy: puoi darmi alcune informazioni su ciò che stai effettivamente cercando di fare? LAPACK in particolare è un'enorme biblioteca.
Stephen Canon,

Per semplicità, diciamo che ho una matrice e voglio moltiplicarla per un certo valore. Come posso fare questo combinando ATLAS e (LAPACK o BLAS) in C? Voglio solo vedere come implementare una di queste funzioni. Ci sono alcuni esempi in netlib.org/lapack/lapacke.html ma non si fa menzione di ATLAS!
makhlaghi,

Esiste qualcosa come BLAS, LAPACK o MKL in grado di funzionare in modo trasparente con oggetti molto più grandi della memoria?
skan

1
@ MinhNghĩa: esiste uno standard, netlib.org/blas/blast-forum , ma (a) non c'è applicazione - uno standard senza una suite di test non è in realtà uno standard - e (b) non credo che chiunque implementa la serie completa di interfacce descritte da quel documento. E 'aspirazionale.
Stephen Canon,

40

Mentre fa, quando ho iniziato a fare un po 'di algebra lineare C, mi è sembrato una sorpresa vedere che ci sono così pochi tutorial per BLAS, LAPACKe altri fondamentali API, nonostante siano in qualche modo i cardini di molte altre biblioteche. Per questo motivo ho iniziato a raccogliere tutti gli esempi / tutorial che ho trovato tutti su Internet per BLAS, CBLAS, LAPACK, CLAPACK, LAPACKE, ATLAS, OpenBLAS... in questo repo GitHub .

Bene, dovrei avvertirti che come ingegnere meccanico ho poca esperienza nella gestione di un repository git o GitHub. Per prima cosa sembrerà un casino completo per voi ragazzi. Tuttavia, se riesci a superare la struttura disordinata, troverai tutti i tipi di esempi e istruzioni che potrebbero essere di aiuto. Ho provato la maggior parte di loro, per essere sicuro che si compilino. E quelli che non compilano ho citato. Ho modificato molti di loro per essere compilabili con GNU compilers( gcc, g++e gfortran). Ho creato messaggi MakeFileche puoi leggere per sapere come chiamare singole Fortran/FORTRANroutine in un Co C++programma. Ho anche messo alcune istruzioni di installazione per Mac e Linux (scusate ragazzi di Windows!). Ne ho anche fatti alcunibash .sh file per la compilazione automatica di alcune di queste librerie.

Ma vai alla tua altra domanda: BLASe non LAPACKsono piuttosto APIspecifici SDK. Sono solo un elenco di specifiche o estensioni di linguaggio piuttosto che implementazioni o librerie. Detto questo, ci sono implementazioni originali di Netlib in FORTRAN 77, che la maggior parte delle persone si riferiscono a (confusamente!) Quando si parla di BLASe LAPACK. Quindi se vedi molte cose strane quando usi questi messaggi APIè perché in realtà chiamavi FORTRANroutine Cpiuttosto che Clibrerie e funzioni. ATLASe OpenBLASsono alcune delle migliori implementazioni di BLASe LACPACKper quanto ne so. Sono conformi all'originaleAPI , anche se, per quanto ne so, sono implementatiC/C++da zero (non sono sicuro!). Ci sono implementazioni GPGPU degli utenti APIche usano OpenCL: CLBlast , clBLAS , clMAGMA , ArrayFire e ViennaCL per citarne alcuni. Esistono anche implementazioni specifiche del fornitore ottimizzate per hardware o piattaforma specifici, che scoraggio fortemente chiunque a usarle.

La mia raccomandazione a chiunque voglia imparare usando BLASe LAPACKin Cè di imparare FORTRAN-Cprima la programmazione mista. Il primo capitolo del repository menzionato è dedicato a questo argomento e lì ho raccolto molti esempi diversi.

PS Ho lavorato sul ramo dev del repository di volta in volta. Sembra leggermente meno disordinato!


La pagina di Wikipedia per LAPACK inizia con "LAPACK (Linear Algebra Package) è una libreria software standard". Stai dicendo che non è corretto, dal momento che è una specifica API e non un'implementazione?
Noah_S,

1
Dopo alcune ricerche sembra che LAPACK e BLAS siano in realtà implementazioni. Dalla faq di NetLib su BLAS: "I BLAS (sottoprogrammi di algebra lineare di base) sono routine che forniscono blocchi standard per eseguire operazioni di base su vettori e matrici". Dalla pagina GitHub di LAPACK: "LAPACK è una libreria di subroutine Fortran". Sulla base di ciò, e leggendo il progetto GitHub di LAPACK, la mia impressione è che BLAS e LAPACK siano in realtà implementazioni - LAPACK si basa su BLAS per fornire funzionalità più sofisticate.
Noah_S,

1
@Noah_S Non avrei usato Wikipedia come "il" riferimento, ma per mia conoscenza limitata, ci sono diverse implementazioni di LAPACK. Penso che chiamarlo API sia ora più preciso. ma per favore correggimi se sbaglio.
Foad

2
Penso che parte della confusione sia che BLAS sia un'API / specifica, ma esiste anche una "Implementazione di riferimento" di BLAS (da Netlib) che viene anche definita semplicemente "libreria BLAS". Di solito quando le persone dicono BLAS intendono l'API, perché l'implementazione di riferimento non è ottimizzata, quindi non viene utilizzata molto nella pratica / nell'industria. ATLAS fornisce un'implementazione ottimizzata di alcune delle subroutine LAPACK, quindi estrae facoltativamente le altre da LAPACK stesso per produrre un'implementazione LAPACK completa nei file lib ATLAS compilati.
Andrew Janke,

1
@Noah_S Non c'è contraddizione, ogni libreria ha un'API, che consente di reimplementare la funzionalità effettiva rimanendo compatibile con l'API e questo è ciò che è accaduto con LAPACK.
Andrey,

17

ATLAS è ormai abbastanza obsoleto. È stato sviluppato in un momento in cui si pensava che l'ottimizzazione del BLAS per varie piattaforme andasse oltre le capacità degli umani e, di conseguenza, l'autogenerazione e l'autotuning erano la strada da percorrere.

All'inizio degli anni 2000, arrivò Kazushige Goto, che mostrò come implementazioni altamente efficienti possono essere codificate manualmente. Puoi leggere un interessante articolo sul New York Times: https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human- computer-keep.html .

Kazushige da un lato aveva una migliore comprensione della teoria alla base delle implementazioni ad alte prestazioni della moltiplicazione matrice-matrice, e dall'altro lato ha progettato meglio queste. Il suo approccio, che sulle attuali CPU è di solito il più performante, non è nello spazio di ricerca che ATLAS esegue automaticamente. Quindi, ATLAS è intrinsecamente inferiore. L'implementazione di Kazushige del BLAS divenne nota come GotoBLAS. Fu biforcuta come OpenBLAS quando si unì all'industria.

Le idee alla base di GotoBLAS sono state trasformate in una nuova implementazione, il framework BLIS (Library Instantiation Software) simile a BLAS ( https://github.com/flame/blis ), che implementa gli stessi algoritmi, ma struttura il codice in modo che meno deve essere personalizzato per una nuova architettura. BLIS è codificato in C.

Ciò che questa discussione mostra è che ci sono molte implementazioni del BLAS. I BLAS stessi sono di fatto uno standard per l'interfaccia. ATLAS era una volta lo stato dell'arte. Non è più.


0

Per quanto ne so, e dopo aver esaminato il repository ATLAS, sembra che includa una reimplementazione di BLAS in C. C'è un po 'di più, ma spero che risponda alla domanda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.