W moim projekcie muszę rozwiązywać kilka trójosiowych macierzy na każdym kroku, dlatego bardzo ważne jest, aby mieć dla nich dobry solver. Zrobiłem własną implementację, tylko klasyczny sposób na to opisany na Wikipedii. Potem spróbowałem użyć Lapacka i ku mojemu zaskoczeniu było wolniej!
Teraz w Lapacku wydaje się, że rozwiązuje to za pomocą faktoryzacji LU i zastanawiam się, dlaczego nie jest to bardziej skomplikowane niż mogłoby być?
Dodatkowo znalazłem algorytm w książce „Numerical Recipes” z nr.com, który rekurencyjnie dzieli system na mniejsze problemy trójdzielne. Wyglądało to obiecująco. Czy są jeszcze jakieś gadżety?
Aktualizacja: rozmiar problemu wynosi około 1000 x 1000. Użyłem GotoBLAS, daje on również bibliotekę Lapack 3.1.1. Problem nie jest symetryczny. Użyłem procedury Lapacka do ogólnych macierzy trójridiagonalnych.
źródło
Odpowiedzi:
Używasz referencyjnej implementacji, która wykonuje częściowe przestawianie. Trójkątne rozwiązania wykonują bardzo mało pracy i nie wzywają do BLAS. Jest prawdopodobnie wolniejszy niż kod, ponieważ wykonuje częściowe przestawianie. Kod źródłowy dgtsv jest proste.
Jeśli rozwiążesz tę samą macierz wiele razy, możesz chcieć zapisać czynniki, używając dgttrf i dgttrs . Możliwe jest, że implementacje w zoptymalizowanym LAPACK, takim jak MKL, ACML lub ESSL, będą bardziej wydajne.
źródło