Metodologi Terbaik untuk Mengelola Mesh dalam Komputasi Elemen Hingga Sejajar?

11

Saat ini saya sedang mengembangkan metode dekomposisi domain untuk solusi dari masalah hamburan. Pada dasarnya saya memecahkan sistem Helmholtz BVP secara iteratif. Saya discretize persamaan menggunakan metode elemen hingga lebih dari segitiga atau tetrahedral jerat. Saya sedang mengembangkan kode menuju tesis Phd saya. Saya menyadari beberapa pustaka elemen hingga yang ada di luar sana seperti deal.ii atau DUNE dan meskipun saya pikir mereka hebat, dengan desain dan API yang menginspirasi, untuk tujuan pembelajaran saya ingin mengembangkan aplikasi kecil saya sendiri dari awal.

Saya berada pada titik di mana saya menjalankan versi serial saya dan sekarang saya ingin memparalelkannya. Bagaimanapun, ini adalah salah satu kekuatan kerangka dekomposisi domain untuk merumuskan algoritma yang mudah diparalelkan, setidaknya secara prinsip. Namun dalam praktiknya, ada banyak detail yang harus dipertimbangkan. Manajemen mesh adalah salah satunya. Jika aplikasi adalah untuk mencapai resolusi tinggi sambil scaling baik untuk banyak CPU replikasi dari seluruh jala pada setiap CPU tidak efisien.

Saya ingin bertanya kepada pengembang yang bekerja pada aplikasi serupa di lingkungan komputasi kinerja tinggi bagaimana mereka menangani masalah ini.

Ada p4est library untuk manajemen mesh terdistribusi. Saya tidak perlu AMR jadi mungkin ini berlebihan karena saya hanya tertarik menggunakan jerat yang seragam dan saya tidak yakin apakah bisa memperbaiki jerat segitiga. Saya juga bisa membuat mesh yang seragam lalu memasukkannya ke dalam salah satu partisi mesh dan melakukan beberapa pemrosesan postingan dari output.

Pendekatan paling sederhana tampaknya membuat file terpisah untuk setiap partisi yang berisi informasi mesh yang hanya relevan untuk partisi tertentu. File ini akan dibaca oleh satu CPU yang akan bertanggung jawab untuk perakitan sistem diskrit pada bagian mesh tersebut. Tentu saja, beberapa konektivitas global partisi / informasi lingkungan juga perlu disimpan dalam file yang dibaca oleh semua CPU untuk komunikasi antar proses.

Apa pendekatan lain di luar sana? Jika beberapa dari Anda dapat berbagi, apa saja metodologi yang biasa digunakan dalam industri, atau lembaga penelitian pemerintah yang terkait dengan penanganan masalah ini? Saya cukup baru dalam memprogram pemecah elemen hingga paralel dan saya ingin merasakan apakah saya memikirkan masalah ini dengan benar dan bagaimana orang lain mendekatinya. Setiap saran atau petunjuk untuk artikel penelitian yang relevan akan sangat dihargai!

Terima kasih sebelumnya!

midurad
sumber
Jika Anda mencari partisi mesh - METIS akan menjadi pilihan yang baik. Periksa juga ParMETIS. Mengelola jerat adalah cerita yang berbeda, ITAPS iMesh dapat menjadi solusi untuk Anda. Silakan periksa juga jawaban untuk pertanyaan saya di sini: scicomp.stackexchange.com/questions/4750/…
Krzysztof Bzowski
@ KrzysztofBzowski: apakah Anda pernah menggunakan perpustakaan Scotch juga? Saya bertanya-tanya apa perbedaan antara Scotch dan Metis dalam hal elemen hingga. Proyek iMesh tampaknya sangat menarik. Saya akan membacanya lebih lanjut dalam beberapa hari ke depan. Saya tahu tentang kesepakatan. II, dan DUNE. Saya ingat melihat ke openMesh beberapa waktu yang lalu tetapi berpikir bahwa akan lebih mudah untuk mengimplementasikan fungsi yang saya butuhkan dari awal. Untuk jerat berurutan, pada dasarnya saya mengadaptasi struktur data setengah sisi / wajah yang disajikan dalam tautan makalah ini. Terima kasih!
midurad

Jawaban:

7

