In meinem Projekt muss ich bei jedem Zeitschritt ein paar tridiagonale Matrizen lösen, daher ist es wichtig, einen guten Löser für diese zu haben. Ich habe meine eigene Implementierung gemacht, nur die klassische Art, wie es auf Wikipedia beschrieben wird. Ich habe dann versucht, stattdessen Lapack zu verwenden, und zu meiner Überraschung war es langsamer!
In Lapack scheint es so, als würde es durch LU-Faktorisierung gelöst, und ich frage mich, warum es nicht komplexer ist, als es sein könnte.
Zusätzlich habe ich im Buch "Numerical Recipes" von nr.com einen Algorithmus gefunden, der das System rekursiv in kleinere tridiagonale Probleme unterteilt. Es sah vielversprechend aus. Gibt es noch andere Leckereien da draußen?
Update: Die Problemgröße beträgt ca. 1000x1000. Ich habe GotoBLAS verwendet, es gibt Ihnen auch eine Lapack 3.1.1-Bibliothek. Das Problem ist nicht symmetrisch. Ich habe die Lapack-Routine für allgemeine tridiagonale Matrizen verwendet.
quelle
Antworten:
Sie verwenden eine Referenzimplementierung, die teilweise schwenkt. Tridiagonale Lösungen machen sehr wenig Arbeit und rufen nicht in die BLAS auf. Es ist wahrscheinlich langsamer als Ihr Code, da es teilweise schwenkt. Der Quellcode für dgtsv ist unkompliziert.
Wenn Sie mehrmals mit derselben Matrix lösen, möchten Sie die Faktoren möglicherweise mithilfe von dgttrf und dgttrs speichern . Es ist möglich, dass die Implementierungen in einem optimierten LAPACK wie MKL, ACML oder ESSL leistungsfähiger sind.
quelle