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!
Jawaban:
Jika Anda tidak menggunakan AMR dan tidak ingin skala melebihi 1K-4K core maka lakukan saja ini.
Peringkat 0 membaca seluruh mesh dan mempartisinya menggunakan METIS / Scotch dll. (Catatan: Ini adalah operasi serial).
Peringkat 0 menyiarkan info partisi elemen / simpul ke semua peringkat lainnya dan membebaskan memori (digunakan untuk menyimpan mesh)
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).
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 .
sumber
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.
sumber
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,
sumber