Raccomandazioni per un risolutore di algebra lineare denso basato su C o C ++ leggero / senza installazione


9

La maggior parte della mia programmazione è costituita da codici di ricerca una tantum in C per uso personale. Non ho mai distribuito alcun codice a parte i collaboratori stretti. Ho sviluppato un algoritmo che sto pubblicando in una rivista scientifica. Voglio fornire il codice sorgente e forse il codice eseguibile nel supplemento online dell'articolo. Un collega mi ha chiesto di fare una generalizzazione all'algoritmo che mi ha richiesto di scrivere in C ++ (ack!) E che richiede che risolvo piccoli sistemi lineari densi. Se riesco a ottenere una base di utenti per l'algoritmo, lo sarà in parte perché la barra di accesso all'utilizzo è bassa (come sul pavimento). I potenziali utenti non installeranno librerie, ecc. Per utilizzare il codice. Voglio che il codice sia completamente autonomo e libero da qualsiasi licenza. Potrei semplicemente scrivere il mio risolutore prendendo qualcosa da Golub e Van Loan, ma preferirei usare un risolutore alla vaniglia che qualcun altro ha già scritto se ce ne sono là fuori. Suggerimenti apprezzati. Grazie!



Caro jep, benvenuto nel forum. La tua domanda è molto simile a quella qui: scicomp.stackexchange.com/questions/351/…
GertVdE

I risolutori di biblioteche tendono ad essere complessi e grandi per motivi di robustezza, efficienza e generalità. Se i tuoi problemi sono molto piccoli e ragionevolmente ben condizionati, ti suggerirei di scrivere la tua mini-implementazione.
Stefano M,

@GertVdE, grazie per la rapida risposta a questa domanda. Mi sento a disagio a collegarmi alla domanda "Consigli ..." perché sia ​​la domanda che la risposta migliore sono troppo generiche per fornire aiuto in situazioni come queste. Se vuoi discuterne ulteriormente, ti suggerisco di portarlo nella chat room di scicomp .
Aron Ahmadia,

@AronAhmadia: Penso che l'unico modo per iniziare a risolvere alcuni di questi dibattiti sia iniziare a implementare una chrestomatia di programmazione scientifica computazionale che sia dipendente dal linguaggio e dalla biblioteca. Se il codice è chiaro e i problemi di configurazione possono essere risolti (usando uno script di shell, Chef o Puppet), allora i dibattiti sulle prestazioni possono essere curati (o resi concreti) semplicemente eseguendo il codice e impostandolo su un macchina di riferimento. I dibattiti sulla chiarezza possono essere risolti (o almeno resi più concreti) guardando il codice. Altrimenti, continueremo ad avere gli stessi argomenti.
Geoff Oxberry,

Risposte:


7

Suggerirei di duplicare esattamente l'interfaccia Lapack per la funzione di cui hai bisogno, molto probabilmente hai solo bisogno dgesv. In questo modo le persone che hanno installato Lapack possono semplicemente collegarsi ad esso e funzionerà. Per le persone che non hanno installato Lapack, tu fornisci la tua semplice implementazione di questa funzione, o possibilmente implementala usando Eigen o FLENS come altri hanno suggerito.

Nella terra di Fortran, la libreria Lapack è un tale standard, che la maggior parte delle persone semplicemente la usa e basta, invece di fornire le proprie implementazioni.


+1 Aggiungete al fatto che la maggior parte delle distribuzioni Linux (almeno basate su Debian) hanno pacchetti binari nel repository e che tutte le librerie matematiche fornite dal fornitore (MKL, SunPerf, ACML, ESSL ecc.) Lo portano. Dovresti sempre usare le librerie standard il più possibile, anche se se sei su Windows / Mac potresti stare meglio con qualcosa in C, poiché l'installazione di un compilatore Fortran gratuito (gfortran) su di loro è un po 'di lavoro o almeno ho sentito.
Stali,

Ho usato il sacco molte volte ma non sono attualmente in terra fortran. Mi aspetto che la distribuzione statistica delle piattaforme su cui è in esecuzione la mia base di utenti sia simile a quella del mondo in senso lato, principalmente finestre, una percentuale minore di Mac e una percentuale ancora più piccola di * nix. La mia esperienza con Windows è minima e preferisco mantenerla così. Questo è il motivo per cui voglio un codice C ++ autonomo. Immagino che dovrò fornire ad alcuni dei miei utenti aiuto per ottenere la compilazione e l'esecuzione del codice. Devo ridurre al minimo il lavoro richiesto per farlo.
jep

Se la tua base di utenti è Windows / Mac, allora sei meglio con una semplice implementazione basata su C (forse anche la tua). Un pacchetto che è difficile da installare o dipende da altre 5 librerie, specialmente quando non è disponibile un repository di pacchetti binari di prima classe (come Debian), spegne i tuoi utenti per molto tempo. Ricorda che la maggior parte degli utenti Windows / Mac sono abituati all'installazione con un clic. La facilità d'uso trionfa su tutto il resto.
Stali,

5

Un errore molto precoce che molte persone commettono quando si inizia a utilizzare il calcolo scientifico sta nel presupporre che sia necessario scrivere tutto il codice nella stessa lingua. Penso che ciò sia dovuto in gran parte a ragioni storiche, quando non era chiaro come far comunicare i programmi compilati tra loro anche attraverso le versioni dello stesso compilatore. Detto questo, in questo caso, se hai intenzione di usare C ++, ci sono diverse ottime librerie di template solo per header C ++ che potrebbero soddisfare le tue esigenze.

