Bagaimana LAPACK memecahkan sistem tridiagonal dan mengapa?

9

Dalam proyek saya, saya harus menyelesaikan beberapa matriks tridiagonal pada setiap langkah waktu, jadi sangat penting untuk memiliki pemecah yang baik untuk mereka. Saya melakukan implementasi saya sendiri, hanya cara klasik untuk melakukannya dijelaskan di Wikipedia. Saya kemudian mencoba menggunakan Lapack sebagai gantinya, dan yang mengejutkan saya lebih lambat!

Sekarang, di dalam Lapack sepertinya itu adalah penyelesaian dengan faktorisasi LU dan saya bertanya-tanya mengapa, bukankah ini lebih kompleks daripada yang seharusnya?

Selain itu, saya menemukan sebuah algoritma dalam buku "Numerical Recipes" dari nr.com yang secara rekursif membagi sistem menjadi masalah tridiagonal yang lebih kecil. Itu tampak menjanjikan. Apakah ada barang lain di luar sana?

Pembaruan: ukuran masalahnya sekitar 1000x1000. Saya menggunakan GotoBLAS, itu memberi Anda perpustakaan Lapack 3.1.1 juga. Masalahnya bukan simetris. Saya menggunakan rutin Lapack untuk matriks tridiagonal umum.

tiam
sumber
2
Anda harus menyatakan rutinitas LAPACK mana yang Anda gunakan untuk ini. Perhatikan bahwa dgtsv melakukan pivot parsial, tetapi kode Anda mungkin tidak melakukan ini. Harap sebutkan juga implementasi LAPACK mana yang Anda uji dan ukuran masalah apa yang Anda tolok ukur. Juga, apakah masalah Anda simetris positif pasti?
Jed Brown
Saya menambahkan beberapa info dalam formulasi pertanyaan.
tiam
Apakah aplikasi Anda ada hubungannya dengan Metode Volume Hingga?
Pemeriksaan
Ini adalah perbedaan yang terbatas, tetapi dalam perspektif ini kurang lebih sama dengan yang saya kira.
tiam

Jawaban:

6

Anda menggunakan implementasi referensi yang melakukan pivot parsial. Pemecahan Tridiagonal sangat sedikit bekerja dan tidak memanggil BLAS. Kemungkinan lebih lambat daripada kode Anda karena pivoting parsial. The kode sumber untuk dgtsv sangatlah mudah.

Jika Anda akan menyelesaikan dengan matriks yang sama beberapa kali, Anda mungkin ingin menyimpan faktor-faktor dengan menggunakan dgttrf dan dgttrs . Ada kemungkinan bahwa implementasi dalam LAPACK yang dioptimalkan seperti MKL, ACML, atau ESSL akan lebih berkinerja.

Jed Brown
sumber
Saya sedikit penasaran. Gaussian Elim dengan PP akan bekerja untuk semua matriks termasuk TriDiagonal. Dalam CFD, kami menggunakan metode khusus untuk kasus FVM 1D yang disebut TDMA . Menurut Anda, mana yang lebih cepat untuk kasus yang didiskusikannya? Meskipun, saya tidak sepenuhnya yakin bahwa matriksnya dominan secara diagonal.
Pemeriksaan
TDMA adalah apa yang saya terapkan dalam kode saya. Pertanyaannya adalah mengapa Lapack super cepat menggunakan prosedur pivoting parsial dalam matriks tertentu, yang diselesaikan lebih cepat dengan metode yang mudah seperti TDMA.
tiam
Ini persis algoritma yang sama (eliminasi Gaussian khusus untuk matriks tridiagonal), tetapi implementasi Anda tidak melakukan pivot parsial, sehingga mungkin secara numerik tidak stabil. Pivoting itu tidak gratis dan Anda membandingkan penerapan referensi. Implementasi referensi tidak dioptimalkan untuk kinerja dan pivoting parsial tidak gratis.
Jed Brown
Saya mengerti maksud Anda, saya mendapat manfaat dari pengetahuan saya tentang sistem yang saya pecahkan. Apakah implementasi LAPACK lainnya memberikan peningkatan kinerja karena adaptasi terhadap arsitektur tertentu atau apakah itu lebih dari itu?
tiam