Solver linier yang jarang untuk banyak sisi kanan

12

Saya perlu memecahkan sistem linear yang jarang sama (300x300 hingga 1000x1000) dengan banyak sisi kanan (300 hingga 1000). Selain masalah pertama ini, saya juga ingin menyelesaikan sistem yang berbeda, tetapi dengan elemen bukan nol yang sama (hanya nilai yang berbeda), yaitu banyak sistem jarang dengan pola sparsity konstan. Matriks saya tidak terbatas.

Kinerja faktorisasi dan inisialisasi tidak penting, tetapi kinerja tahap penyelesaian adalah. Saat ini saya sedang mempertimbangkan PaStiX atau Umfpack, dan saya mungkin akan bermain-main dengan Petsc (yang mendukung kedua solver) Apakah ada perpustakaan yang mampu mengambil keuntungan dari kebutuhan spesifik saya (vektorisasi, multi-threading) atau haruskah saya mengandalkan solver umum, dan mungkin memodifikasinya sedikit untuk kebutuhan saya?

Bagaimana jika matriks jarang lebih besar, hingga ?106×106

nat chouf
sumber

Jawaban:

10

Tanpa memihak diskusi tentang apakah akan menggunakan pemecah langsung atau berulang, saya hanya ingin menambahkan dua poin:

  1. Ada metode Krylov untuk sistem dengan banyak sisi kanan (disebut metode blok Krylov ). Sebagai bonus tambahan, ini sering memiliki konvergensi yang lebih cepat daripada metode Krylov standar karena ruang Krylov dibangun dari koleksi vektor yang lebih besar. Lihat Dianne P. O'Leary, Blok Konjugasi Algoritma Gradien dan Metode Terkait . Aljabar Linier dan aplikasinya 29 (1980), halaman 239-322. dan Martin H. Gutknecht, metode ruang Block Krylov untuk sistem linier dengan banyak sisi kanan: Pengantar (2007).

  2. Jika Anda memiliki matriks yang berbeda dengan pola sparsity yang sama, Anda dapat melakukan precompute faktorisasi simbolis untuk matriks pertama, yang dapat digunakan kembali dalam menghitung faktorisasi numerik untuk ini dan matriks berikutnya. (Dalam UMFPACK, Anda dapat melakukan ini menggunakan umfpack di symbolicdan meneruskan hasilnya ke umfpack_di_numeric.)

Christian Clason
sumber
9

Biasanya ada trade-off antara jumlah pekerjaan yang Anda lakukan untuk membangun prekondisi yang baik untuk pemecah iteratif dan pekerjaan yang Anda hemat dengan menggunakan prakondisi yang baik ketika benar-benar menyelesaikan sistem linear. Dalam kasus Anda, kasingnya cukup jelas: buat kerja sebanyak yang Anda bisa untuk membangun prakondisi yang baik karena Anda harus menyelesaikan banyak sistem linier. Bahkan, saya pikir pantas menginvestasikan waktu untuk mendapatkan prekondisi sempurna: dekomposisi LU (menggunakan UMFPACK, misalnya, atau pemecah Pardiso yang datang sebagai bagian dari MKL Intel). Maka cukup terapkan dekomposisi ini sebanyak yang diperlukan. Jika Anda memiliki sistem linear untuk dipecahkan, tidak ada yang dapat diharapkan untuk mengalahkan dekomposisi yang tepat.O(N)

