Consigli per una libreria di matrici C ++ veloce e utilizzabile?


158

Qualcuno ha consigli su una libreria di matrici C ++ veloce e utilizzabile?

Quello che intendo per usabile è il seguente:

  • Gli oggetti Matrix hanno un'interfaccia intuitiva (es .: posso usare righe e colonne durante l'indicizzazione)
  • Posso fare qualsiasi cosa con la classe matrix che posso fare con LAPACK e BLAS
  • API di facile apprendimento e utilizzo
  • Da installare relativamente indolore su Linux (uso Ubuntu 11.04 in questo momento)

Per me, l'usabilità è più importante della velocità o dell'utilizzo della memoria in questo momento, per evitare l'ottimizzazione prematura. Nello scrivere il codice, potrei sempre usare le matrici 1-D (o i vettori STL) e l'aritmetica dell'indice o del puntatore corretta per emulare una matrice, ma preferirei non farlo per evitare bug. Vorrei anche concentrare il mio sforzo mentale sul problema reale che sto cercando di risolvere e programmare nel dominio del problema, piuttosto che usare parte della mia attenzione limitata per ricordare tutti i piccoli trucchi di programmazione che ho usato per emulare le matrici come array e ricorda i comandi LAPACK, eccetera. Inoltre, meno codice devo scrivere e più è standardizzato, meglio è.

Il denso contro il rado non ha ancora importanza; alcune delle matrici di cui mi occuperò saranno scarse, ma non tutte. Tuttavia, se un pacchetto particolare gestisce bene matrici dense o sparse, vale la pena menzionarlo.

Anche il templating non conta molto per me, poiché lavorerò con tipi numerici standard e non dovrò memorizzare altro che doppi, float o ints. È carino, ma non necessario per quello che mi piacerebbe fare.


1
L'uso di CUDA è un'opzione?
lavagna a fogli mobili

1
Potrebbe essere, più tardi. In questo momento non mi interessa CUDA perché sto costruendo una libreria per un'applicazione in cui la moltiplicazione delle matrici è l'ultima delle mie preoccupazioni. La maggior parte dello sforzo sarà speso per chiamare un risolutore di programmi lineari a numero intero misto, quindi l'uso di CUDA sarebbe eccessivo. Dopo aver terminato la mia tesi, intendo esaminare algoritmi che sono algebrici più lineari pesanti e meno incentrati sull'ottimizzazione. Ti incoraggio sicuramente a pubblicare post sulle biblioteche CUDA, tuttavia, se hai esperienza con loro, perché sono sicuro che altre persone sarebbero interessate a conoscere i tuoi pensieri.
Geoff Oxberry,

Che dire di Intel MKL e IPP?
Royi,

Risposte:


146

Finora ho raccolto quanto segue dalla ricerca online:

Ho usato Armadillo un po ', e ho trovato l'interfaccia abbastanza intuitiva, ed è stato facile trovare pacchetti binari per Ubuntu (e presumo che siano altre distribuzioni Linux). Non l'ho compilato dalla fonte, ma la mia speranza è che non sia troppo difficile. Soddisfa la maggior parte dei miei criteri di progettazione e utilizza una densa algebra lineare. Può chiamare routine LAPACK o MKL. Generalmente non è necessario compilare Armadillo, è una libreria puramente basata su template: devi solo includere l'intestazione e il link a BLAS / LAPACK o MKL ecc.

Ho sentito cose positive su Eigen , ma non l'ho usato. Essa sostiene di essere veloce , utilizza template, e supporta algebra lineare denso. Non ha LAPACK o BLAS come dipendenza, ma sembra essere in grado di fare tutto ciò che LAPACK può fare (più alcune cose che LAPACK non può fare). Molti progetti usano Eigen, il che è promettente. Ha un pacchetto binario per Ubuntu, ma come libreria solo intestazione è banale usare anche altrove.

Anche Matrix Template Library versione 4 sembra promettente e utilizza il modello. Supporta algebra lineare sia densa che sparsa e può chiamare UMFPACK come risolutore rado. Le funzionalità non sono chiare dal loro sito Web. Ha un pacchetto binario per Ubuntu, scaricabile dal loro sito web.