Poiché stai distribuendo il tuo codice per motivi accademici e desideri incorporare un denso risolutore di algebra lineare nel tuo codice, ti consiglio vivamente di prendere in considerazione Eigen . Eigen è stato concesso in licenza con Mozilla Public License ed è una libreria di sola intestazione. Ciò significa che puoi distribuire Eigen con il tuo codice in formato sorgente (ciò non impone alcuna restrizione di licenza al tuo codice) e riceverai l'accesso alle sue funzionalità generali, compresi i risolutori lineari densi estremamente efficienti. Come menziona GertVdE, hai diverse altre opzioni .


Speravo in un singolo file. Ho fatto programmazione scientifica per un bel po '. Ho un po 'di lingue miste come C e fortran ma per questo progetto voglio davvero solo un file contenente tutto il mio codice sorgente. Suppongo che potrei inserire un risolutore C nel codice C ++ che non sarebbe un grosso problema. Principalmente voglio mantenere il codice il più semplice possibile. LU con pivot dovrebbe essere adeguato. Guarderò Eigen. Grazie!
jep

@jep, potresti anche provare a scegliere le routine di cui hai bisogno da CLAPACK se davvero non ti importa nulla delle prestazioni.
Aron Ahmadia,

Ci sono buoni motivi per scrivere tutto il codice dipendente nella stessa lingua, in particolare negli ambienti HPC, hai strani problemi di compilatore / collegamento e problemi di interfaccia a 32/64 bit. Ad esempio, come faccio a sapere la larghezza di un numero intero per le librerie integrate? Come faccio a sapere con certezza quale compilatore è stato utilizzato per una libreria integrata e posso collegarlo con questo altro compilatore? Avere tutto in una lingua semplifica molti di questi problemi. E sì, ci dovrebbe essere la documentazione fornita dai manutentori del cluster, ma il più delle volte non lo è.
Victor Liu,

@VictorLiu: i problemi a cui ti riferisci sono più strettamente associati alle implementazioni rispetto alle lingue. Lo spazio dei commenti è un posto scarso per iniziare una discussione seria, ma sono felice di coinvolgerti in chat o altrove se desideri che io espanda i miei pensieri su questo.
Aron Ahmadia,

4

Se si desidera un solutore affidabile per sistemi di equazioni lineari, consiglierei FLENS . Contiene una reimplementazione esatta di LAPACK (riproduce persino gli stessi errori di arrotondamento di LAPACK se viene utilizzata un'implementazione BLAS a thread singolo). Questo vale per tutte le funzioni FLENS-LAPACK (insieme alle funzioni di utilità di circa 100 routine).

FLENS ha una licenza BSD e pertanto consente di essere incorporato in prodotti proprietari.

FLENS è solo intestazione e se hai solo bisogno di un sottoinsieme di FLENS posso darti una versione ridotta contenente solo quelle funzioni di cui hai bisogno. FLENS viene fornito con un'implementazione BLAS di riferimento. Ma facoltativamente i tuoi utenti possono collegarsi a librerie BLAS ottimizzate come ATLAS, OpenBLAS o GotoBALS. Per matrici di grandi dimensioni, ciò offre un aumento delle prestazioni di circa il 40% rispetto a Eigen.

E sì, Eigen utilizza anche la suite di test LAPACK per verificare i risultati. Lo fanno per 3 funzioni (Lu, Cholesky ed autovalori / vettori di una matrice simmetrica). Tuttavia, il loro calcolo di autovalori / vettori di una matrice non simmetrica fallirebbe la suite di test LAPACK.

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


1
Michael - Ti preghiamo di considerare questo un amichevole avvertimento che devi seguire la regola nelle domande frequenti sulla divulgazione dell'affiliazione .
Aron Ahmadia,

Certo, ma potresti anche riformulare i tuoi post da "Consiglio vivamente di considerare Eigen" a qualcosa come "c'è ad esempio Eigen". In questo caso elimino le mie osservazioni su Eigen (anche se si sono dimostrate tutte vere) incluso questo.
Michael Lehn,

1
Le tue osservazioni su Eigen non sono in discussione qui (anche se mi sembrano fuori tema). Sei uno sviluppatore principale di FLENS, se lo consiglierai in una risposta qui, devi rivelare la tua affiliazione come sviluppatore del progetto.
Aron Ahmadia,

Ah, ok allora. Pensavo fosse implicitamente chiaro da "... posso darti ...". La divulgazione in questo modulo è corretta?
Michael Lehn,

2
Voglio solo dire grazie per averlo fatto; Avevo piani simili per reimplementare gran parte di Lapack in C ++. Tuttavia, sembra che per la maggior parte delle routine avanzate (autovalore), si rinvii semplicemente alla chiamata in Lapack, quindi è un po 'di falsa pubblicità dire che si implementa nuovamente tutto. D'altra parte, ho effettivamente portato il sorgente ZGEEV su C ++ in RNP , anche se alcune parti sono ancora nell'indicizzazione basata su 1 dalla conversione automatica.
Victor Liu,
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.