Wolfgang Bangerth
sumber
4
Pernyataan terakhir Anda masih bisa diperdebatkan. Pertimbangkan faktorisasi multifrontal yang tepat dari diskritisasi FEM 3D atau FD di atas kubus, yang seharusnya membutuhkan kerja dan penggunaan memori . Oleh karena itu solves yang tepat membutuhkan jepit di sisi kanan, dan, untuk cukup besar , setiap solver iteratif dengan kompleksitas asimptotik yang lebih rendah akan lebih cepat. O ( N 4 / 3 ) O ( N 4 / 3 ) NO(N2)O(N4/3)O(N4/3)N
Jack Poulson
3
Mungkin. Tetapi sebagai pertimbangan praktis, solver langsung jarang masih sangat cepat mengingat bahwa konstanta di depan bahkan solver cukup besar sedangkan konstanta di depan adalah tidak. O ( N 4 / 3 )O(N)O(N4/3)
Wolfgang Bangerth
2
Tangkapannya adalah Anda menjalankan memori dan kesabaran untuk faktorisasi pada titik persilangan. Untuk Laplacian 7-titik, multigrid membutuhkan sekitar 50 jepit / dof, yang mengarah ke crossover jepit (versus pemecahan-kembali) sekitar dofs. Pemecahan masalah menggunakan lebih banyak memori, tetapi kernel untuk banyak sisi kanan umumnya tersedia. Multigrid biasanya tidak ditulis untuk banyak sisi kanan, sehingga mengorbankan potensi vektorisasi. Saya berani bertaruh bahwa Anda dapat menulis algoritma MG yang waktu-per-RHS-nya kurang dari CHOLMOD (atau paket lainnya) untuk menyelesaikan 3D Laplacian pada . n < 300 k105n<300k
Jed Brown
3

Anda tidak cukup jelas dalam pernyataan masalah ketika Anda berbicara tentang "elemen bukan nol yang sama (hanya nilai yang berbeda)" Apakah Anda mengatakan bahwa matriks memiliki pola sparsity yang konstan tetapi nilai aktualnya berubah? Atau, apakah Anda mengatakan bahwa matriks itu sebenarnya konstan?

Dengan asumsi bahwa matriks jarang adalah konstan dan hanya sisi kanan yang berubah, maka Anda harus melihat metode yang menggunakan faktorisasi langsung (dari bentuk ) dari matriks, dan kemudian selesaikan untuk setiap sisi kanan dengan maju / substitusi mundur. Setelah faktorisasi selesai, masing-masing solusi akan sangat cepat ( waktu untuk faktor yang sangat padat tetapi untuk faktor jarang ini akan sebanding dengan jumlah nonzero dalam faktor.) O ( n 2 )PA=LUO(n2)

Untuk beberapa sisi kanan dan sistem persamaan ukuran ini, metode berulang biasanya tidak bernilai.

Semua paket yang Anda sebutkan menawarkan metode faktorisasi langsung (meskipun PetSc sebagian besar dikenal karena solvernya yang berulang). Namun, sistem Anda sangat kecil sehingga kecil kemungkinan Anda bisa mendapatkan speedup paralel yang substansial, terutama di lingkungan memori terdistribusi.

Saya akan menyarankan menggunakan Umfpack untuk pekerjaan ini - PaStix dan PetSc adalah berlebihan.

Brian Borchers
sumber
Terima kasih atas jawaban anda. Untuk mengklarifikasi: Saya pertama meminta matriks tunggal dengan banyak sisi kanan, dan kemudian, masalah lain adalah kumpulan matriks dengan pola sparsity yang sama tetapi nilainya berubah, masing-masing harus dipecahkan untuk banyak rhs. Pertanyaan tambahan: bagaimana jika matriks sparse sekarang 10 ^ 5x10 ^ 5 hingga 10 ^ 6x10 ^ 6?
nat chouf
2
Aturan praktis saya adalah bahwa solver langsung jarang (mengambil contoh diskritisasi PDE 2d) lebih cepat dari bahkan solver iteratif yang baik jika ukuran matriks kurang dari . Itu mungkin dugaan kasar, tetapi mungkin memberi Anda ide. 105
Wolfgang Bangerth
Menggunakan metode berulang untuk sistem Anda yang lebih besar dengan hanya satu sisi kanan mungkin masuk akal, terutama jika Anda tidak memerlukan solusi yang sangat akurat dan terutama jika Anda dapat menemukan prekondisi yang efektif atau sistem Anda sudah terkondisi dengan baik. Namun, jika sistem Anda dikondisikan dengan buruk, Anda membutuhkan solusi yang akurat, dan Anda tidak dapat menemukan prekondisi yang baik, maka Anda mungkin masih akan lebih baik dengan faktorisasi langsung.
Brian Borchers
Pertimbangan penting lainnya adalah persyaratan memori. Setelah Anda memasuki sistem jarang yang sangat besar di mana berada di urutan , Anda dapat dengan mudah kehabisan memori untuk menyimpan faktorisasi langsung. Pada titik ini Anda pasti akan dipaksa untuk beralih menggunakan metode berulang. 10 6N106
Brian Borchers