PETSc , scritto da un team dell'Argonne National Laboratory, ha accesso a solutori lineari sparsi e densi, quindi presumo che possa funzionare come una libreria di matrici. È scritto in C, ma ha collegamenti C ++, penso (e anche se non lo fosse, chiamare C da C ++ non è un problema). La documentazione è incredibilmente completa. Il pacchetto è un po 'eccessivo per quello che voglio fare ora (moltiplicazione di matrice e indicizzazione per impostare programmi lineari a numero intero misto), ma potrebbe essere utile come formato matrice per me in futuro o per altre persone che hanno esigenze diverse di me.

Trilinos , scritto da un team del Sandia National Laboratory, fornisce interfacce C ++ orientate agli oggetti per matrici dense e sparse attraverso il suo componente Epetra e interfacce modellate per matrici dense e sparse attraverso il suo componente Tpetra. Ha anche componenti che forniscono funzionalità di risoluzione lineare ed eigensolver. La documentazione non sembra essere così lucida o importante come PETSc; Trilinos sembra l'analogo Sandia di PETSc. PETSc può chiamare alcuni dei solutori di Trilinos. I binari per i trilinos sono disponibili per Linux.

Blitz è una libreria orientata agli oggetti C ++ con binari Linux. Non sembra essere attivamente mantenuto (29/06/2012: una nuova versione è appena apparsa ieri!), Sebbene la mailing list sia attiva, quindi c'è una comunità che la utilizza. Non sembra fare molto in termini di algebra lineare numerica oltre BLAS e sembra una libreria a matrice densa. Utilizza modelli.

Boost :: uBLAS è una libreria orientata agli oggetti C ++ e parte del progetto Boost. Supporta l'algebra lineare numerica modellante e densa. Ho sentito che non è particolarmente veloce.

