In che modo LAPACK risolve i sistemi tridiagonali e perché?


9

Nel mio progetto devo risolvere un paio di matrici tridiagonali in ogni momento, quindi è fondamentale avere un buon risolutore per quelli. Ho fatto la mia implementazione, solo il modo classico per farlo descritto su Wikipedia. Ho quindi provato a usare Lapack invece, e con mia sorpresa è stato più lento!

Ora, all'interno di Lapack sembra che risolva la fattorizzazione LU e mi chiedo perché, non è più complesso di quanto potrebbe essere?

Inoltre, ho trovato un algoritmo nel libro "Ricette numeriche" di nr.com che divide ricorsivamente il sistema in piccoli problemi tridiagonali. Sembrava promettente. Ci sono altre chicche là fuori?

Aggiornamento: la dimensione del problema è di circa 1000x1000. Ho usato GotoBLAS, ti dà anche una libreria Lapack 3.1.1. Il problema non è simmetrico. Ho usato la routine Lapack per matrici tridiagonali generali.


2
Dovrai indicare quali routine LAPACK hai usato per questo. Nota che dgtsv esegue un pivot parziale, ma il tuo codice potrebbe non farlo. Indica anche quale implementazione LAPACK hai testato e con quali dimensioni del problema hai confrontato. Inoltre, il tuo problema è simmetrico positivo definito?
Jed Brown,

Ho aggiunto alcune informazioni nella formulazione della domanda.
tiam

L'applicazione ha qualcosa a che fare con i metodi del volume finito?
Inchiesta il

Sono differenze finite, ma in questa prospettiva è più o meno la stessa immagino.
tiam

Risposte:


6

Stai utilizzando un'implementazione di riferimento che esegue un pivot parziale. Le soluzioni tridiagonali fanno pochissimo lavoro e non richiamano nel BLAS. È probabilmente più lento del tuo codice perché esegue un pivot parziale. Il codice sorgente per dgtsv è semplice.

Se risolverai con la stessa matrice più volte, potresti voler memorizzare i fattori usando dgttrf e dgttrs . È possibile che le implementazioni in un LAPACK ottimizzato come MKL, ACML o ESSL siano più performanti.


Sono un po 'curioso. Gaussian Elim con PP avrebbe funzionato per tutte le matrici, incluso TriDiagonal. In CFD, utilizziamo un metodo speciale per i casi di FVM 1D chiamato TDMA . Quale pensi sarebbe più veloce per il caso di cui sta discutendo? Anche se non sono del tutto sicuro che le sue matrici siano in diagonale dominante.
Inchiesta il

Il TDMA è ciò che ho implementato nel mio codice. La domanda è: perché il superveloce Lapack dovrebbe utilizzare la procedura di rotazione parziale in una matrice così particolare, che viene risolta più rapidamente con un metodo così semplice come TDMA.
tiam

È esattamente lo stesso algoritmo (eliminazione gaussiana specializzata per una matrice tridiagonale), ma l'implementazione non esegue un pivot parziale, quindi potrebbe essere numericamente instabile. Il pivot non è gratuito e si sta confrontando con l'implementazione di riferimento. L'implementazione di riferimento non è ottimizzata per le prestazioni e il pivot parziale non è gratuito.
Jed Brown,

Capisco cosa intendi, traendo vantaggio dalla mia conoscenza dei sistemi che sto risolvendo. Altre implementazioni di LAPACK offrono miglioramenti delle prestazioni grazie all'adattamento a un'architettura specifica o va oltre?
tiam
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.