Jika Anda tidak menggunakan AMR dan tidak ingin skala melebihi 1K-4K core maka lakukan saja ini.

  1. Peringkat 0 membaca seluruh mesh dan mempartisinya menggunakan METIS / Scotch dll. (Catatan: Ini adalah operasi serial).

  2. Peringkat 0 menyiarkan info partisi elemen / simpul ke semua peringkat lainnya dan membebaskan memori (digunakan untuk menyimpan mesh)

  3. Semua peringkat membaca node / elemen yang mereka miliki (termasuk ghost node) dari file input yang sama (Catatan: 2000 peringkat mengakses file input yang sama mungkin terdengar lambat tetapi tidak dalam praktiknya, meskipun mungkin buruk untuk sistem file tetapi kemudian kami melakukannya hanya sekali).

  4. Semua peringkat perlu membuat pemetaan node / elemen / dof lokal ke global untuk aplikasi BC dan perakitan matriks dan beri nomor baru pada node.

Setelah semuanya dikatakan dan dilakukan semua data pada peringkat akan menjadi lokal sehingga Anda harus dapat skala dengan baik (berdasarkan ingatan). Saya melakukan semua ini di sekitar 100 baris (lihat baris 35-132 di sini ) dalam kode kecil saya.

Sekarang jika mesh Anda terlalu besar (mis.,> 100-250 juta elemen) sehingga Anda tidak dapat mempartisi menggunakan METIS pada satu node dan membutuhkan ParMETIS / PT-Scotch maka Anda memiliki pekerjaan tambahan mempartisi secara paralel sebelum semua core / jajaran bisa membacanya. Dalam skenario seperti itu, akan lebih mudah untuk memisahkan fase partisi dari kode utama karena alasan logistik.

Btw AMR libs biasanya tidak melakukan tets. Juga PETSc adalah pilihan yang baik untuk memparalelkan kode Anda.

Sunting: Juga lihat di sini dan di sini .

stali
sumber
Terima kasih telah membagikan kode Anda! Saya kemungkinan besar akan mengambil rute yang telah Anda uraikan di atas. Tampaknya yang paling rumit dan saya sudah punya ide tentang bagaimana melakukannya. Selain itu akan menjadi latihan yang baik dalam pemrograman MPI. Anda menyebutkan bahwa lib AMR biasanya tidak menangani tets. Apakah itu karena penyempurnaan naif pada katakanlah quad-tree dari jerat segitiga dapat menyebabkan kualitas mesh yang buruk? Pemurnian quads tampaknya mudah tetapi memecah tet menjadi empat tampaknya sulit jika seseorang ingin mempertahankan kualitas. Apakah mungkin ada pembungkus C ++ untuk PETSc? Saya bisa menggunakan C, tetapi C ++ akan lebih baik.
midurad
@midurad Jika Anda lebih suka C ++ daripada C, Anda harus mempertimbangkan Trilinos, yang merupakan pustaka C ++ yang sebanding dengan PETSc. Selain itu, Trilinos memiliki paket (Zoltan) yang dapat Anda gunakan untuk melakukan partisi mesh.
Dr_Sam
@midurad Anda hanya perlu sedikit panggilan MPI jika Anda menggunakan PETSc. Menyempurnakan tets harus mudah tetapi berurusan (efisien) dengan struktur data dinamis terkait mungkin memerlukan beberapa pemikiran dan pekerjaan. Anda harus dapat menggunakan PETSc dengan C ++ tetapi mengingat persyaratan Anda libmesh mungkin merupakan opsi yang layak (saya pikir ini mendukung AMR dan tets).
stali
Terima kasih atas informasinya. Itu sangat membantu.
midurad
2

Ini mungkin tidak mengejutkan bagi Anda mengingat saya mengembangkan kesepakatan. II, tapi inilah perspektif saya: Ketika saya berbicara dengan siswa, saya biasanya memberi tahu mereka untuk mengembangkan prototipe mereka sendiri di awal sehingga mereka dapat melihat bagaimana hal itu dilakukan. Tapi kemudian, setelah mereka memiliki sesuatu yang berjalan kecil, saya membuatnya menggunakan perpustakaan yang memungkinkan mereka untuk melangkah lebih jauh karena mereka tidak harus menemukan kembali roda dengan pada dasarnya setiap langkah yang mereka ambil.

