C ++ atau Python untuk pengembangan pustaka CFD

13

Apa yang akan Anda katakan akan menjadi keuntungan / kerugian dari dua pendekatan untuk pengkodean perpustakaan umum (volume terbatas, fem, dg) untuk Computational Continuum Mechanics? Ini adalah bagaimana saya melihat sesuatu sekarang, jadi tolong berikan pengalaman Anda sendiri dan jangan nyalakan saya untuk saya :):

1) C ++:

  • pemrograman generik, fungsi virtual, kelebihan beban, kecepatan ...: semua alat + OOP genre yang tersedia untuk membangun apa pun yang Anda inginkan

  • perpustakaan tingkat rendah tersedia sebagian besar (tidak ada penyebaran ilmu luas & pengembangan perpustakaan rekayasa seperti yang untuk Python)

2) Pembungkus Python + untuk komputasi paralel (pyOpenCL dan lainnya)

  • sejumlah besar lib pendukung dari berbagai jenis

  • kode apa yang Anda pikirkan: implementasi dilakukan dengan sangat cepat

  • waktu eksekusi lebih lambat

Jika Anda ingin membuat kode kerangka kerja yang akan mendukung berbagai metode, bekerja dengan geometri dan masalah yang kompleks, apa yang akan Anda pilih dan mengapa?

tmaric
sumber
1
Saya tidak terlalu terbiasa dengan pyOpenCL, tetapi secara umum Python akan terlalu lambat bahkan untuk masalah berukuran sedang dalam 2D ​​atau 3D, kecuali jika "kernel" komputasi Anda diimplementasikan dalam bahasa tingkat rendah (Fortran, C, dll. )
David Ketcheson

Jawaban:

14

Saya akan bertujuan untuk mendapatkan yang terbaik dari kedua dunia dan kode "antarmuka pengguna" (yaitu, kerangka fungsi yang akan memanggil pengguna perpustakaan Anda untuk menggambarkan geometri dan sifat-sifat lain dari masalah) di Python untuk mendapatkan yang cepat waktu penyelesaian, kemudian tulis waktu menjalankan simulasi dalam C ++.

Bahkan, saya mungkin akan mengejek bahkan simulasi waktu berjalan di Python pertama, kemudian menggantinya dengan kode C ++ sepotong demi sepotong. Akhirnya, Anda dapat mempertimbangkan memiliki kode Python Anda menghasilkan sumber C ++, untuk dikompilasi dan ditautkan ke runtime Anda secara online, sehingga simulasi yang sebenarnya tidak perlu memanggil ke Python sama sekali - hanya mengembalikan hasil pada akhirnya. Yang menyenangkan tentang pengaturan ini adalah bahwa ia pada dasarnya gesit: Anda mulai dengan solusi kerja tercepat dan termudah, Anda akan mengetahui dengan cepat apa yang berhasil dan tidak berfungsi, dan begitu Anda memiliki sesuatu yang Anda sukai, Anda dapat mulai mempercepatnya.

(Ini adalah cara kerja pemecah ODE / DAE Maple, kecuali menggunakan Maple bukan Python. Pengungkapan penuh: Saya bekerja untuk mereka.)

Erik P.
sumber
1
+1. Salah satu bit bagus dari Python adalah kemampuan untuk menjauh dari "Pure Python" jika diperlukan.
Fomite
3

Anda juga dapat menggunakan Cython untuk algoritme Anda. Ini pada dasarnya adalah Python dengan menambahkan informasi jenis untuk beberapa variabel yang harus "cepat". Ini menerjemahkan kode Python ke kode C, yang selanjutnya dapat dikompilasi oleh kompiler C favorit Anda. Penambahan informasi jenis ini dengan hati-hati dapat membuat kode Anda hingga 150 kali lebih cepat daripada kode Python yang naif.

Daniel Eberts
sumber
2

Saya pikir ada lebih banyak pertanyaan ini. Pertama dan terutama seorang pengembang biasanya akan lebih suka apa yang ia kenal kecuali jika ada keuntungan yang signifikan (misalnya dalam produktivitas, waktu pengembangan dan alat). Secara pribadi, saya mengutamakan produktif (waktu biasanya adalah sumber daya yang paling langka!) Dan ini mendukung pilihan yang dekat dengan basis pengalaman saya.

