La migliore scelta di solutore per un sistema simmetrico (ma non definito positivo) di grandi dimensioni


10

Attualmente sto lavorando alla risoluzione di sistemi simmetrici molto grandi (ma non definiti positivi), generati da alcuni algoritmi. Queste matrici hanno una bella scarsità di blocchi che può essere utilizzata per la risoluzione parallela. Ma non posso decidere se dovrei usare un approccio diretto (come Multi-frontale) o iterativo (GMRES o MINRES precondizionati). Tutti i miei studi mostrano che i risolutori iterativi (anche con una convergenza piuttosto veloce di 7 iterazioni interne) non riescono a battere l'operatore diretto "\" in MATLAB. Ma in teoria, i metodi diretti dovrebbero essere più costosi. Come sta succedendo questo? Esiste un documento o un documento aggiornato per tale caso? Posso usare la sparsità dei blocchi in sistemi paralleli usando metodi diretti con la stessa efficienza dei solutori iterativi flessibili come GMRES?


3
Non credo che le persone possano davvero commentare efficacemente questo senza conoscere maggiori dettagli sulla tua matrice specifica. Quali sono le dimensioni? Com'è il modello di sparsità?
Costis,

2
n

2
Questa domanda si sovrappone notevolmente a scicomp.stackexchange.com/q/81/276 ; puoi trovare informazioni utili lì. Inoltre, in base a questa domanda, potrebbe essere utile parlare dello spettro del tuo operatore (o dello spettro del tuo operatore precondizionato).
Geoff Oxberry,

Risposte:


9

Il risolutore diretto sparso MUMPS può gestire sistemi indefiniti simmetrici ed è liberamente disponibile ( http://graal.ens-lyon.fr/MUMPS/ ). Ian Duff era uno degli autori di MUMPS e MA57, quindi gli algoritmi hanno molte somiglianze.

MUMPS è stato progettato per computer paralleli a memoria distribuita, ma funziona anche su macchine a processore singolo. Se lo colleghi a una libreria BLAS multi-thread, puoi ottenere ragionevoli accelerazioni sulla memoria condivisa, sui processori multicore.

Non hai detto quanto sia grande "molto grande" ma MUMPS ha anche una capacità out-of-core per gestire i problemi in cui la matrice fattorizzata non si adatta alla memoria disponibile.


7

Il problema generale di cui soffrono i risolutori diretti è il fenomeno del riempimento, il che significa che l'inverso di una matrice sparsa può essere denso. Ciò comporta enormi requisiti di memoria se la struttura della matrice non è "adatta".

Ci sono tentativi di aggirare questi problemi e la funzione predefinita di MATLAB ne luutilizza alcuni. Vedere http://www.mathworks.de/de/help/matlab/ref/lu.html per una panoramica di permutazioni, ridimensionamento diagonale e simili. Lo stesso vale ovviamente per i pacchetti più avanzati come MUMPS ( http://graal.ens-lyon.fr/MUMPS/ ).

In generale, tuttavia, se il tuo problema è abbastanza grande, colpirai quel limite di memoria e dovrai usare metodi iterativi (Krylov).

Se il tuo problema è simmetrico e indefinito, MINRES potrebbe essere la scelta più ovvia. Si noti, tuttavia, che GMRES e MINRES fanno la stessa cosa in aritmetica esatta se il problema è simmetrico, ma GMRES tende a soffrire meno della perdita di ortogonalità. Quindi, alcune persone considerano GMRES come "la migliore implementazione di MINRES".

In ogni caso, probabilmente trarrai profitto dal precondizionamento del tuo sistema. Se non vuoi perdere tempo a personalizzare un precondizionatore, un precondizionatore di fattorizzazione LU (ILU) incompleto potrebbe già portarti da qualche parte.


2

Qualsiasi risolutore iterativo può battere i metodi diretti solo se il problema è sufficientemente grande (grande, dipende da diversi fattori come l'archiviazione richiesta, l'efficienza dell'implementazione). Inoltre, qualsiasi metodo krylov (ad esempio GMRES) è valido solo se si utilizza un precondizionamento appropriato (in pratica). Se non si utilizza alcun prerequisito, i metodi krylov non sono di alcuna utilità in generale. Anch'io lavoro con matrici sparse a blocchi (provengono da applicazioni PDE) e ho osservato che il risolutore di blocchi krylov precondizionato (sovrapposto additivo schwarz) (o ricominciato GMRES o BiCG-Stab) accoppiato con una correzione della griglia grossolana (o un multigrid) sono scalabili per questi tipo di matrici.


2

L'operatore Matlab '\' è altamente efficiente grazie alla programmazione di alto livello. Potresti vedere alcune delle idee e come hanno usato tutte le possibili scorciatoie nel libro di Timothy Davis.

In matlab puoi usare gmres, che è ben sviluppato e stabile. Probabilmente minre, che teoricamente dovrebbe essere l'ideale per il tuo caso, potrebbe non essere così affidabile (almeno la mia esperienza lo dice). Se si dovrebbe ottenere un'efficienza uguale o superiore da matlab gmres

  1. Il tuo sistema è abbastanza grande (almeno alcune migliaia per alcune migliaia).
  2. Se stai usando il giusto tipo di parametri (RESTART, MAXIT, X0). Per questo non sono disponibili linee guida chiare. Usa la tua esperienza.
  3. Usa un buon precondizionatore. Puoi usare ILU o anche più economico, un blocco Jacobi. Ciò ridurrà notevolmente lo sforzo.
  4. PIÙ IMPORTANTE: se la tua matrice è sparsa, usa il formato spla di matlab. Matlab gmres è ideale per questo. Ridurrà i costi in larga misura.

Per sistemi ancora più grandi, utilizzare uno strumento come PETSc.


1

Se la tua matrice ha dimensioni nella metà delle decine di migliaia o meno, usa un metodo diretto, sebbene non ci siano molti metodi diretti disponibili liberamente per sistemi simmetrici indefiniti (in realtà nessuno di quelli che conosco sono open source). C'è MA57 dall'HSL , ma è gratuito solo per uso accademico. Puoi certamente ignorare la simmetria e usare UMFPACK .

Intorno alle decine di centinaia di dimensioni, l'uso della memoria di un metodo diretto inizia a superare ciò che un normale computer desktop può ragionevolmente gestire, quindi a meno che tu non abbia una macchina di memoria condivisa robusta, dovrai passare a metodi iterativi. Per problemi indefiniti, è possibile specializzare BiCG (gradiente biconjugate) per sistemi simmetrici, sebbene sia possibile la rottura. Esiste un MINRES-QLP recentemente rilasciato per sistemi simmetrici che offre maggiore stabilità numerica.

I due metodi richiedono implementazioni piuttosto diverse, poiché per i metodi diretti è effettivamente necessario formare la matrice, mentre nell'approccio iterativo, di solito non si forma esplicitamente la matrice.

Esistono diversi motivi per cui un approccio potrebbe essere più veloce dell'altro, soprattutto in funzione della dimensione della matrice. Per i sistemi altamente mal condizionati, i metodi iterativi possono ristagnare piuttosto male. Per matrici non così sparse, i metodi diretti finiscono per creare un sacco di riempimento, che rallenta molto le cose. Inoltre, i metodi diretti in Matlab sono altamente ottimizzati (utilizza UMFPACK o MA57 internamente), mentre i metodi iterativi sono generalmente codificati direttamente in Matlab e ci sono meno opportunità di sfruttare il BLAS di livello 3 poiché i colli di bottiglia sono l'applicazione di matvec e prodotti dot.

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.