Efisiensi menggunakan petsc4py vs c / c ++ / fortran

11

Seberapa lambatkah petsc4py vs c / c ++ / fortran?

Saya menyadari itu akan sangat tergantung pada kode yang dieksekusi, tetapi bagaimana dengan sesuatu yang sederhana seperti produk matriks-vektor?

Andrew Spott
sumber

Jawaban:

11

Ini adalah keprihatinan yang dipegang secara luas dalam komunitas pemrograman ilmiah, dan saya akan menganggap ketidakpastian kinerja sebagai salah satu "mitos" utama dalam ilmu komputasi.

Seperti yang dibahas oleh @fcruz , petsc4pyadalah pembungkus ke pustaka PETSc, bukan implementasi ulang PETSc dengan Python. Oleh karena itu, Anda dapat mengharapkan hukuman kinerja apa pun yang berasal dari array penyalinan ke dan dari PETSc, atau dari overhead dalam kode driver / panggilan fungsi Anda. petsc4pyditerapkan dengan sangat hati-hati, dan selama Anda memahaminumpyantarmuka array multi-dimensi, Anda dapat menghindari menyalin overhead. Untuk sebagian besar kasus penggunaan tempat saya bekerja, penalti kinerja dalam bekerja di Python adalah di urutan 10-40%, dan saya sering mendapatkan secara substansial dengan cara lain yang lebih dari menebus hit kinerja ini. Faktanya, beberapa pengembang HPC Python yang lebih berpengalaman yang saya ajak bicara berpendapat bahwa perbedaan kinerja ini biasanya dapat dikurangi lebih jauh, dan ketika Python mengemudikan kode komputer yang mahal, ini tentu akan menjadi masalah.

The petsc4pyrepositori itu sendiri memiliki sejumlah contoh yang berguna untuk menggambarkan tradeoff kinerja / fleksibilitas. Lihat di petsc4pyrepositori sumber untuk demo yang disebut perftest, yang memecahkan sistem persamaan nonlinier menggunakan driver Python dan driver C (lebih dari kernel Fortran yang disediakan dalam App.f90direktori itu). Overhead kinerja di sini ada di urutan 10%.

Sebagai contoh konkret, saya adalah bagian dari tim ilmuwan yang bekerja pada PyClaw , paket perangkat lunak yang antarmuka ke PETSc untuk manajemen jaringan paralel dan warisan Fortran kernel untuk memecahkan masalah Riemann pada antarmuka sel. Kami melakukan penelitian yang cukup hati-hati tentang penurunan kinerja karena beralih dari driver Fortran, dan Anda dapat melihat hasilnya di bagian bawah halaman 5 pada Tabel 1 di makalah konferensi . Dalam kasus kami, kami berdagang sedikit kinerja on-core untuk kemampuan untuk dengan mudah menghubungkan kode kami ke PETSc dan Fortran dan berjalan secara efisien secara paralel pada puluhan ribu core.

Aron Ahmadia
sumber
Saya juga memiliki kepedulian yang sama wrt kode kecil tidak terstruktur. PETSc hanya menyediakan struktur data dan solver tetapi saya masih harus membaca di mesh (hingga 4GB file input), partisi, membuat pemetaan, mengulang elemen, menghitung matriks kekakuan lokal (elemen) dll. Sebelum PETSc dapat berkumpul dan menyelesaikan . Bukankah python akan lebih lambat untuk hal-hal yang tidak terkait PETSc ini khususnya I / O, pemetaan dan perhitungan tingkat elemen. Karena sisa kodenya sederhana kok.
stali
Perhitungan tingkat elemen biasanya diteruskan sebagai kernel (lihat App.f90sumbernya di perftest). Tidak ada perbedaan kinerja dalam I / O. Sudahkah Anda melihat FEniCS untuk paket tingkat yang lebih tinggi?
Aron Ahmadia
Kamu benar. Saya mendapatkan ide tetapi dalam kasus khusus saya ada banyak kernel tersebut (fungsi bentuk untuk berbagai jenis elemen, perhitungan tingkat elemen, pemetaan dll) yang merupakan sekitar 90% dari kode. Saya memang melihat Fenics beberapa waktu lalu dan banyak detail seperti berurusan dengan jerat eksternal dan memaksakan BCs dll tidak begitu jelas pada pandangan pertama atau tampak lebih rumit (setidaknya bagi saya). Selain itu saya menggunakan Fortran yang cukup mudah digunakan (diberikan dokumentasi PETSc yang sangat baik) untuk orang-orang non-CS seperti saya. Saya sebenarnya merasa lebih mudah daripada python :) untuk pekerjaan saya.
stali
7

Petsc4py hanyalah cara lain untuk mengakses PETSc tetapi dari python , atau sama dengan mengatakan bahwa, petsc4py menyediakan ikatan sehingga, dari python, Anda dapat mengakses struktur data dan rutinitas PETSc yang dimaksudkan untuk mengurangi upaya pengembangan pemecah paralel PDE (skala itu).

PETSc menyediakan beberapa level abstraksi untuk solvernya, dan Anda bahkan dapat menggunakan PETSc untuk mengimplementasikan solver Anda sendiri. Pada tingkat terendah dari abstraksi perangkat lunak, PETSc menggunakan BLAS, LAPACK, dan MPI, dan yang terbaik adalah secepat penerapannya.

Sekarang, pets4py menggunakan cython untuk mengimplementasikan binding ke PETSc. Overhead menggunakan cython relatif terhadap berapa banyak perhitungan yang akan dilakukan dari PETSc. Jika Anda menggunakan pemecah PDE tingkat tinggi dari PETSc, overhead harus cukup kecil sehingga Anda tidak perlu khawatir tentang mereka.

Pertanyaan yang mungkin lebih penting daripada perbandingan kinerja PETSc vs GEMV adalah apakah PETSc adalah alat yang tepat untuk pekerjaan Anda. Jika Anda perlu mengimplementasikan pemecah paralel PDE non-sepele, maka kemungkinan besar, PETSc akan sangat membantu Anda. Namun, jika Anda perlu melakukan banyak GEMV, Anda ingin perpustakaan BLAS. Semoga berhasil!

fcruz
sumber