Mungkin juga relevan untuk diperhitungkan

3) Waktu pengembangan

  • berapa banyak waktu yang disediakan untuk pengembangan
  • kapan hasil pekerjaan disampaikan? dan bagaimana?
  • apakah sudah ada kode yang dapat melakukan pekerjaan? (keunikan?)

4) Pemeliharaan

  • berapa banyak (orang) sumber daya yang dikhususkan untuk pemeliharaan?
  • berapa banyak orang yang mengerjakan kode?
  • Apakah kode akan dirilis di beberapa titik? (kriteria?)
  • apakah kode akan bergantung pada perpustakaan pihak ketiga?

5) Masalah perizinan

  • adalah kode untuk penelitian?
  • Apakah kode untuk aplikasi komersial?

6) Faktor Produktivitas dan Kegembiraan (sering diabaikan!)

  • Di mana seseorang bisa paling produktif?
  • Di mana orang bisa mengalami perkembangan yang paling menyenangkan?
  • Adakah peluang untuk menjadi bagian dari jaringan (sosial)?
Allan P. Engsig-Karup
sumber
2

Ini tergantung apakah kode Anda dapat ditulis sebagai:

some_library_specific_type grid;

for t=0 to T do
    library_function_1(grid,...);
    library_function_2(grid,...);
end

atau lebih tepatnya harus ditulis seperti ini:

some_home_made_mixture_of_native_types grid;

for t=0 to T do
    for all grid elements as g do
        some_function(g,...);
        library_function(g,...);
    end
end

Dalam kasus pertama pilih apa yang paling Anda sukai untuk dikodekan; dalam kasus kedua tidak menggunakan bahasa scripting atau bersiap untuk menderita karena waktu eksekusi.

mbq
sumber
2

Sebagai jawaban wajar bagi Allan (bahwa waktu pengembang Anda sendiri adalah sumber daya paling berharga): Gunakan apa yang sudah dilakukan orang lain. Anda mengatakan bahwa Anda ingin mengembangkan perpustakaan untuk mekanika kontinum komputasional tetapi sudah ada beberapa yang begitu besar sehingga mereka hampir selalu sudah memiliki semua yang Anda butuhkan. Lihatlah deal.II misalnya untuk segala sesuatu yang dapat ditulis sebagai masalah elemen hingga, OpenFOAM untuk dinamika fluida, atau PyCLAW / CLAWPACK untuk masalah hiperbolik. deal.II, misalnya, meminta Anda untuk memprogram dalam C ++ tetapi pada kenyataannya tingkat pemrograman seringkali sangat tinggi sehingga orang bisa mengatakan itu seperti bahasa khusus domain untuk kode FEM menggunakan sintaksis C ++.

Wolfgang Bangerth
sumber
2
Saya belum pernah menemukan perpustakaan yang memiliki semua yang saya butuhkan ...
Jack Poulson
Yah, tapi Anda mengerti maksud saya. Beberapa perpustakaan memiliki "hampir semua" yang mungkin Anda butuhkan. Untuk hanya mengutip contoh yang sangat saya kenal, pemecah elemen hingga pada self-adaptif, 3d jerat berjalan pada lebih dari 10.000 prosesor menggunakan baris kode deal.II dan PETSc 126. Itu jelas lebih dari nol, tetapi sebenarnya jumlah yang sangat kecil mengingat kompleksitas apa yang ada di bawah tenda.
Wolfgang Bangerth
Untuk berperan sebagai advokat iblis, itu sepele untuk menjalankan kode pada 10.000 core, tapi itu masalah yang sama sekali berbeda untuk membuatnya scalable. Tidak banyak prekondisi paralel untuk persamaan non-elips bahkan dapat berjalan secara efisien pada 300 core.
Jack Poulson
Tentu. Tapi contoh saya mengutip adalah scalable: math.tamu.edu/~bangerth/publications/2010-distributed.pdf .
Wolfgang Bangerth
Untuk kepentingan pengungkapan penuh: Saya adalah salah satu penulis makalah dan kode yang dirujuk di atas, dan juga dari kesepakatan. Pustaka II pada umumnya.
Wolfgang Bangerth