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?
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 , petsc4py
adalah 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. petsc4py
diterapkan dengan sangat hati-hati, dan selama Anda memahaminumpy
antarmuka 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 petsc4py
repositori itu sendiri memiliki sejumlah contoh yang berguna untuk menggambarkan tradeoff kinerja / fleksibilitas. Lihat di petsc4py
repositori 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.f90
direktori 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.
App.f90
sumbernya diperftest
). Tidak ada perbedaan kinerja dalam I / O. Sudahkah Anda melihat FEniCS untuk paket tingkat yang lebih tinggi?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!
sumber