Dalam kasus Anda, Anda telah melihat bagaimana menerapkan pemecah Helmholtz sederhana. Tetapi Anda akan menghabiskan 6 bulan ke depan menulis kode yang diperlukan untuk melakukannya secara paralel, Anda akan menghabiskan 3 bulan lagi jika Anda ingin menggunakan geometri yang lebih rumit. Anda kemudian akan menghabiskan 6 bulan lagi jika Anda menginginkan pemecah yang efisien. Dan selama ini Anda menulis kode yang sudah ditulis oleh orang lain dan itu, dalam arti tertentu, tidak membuat Anda semakin dekat dengan apa yang sebenarnya perlu Anda lakukan untuk PhD Anda: kembangkan sesuatu yang baru yang belum dilakukan sebelumnya. Jika Anda melalui jalan ini, Anda akan menghabiskan 2-3 tahun waktu PhD Anda untuk melakukan kembali apa yang telah dilakukan orang lain, dan mungkin 1 tahun melakukan sesuatu yang baru.

Alternatifnya adalah Anda sekarang menghabiskan 6 bulan mempelajari salah satu perpustakaan yang ada, tetapi setelah itu Anda akan memiliki 2-3 tahun di mana Anda benar-benar melakukan hal-hal baru, hal-hal di mana setiap minggu Anda dapat berjalan ke kantor penasihat Anda dan menunjukkan kepadanya / sesuatu yang benar-benar baru, yang beroperasi dalam skala besar secara besar-besaran, atau sangat keren dalam hal lain. Saya pikir Anda mungkin melihat ke mana saya akan pergi dengan ini sekarang.

Wolfgang Bangerth
sumber
3
Pertanyaan jujur ​​karena Anda jelas-jelas merupakan otoritas dalam hal ini: siapa yang akan menulis kerangka kerja generasi berikutnya seperti kesepakatan.ii jika tidak ada seorang pun dalam jajaran mahasiswa PhD saat ini yang menangani masalah seperti ini? Kami sudah melihat tren yang bermasalah dari mahasiswa PhD yang datang yang bahkan belum pernah menyusun program. Ini sedikit mengganggu bagi saya bahwa keterampilan dev kode rata-rata tampaknya terus menurun dalam ilmuwan komputasi.
Aurelius
1
Itu pertanyaan yang wajar. Anda memerlukan mahasiswa pascasarjana yang berkepala dingin dan keras kepala seperti saya :-) Tetapi jawaban saya adalah bahwa hanya karena kita mungkin memerlukan beberapa orang yang melakukannya, itu tidak berarti bahwa kita harus mendorong semua orang untuk menghabiskan bertahun-tahun dalam hidup mereka berulang-ulang apa yang sudah diterapkan orang lain.
Wolfgang Bangerth
2
Ya, cukup adil. IMO, satu-satunya hal terbesar yang menahan dunia penelitian CFD selama 20 tahun terakhir adalah kurangnya bakat rekayasa perangkat lunak dan penolakan praktik perangkat lunak modern oleh para greybeards. Selain kerangka kerja, begitu banyak mahasiswa PhD ditahan oleh kode warisan yang buruk dan ketidakmampuan untuk dengan cepat membangun potongan-potongan perangkat lunak yang kompleks yang diperlukan untuk metode numerik modern pada perangkat keras modern.
Aurelius
Saya tidak setuju dengan pernyataan tentang para greybeards (meskipun punyaku sudah mulai kelabu belakangan ini ...). Tetapi mereka juga melihat bahwa Anda harus memilih antara kode warisan kasar atau menciptakan kembali roda ketika Anda memiliki mahasiswa pascasarjana baru. Sangat sedikit orang yang menikmati kesuksesan dengan perangkat lunak yang mereka tulis (penulis saat ini tidak bertahan), dan Anda tidak ingin mengirim mahasiswa pascasarjana yang menjanjikan ke jalan itu jika Anda tidak tahu bahwa mereka dapat membuat karir itu.
Wolfgang Bangerth
0

Ini bukan jawaban yang lengkap.

Untuk implementasi metode dekomposisi domain paralel, saya menemui beberapa komplikasi. Pertama, seseorang dapat menggunakan banyak prosesor untuk satu subdomain atau memberi makan satu prosesor dengan banyak subdomain dan satu mungkin ingin menerapkan kedua paradigma. Kedua, bentuk metode dekomposisi domain yang terstruktur memerlukan pemisahan wajah, tepi, dan simpul dari subdomain. Saya tidak berpikir komplikasi ini sudah termasuk dalam manajemen mesh paralel. Situasi menjadi lebih sederhana jika Anda mempertimbangkan satu prosesor untuk satu subdomain dan menggunakan metode RAS / RASHO yang tumpang tindih. Bahkan dalam kasus ini, Anda akan mengelola sendiri tata letak paralel Anda dengan lebih baik,

Hui Zhang
sumber