Implementazione efficiente dell'algoritmo a matrice tridiagonale


12

Sto risolvendo un problema fisico usando uno schema numerico implicito. Questo mi porta a risolvere un'equazione lineare con matrice tridiagonale. Ho codificato questo algoritmo da Wikipedia. Mi chiedo se esiste una libreria efficiente che consenta di risolvere questo tipo di equazione in modo ottimizzato. Una nota importante è che la matrice stessa cambia solo quando cambiano i parametri di sistema, quindi ho avuto l'opportunità di precalcolare alcuni passaggi dell'algoritmo per un bel bonus di prestazioni. Sto usando C ++.


Quanto è grande un sistema, deve essere parallelo?
interrel

1
Le dimensioni dipendono dalla precisione richiesta (da centinaia a decine di migliaia di valori). Ora sto programmando su un computer un core, ma è possibile ottenere l'accesso al supercomputer universitario con molti cpus disponibili, quindi il supporto al parallelismo sarebbe carino.
gmk,

Risposte:


15

Probabilmente dovresti iniziare con l'implementazione di LAPACK,? Gtsv, ad esempio, dgtsv . Se si desidera una versione con memoria distribuita, è possibile iniziare con p? Gtsv di ScaLAPACK.

EDIT: Poiché la tua matrice non cambia molto spesso, puoi evitare di fattorizzare in modo ridondante la matrice tridiagonale interrompendo la routine LAPACK? Gtsv nella fase di fattorizzazione,? Gttrf, e la fase di risoluzione,? Gttrs. In ScaLAPACK esistono routine con nomi simili che hanno lo stesso scopo.


Grazie, sembra quello di cui ho bisogno. Proverò ora a eseguire queste routine dal mio codice.
gmk,

1
Dato che lo stai chiamando da C ++, assicurati di dichiarare il prototipo all'interno di un blocco "C" {} esterno. A seconda del sistema in uso, potrebbe essere necessario aggiungere un carattere di sottolineatura al nome della routine.
Jack Poulson l'

2

Per sistemi paralleli distribuiti : non ho provato ScaLAPACK, che ha un solutore tridiagonale parallelo, per il quale ci sono esempi disponibili online . Ho provato con un certo successo un metodo proposto da David Moulton in una pubblicazione LANL . Codificare questo potrebbe essere più di quello che vuoi fare, ma usando LAPACK, è stretto in avanti.


1

Ho trovato un interessante algoritmo ricorsivo qui a pagina 975. Sembra promettente, mi chiedo cosa ne pensano le persone più esperte.


Le ricette numeriche contiene alcuni errori. In termini di una fonte di codici da utilizzare, non è il migliore, anche se alcuni lo considerano un classico. Sarei sorpreso se ScaLAPACK non implementasse un algoritmo almeno efficiente quanto la riduzione ciclica ricorsiva.
Geoff Oxberry
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.