Il modello numerico Toolkit è una libreria C ++ orientata agli oggetti sviluppato dal NIST. Il suo autore, Roldan Pozo, sembra contribuire occasionalmente alle patch, ma non sembra più essere in fase di sviluppo attivo (l'ultimo aggiornamento è stato il 2010). Si concentra su una densa algebra lineare e fornisce interfacce per alcune scomposizioni di matrici di base e un risolutore di autovalori.

Elemental , sviluppato da Jack Poulson, è un pacchetto software di algebra lineare densa di memoria distribuita (parallela) scritto in uno stile simile a FLAME . Per un elenco di funzionalità e informazioni di base sul progetto, consultare la sua documentazione . FLAME stesso ha una libreria associata per l'algebra lineare densa di memoria sequenziale e condivisa, chiamata libflame , che sembra essere scritta in C. orientata agli oggetti. Assomiglia molto a LAPACK, ma con una migliore notazione alla base degli algoritmi per rendere rapido lo sviluppo numerico biblioteche di algebra lineare più di una scienza e meno di un'arte nera.

Ci sono altre librerie che possono essere aggiunte all'elenco; se contiamo i pacchetti di algebra lineare sparsa come "librerie di matrici", il migliore che io conosca in C è SuiteSparse , che è programmato in stile orientato agli oggetti. Ho usato SuiteSparse e l'ho trovato abbastanza facile da raccogliere; dipende da BLAS e LAPACK per alcuni degli algoritmi che decompongono i problemi sparsi in molti sottoproblemi di algebra lineare piccola e densa. L'autore principale del pacchetto, Tim Davis, è incredibilmente disponibile e un ragazzo eccezionale.

Le librerie di subroutine di Harwell sono famose per le loro sparse routine di algebra lineare e sono gratuite per gli utenti accademici, anche se è necessario seguire questo processo di compilazione di un modulo e ricezione di un'e-mail per ogni file che si desidera scaricare. Poiché le subroutine hanno spesso dipendenze, l'utilizzo di un solutore potrebbe richiedere il download di cinque o sei file e il processo può diventare un po 'noioso, soprattutto perché l'approvazione del modulo non è istantanea.

Esistono anche altri risolutori di algebra lineare sparsa, ma per quanto ne so, MUMPS e altri pacchetti sono focalizzati principalmente sulla soluzione di sistemi lineari, e la risoluzione dei sistemi lineari è la mia preoccupazione al momento. (Forse più tardi, avrò bisogno di quella funzionalità e potrebbe essere utile per gli altri.)


2
Penso che tu abbia confuso Eigen con Elemental; Non ho lavorato su Eigen, anche se sono rimasto molto colpito dal progetto. Elemental si rivolge principalmente a macchine a memoria distribuita.
Jack Poulson,

3
Immagino che la mia prima domanda sarebbe: vuoi mai eseguire qualcosa in parallelo?
Matt Knepley,

1
Dovrei menzionare Trilinos ... anche se non ha molta visibilità qui (ancora), è una valida alternativa a PETSc, con un pacchetto di matrici templated, un eigensolver e un risolutore di matrici sparse, ha anche un pacchetto inteso specificamente per sottrarre la contabilità di un algoritmo, anche se non so quanto funzioni bene.
Andrew Spott,

1
Eigen sembra fantastico: un mio collega lo ha utilizzato in un contesto professionale e può metterti in funzione abbastanza velocemente senza sacrificare le prestazioni.
qdot

7
Vorrei anche aggiungere le seguenti librerie alla tua risposta: ViennaCL - libreria di intestazioni C ++ basata su OpenCL che può interfacciarsi con Eigen e MTL. PLASMA - una riprogettazione basata su UTK delle librerie BLAS e LAPACK con decomposizioni basate su tile. MAGMA - un altro progetto UTK che si concentra sul miglioramento delle prestazioni LAPACK / BLAS.
Aron Ahmadia,

24

Questo documento è stato scritto nel marzo 2009 per aiutare nella scelta di una biblioteca di algebra lineare per una biblioteca scientifica. Valuta la portabilità, l'interfaccia di alto livello e le licenze per diverse librerie, tra cui Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos e uBlas. Sembra essere particolarmente affezionato a Flens e Seldon . (Uno dei requisiti era che i modelli C ++ e le matrici sparse dovevano essere supportati.)


17

Di tutti i progetti sopra elencati, ci sono davvero solo due pesi massimi che sono estremamente utilizzati (e per buoni motivi): PETSc e Trilinos. Entrambi sono sviluppati professionalmente e hanno una vasta base di sviluppatori. Tutti gli altri sono progetti piuttosto piccoli rispetto a questi due, e consiglierei di seguirli perché (i) saranno supportati per molto tempo e (ii) probabilmente avranno già tutte le funzionalità di cui avrete mai bisogno algebra lineare (e molto altro ancora).


4
PETSc non presenta molto più di un'interfaccia leggermente astratta per ScaLAPACK e PLAPACK. Se Geoff è interessato a una comoda e densa algebra lineare, penso che PETSc sia eccessivo (non so abbastanza delle capacità dense di Trilinos da commentare)
Aron Ahmadia,

@AronAhmadia: A questo punto, penso che la risposta si sia trasformata in più di una risorsa wiki della comunità, motivo per cui ho aggiunto pacchetti su richiesta dei commentatori.
Geoff Oxberry,

3
@WolfgangBangerth: penso sia importante menzionare gli obiettivi del design. Se l'obiettivo è scrivere un software di lunga durata e destinato ad essere utilizzato da altri, e l'algebra lineare è parte integrante di quel software, allora PETSc e Trilinos sono buone scelte. Tuttavia, ci sono casi in cui sono preferibili e utili opzioni più leggere, poiché hanno API più semplici e possono svolgere quasi la stessa attività in meno righe di codice. Infine, la distorsione da selezione ha un ruolo nella sopravvivenza dei codici. Se nessuno usa codici più piccoli, non dureranno o costruiranno una base come PETSc e Trilinos.
Geoff Oxberry,

1
Per aggiungere ciò che Geoff ha detto, la stragrande maggioranza delle funzionalità di PETSc e Trilinos proviene da involucri di librerie esterne. Dire che nessuno dovrebbe usare dette librerie esterne mi sembra direttamente strano.
Jack Poulson,

1
@JackPoulson: in realtà sostengo il mio commento. Sì, PETSc avvolge molti singoli pacchetti. Ma lo fa con un'interfaccia uniforme e quindi è più semplice impararlo una volta che dover imparare le peculiarità di ogni pacchetto denominando convenzione e stile. In altre parole, mentre ogni singolo progetto può ugualmente utilizzare i pacchetti confezionati, esiste una sinergia che deriva dal loro utilizzo attraverso PETSc ogni volta.
Wolfgang Bangerth,

11

Se vuoi

  • Classi di matrice con un'interfaccia intuitiva
  • Tutte le funzionalità di LAPACK e BLAS
  • API di facile apprendimento e utilizzo
  • Facile da installare

Quindi ti consiglio di dare un'occhiata alla mia biblioteca FLENS . L'ho progettato esattamente per questo tipo di compiti. Tuttavia, richiede un compilatore conforme a C ++ 11 (ad esempio gcc 4.7 o clang).

FLENS offre esattamente le stesse prestazioni dell'implementazione BLAS sottostante. Ci sono alcuni (piuttosto vecchi) parametri di riferimento che mostrano questo

Lo stesso si può dire di FLENS-LAPACK che offre esattamente le stesse prestazioni del LAPACK di Netlib se si utilizza la stessa implementazione BLAS.

Per quanto riguarda i nuovi parametri di riferimento, consentitemi di entrare nel dettaglio ...

Qualche tempo fa ho chiesto a Clint Whaley (l'autore di ATLAS) cosa ne pensasse dei benchmark pubblicati sul sito Eigen. Ha appena confermato il mio sospetto che questi parametri probabilmente non sono affidabili. Nel frattempo alcuni altri hanno realizzato benchmark come suggerito da Clint. I dettagli sono disponibili sul sito ATLAS e sulla mailing list di Eigen. I benchmark non sono ben presentati nei grafici ma mostrano che ATLAS è sempre circa il 40% più veloce di Eigen. Ciò contraddice i parametri di riferimento del sito Eigen ma conferma altri parametri di riferimento (ad esempio quelli di blaze-lib).

Si noti che per l'algebra lineare numerica densa i prodotti matrice-matrice sono i più rilevanti. Personalmente non mi importa se Eigen o ATLAS sono più veloci. Se Eigen fosse più veloce di ATLAS, utilizzerei Eigen come back-end BLAS.

Disclaimer: Sì, FLENS è il mio bambino! Ciò significa che ho codificato circa il 95% di esso e ogni riga di codice è valsa la pena :-)


Ciao Michael, benvenuto su Scicomp. Il tuo URL non funziona per me, c'è qualcosa di sbagliato nel tuo server?
Aron Ahmadia,

Grazie per il suggerimento. L'URL è corretto ma sembra che stiamo riscontrando un problema nel dipartimento di matematica con il file server. Giusto in tempo per il fine settimana ...
Michael Lehn,

1
Ok, ho appena creato una nuova documentazione dall'attuale repository git e l'ho copiata su un altro server: apfel.mathematik.uni-ulm.de/~lehn/FLENS/index.html
Michael Lehn,



1

Quale sarebbe la migliore libreria di matrici per gestire matrici di piccole dimensioni, che sono comunemente utilizzate, ad esempio, quando si assemblano matrici di elementi finiti, per eseguire operazioni tensoriali e così via.

Sto già usando PETSc per la soluzione dei grandi sistemi lineari sparsi che sorgono nella mia applicazione, ma attualmente sto usando la mia semplice libreria per gestire queste matrici / vettori ... Sto pensando di passare a una libreria più veloce come quelli sopra menzionati.

Quale sarebbe la scelta migliore da abbinare a PETSc? Eigen? Armadillo? Boost :: uBLAS? MTL4? Uso alcune cose di BOOST, quindi, per prima cosa ho pensato di usare BOOST :: uBlas, ma non c'è molta documentazione, esempi e così via ...


2
Consiglio vivamente di non utilizzare uBlas, poiché è noto che è circa un ordine di grandezza più lento delle routine BLAS ottimizzate. Penso che Eigen brilli di più per le matrici molto piccole a causa di trucchi di template intelligenti.
Jack Poulson,

1
Questo è probabilmente meglio per una domanda separata. So che Eigen, MTL4 e Armadillo hanno tutti dei trucchi per risolvere sistemi di piccole dimensioni, ma penso che tu stia chiedendo come assemblare le matrici e, per quello, non lo so. In genere assemblo matrici elemento per elemento. Non sono sicuro se una delle librerie menzionate sia adatta per l'accoppiamento con PETSc; Non sono ancora un utente PETSc. Secondo il commento di Jack su Boost :: uBlas, però, perché è lento.
Geoff Oxberry,

1

Armadillo, Boost e altri sono ora inclusi come parte di Ceemple, un ambiente di elaborazione tecnica C ++ basato su JIT rapida. Disponibile (gratuito) da http://www.ceemple.com .


0

Sorpreso nessuno ha menzionato TooN finora. Lo uso felicemente da quasi 3 anni.

È molto simile a Eigen anche se non così completo. Comunque penso che abbia la sintassi più bella in qualche modo.

Viene inoltre fornito con classi che aiutano a modellare trasformazioni comuni che si incontrano frequentemente in Grafica e visione, basate su gruppi di Lie (Euclide speciale / ortogonale in 2 e 3 dimensioni, ecc.) E sulle algebre di Lie associate.


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.