Comment LAPACK résout-il les systèmes tridiagonaux et pourquoi?

9

Dans mon projet, je dois résoudre quelques matrices tridiagonales à chaque pas de temps, il est donc crucial d'avoir un bon solveur pour celles-ci. J'ai fait ma propre implémentation, juste la manière classique de le faire décrite sur Wikipedia. J'ai ensuite essayé d'utiliser Lapack à la place, et à ma grande surprise, c'était plus lent!

Maintenant, à l'intérieur de Lapack, il semble que ce soit la résolution par factorisation LU et je me demande pourquoi, n'est-ce pas plus complexe qu'il ne pourrait l'être?

De plus, j'ai trouvé un algorithme dans le livre "Recettes numériques" de nr.com qui divise récursivement le système en petits problèmes tridiagonaux. Cela semblait prometteur. Y a-t-il d'autres goodies là-bas?

Mise à jour: la taille du problème est d'environ 1000x1000. J'ai utilisé GotoBLAS, cela vous donne également une bibliothèque Lapack 3.1.1. Le problème n'est pas symétrique. J'ai utilisé la routine Lapack pour les matrices tridiagonales générales.

tiam
la source
2
Vous devrez indiquer les routines LAPACK que vous avez utilisées pour cela. Notez que dgtsv effectue un pivotement partiel, mais votre code peut ne pas le faire. Veuillez également indiquer avec quelle implémentation LAPACK vous avez testé et avec quelles tailles de problème vous avez comparé. De plus, votre problème est-il positif symétrique défini?
Jed Brown
J'ai ajouté quelques informations dans la formulation de la question.
tiam
Votre application est-elle liée aux méthodes de volume fini?
Enquête du
Ce sont des différences finies, mais dans cette perspective, c'est plus ou moins la même chose, je suppose.
tiam

Réponses:

6

Vous utilisez une implémentation de référence qui effectue un pivotement partiel. Les résolutions tridiagonales font très peu de travail et ne font pas appel au BLAS. Il est probablement plus lent que votre code car il pivote partiellement. Le code source de dgtsv est simple.

Si vous résolvez plusieurs fois avec la même matrice, vous souhaiterez peut-être stocker les facteurs en utilisant dgttrf et dgttrs . Il est possible que les implémentations dans un LAPACK optimisé tel que MKL, ACML ou ESSL soient plus performantes.

Jed Brown
la source
Je suis un peu curieux. Elim gaussien avec PP fonctionnerait pour toutes les matrices, y compris TriDiagonal. Dans CFD, nous utilisons une méthode spéciale pour les cas FVM 1D appelée TDMA . Selon vous, lequel serait plus rapide pour le cas dont il discute? Cependant, je ne suis pas entièrement sûr que ses matrices soient dominantes en diagonale.
Enquête
Le TDMA est ce que j'ai implémenté dans mon code. La question est de savoir pourquoi le Lapack ultra-rapide utiliserait la procédure de pivotement partiel dans une matrice particulière, qui est résolue plus rapidement par une méthode aussi simple que TDMA.
tiam
C'est exactement le même algorithme (élimination gaussienne spécialisée pour une matrice tridiagonale), mais votre implémentation ne fait pas de pivotement partiel, donc elle peut être numériquement instable. Ce pivotement n'est pas gratuit et vous le comparez à l'implémentation de référence. L'implémentation de référence n'est pas optimisée pour les performances et le pivotement partiel n'est pas libre.
Jed Brown
Je vois ce que vous voulez dire, je profite de ma connaissance des systèmes que je résous. D'autres implémentations de LAPACK améliorent-elles les performances en raison de l'adaptation à une architecture spécifique ou vont-elles au-delà?
tiam