C ++ vs Fortran untuk HPC

56

Dalam program PhD sains komputasi saya, kami bekerja hampir secara eksklusif di C ++ dan Fortran. Sepertinya beberapa profesor lebih suka satu daripada yang lain. Saya bertanya-tanya mana yang 'lebih baik' atau apakah yang lebih baik dari yang lain dalam keadaan tertentu.

drjrm3
sumber
12
Campuran bahasa tingkat tinggi dan rendah lebih baik daripada menggunakan secara eksklusif, menurut saya. Misalnya saya menggunakan Python + C ++.
Faheem Mitha
2
Jawaban atas pertanyaan ini akan hampir sepenuhnya subjektif dan karenanya saya tidak yakin pertanyaan ini cocok.
Jeff

Jawaban:

62

Seperti yang sering terjadi, pilihan tergantung pada (1) masalah yang Anda coba selesaikan, (2) keterampilan yang Anda miliki, dan (3) orang-orang yang bekerja dengan Anda (kecuali itu proyek solo). Saya akan menyisihkan (3) untuk sementara karena itu tergantung pada situasi masing-masing orang.

Ketergantungan masalah: Fortran unggul pada pemrosesan array. Jika masalah Anda dapat dijelaskan dalam hal struktur data sederhana dan dalam array tertentu, Fortran diadaptasi dengan baik. Pemrogram Fortran akhirnya menggunakan array bahkan dalam kasus yang tidak jelas (misalnya untuk mewakili grafik). C ++ lebih cocok untuk struktur data yang kompleks dan sangat dinamis.

Ketergantungan ketergantungan: dibutuhkan lebih banyak pengalaman pemrograman untuk menulis program C ++ yang baik daripada menulis program Fortran yang baik. Jika Anda mulai dengan sedikit pengalaman pemrograman dan hanya memiliki begitu banyak waktu untuk mempelajari aspek pekerjaan Anda, Anda mungkin mendapatkan pengembalian investasi belajar Fortran yang lebih baik daripada belajar C ++. Dengan asumsi, tentu saja, bahwa masalah Anda cocok untuk Fortran.

Namun, ada lebih banyak pemrograman daripada hanya Fortran dan C ++. Saya akan merekomendasikan kepada siapa pun yang masuk ke ilmu komputasi untuk memulai dengan bahasa tingkat tinggi yang dinamis seperti Python. Selalu ingat bahwa waktu Anda lebih berharga daripada waktu CPU!

khinsen
sumber
17
"Selalu ingat bahwa waktumu lebih berharga daripada waktu CPU!" Sebagai seseorang yang bekerja di HPC saya tidak setuju dengan bagian itu; segala sesuatu yang lain tepat.
Levi Morrison
19
"Selalu ingat bahwa waktumu lebih berharga daripada waktu CPU!" Sebagai seseorang yang bekerja dalam penelitian ilmiah, saya sangat setuju dengan bagian itu.
decvalts
3
"Selalu ingat bahwa waktumu lebih berharga daripada waktu CPU!" - Saya ingin memasukkan 2 sen saya - menggunakan beberapa ratus node, masing-masing dengan 10+ core untuk menjalankan beberapa program selama beberapa minggu dapat ditafsirkan sebagai pemborosan sumber daya yang paling berharga, jika beberapa minggu lagi dapat menghasilkan kode yang berjalan hanya dalam beberapa hari. Cluster HPC itu adalah sumber daya bersama yang langka dan mahal.
Dani_l
"Selalu ingat bahwa waktu Anda lebih berharga daripada waktu CPU!", Kode selama seminggu tetapi berjalan selama sebulan, ini biasa Pak!
fronthem
6
"Selalu ingat bahwa waktu Anda lebih berharga daripada waktu CPU!", Saya lebih suka kode selama sebulan dan berjalan dalam seminggu! - lebih banyak dapat dilakukan setelah kode ditulis dan yang lain akan menemukan kode yang Anda tulis lebih bermanfaat juga
Charles
37

Saya pikir C ++ dan Fortran cukup baik dan bekerja dengan baik.

Namun saya berpikir bahwa Fortran lebih baik untuk komputasi ilmiah numerik , untuk algoritma yang dapat diekspresikan menggunakan array dan tidak memerlukan struktur data canggih lainnya, jadi dalam bidang seperti perbedaan / elemen yang terbatas, pemecah PDE, perhitungan struktur elektronik. Fortran adalah bahasa khusus domain. Secara khusus saya pikir lebih mudah untuk menulis program cepat di Fortran daripada di C ++, oleh seorang ilmuwan (belum tentu ahli ilmu komputer).

C ++ adalah bahasa tujuan umum, jadi seseorang dapat mengekspresikan algoritma apa pun di dalamnya, dan yang paling pasti lebih baik untuk algoritma yang tidak dapat diekspresikan menggunakan array, dari bidang HPC mungkin beberapa grafik, generator mesh, manipulasi simbolik dan sebagainya.

Dimungkinkan juga untuk menulis algoritma array dalam C ++, tetapi dalam pengalaman saya, itu membutuhkan lebih banyak pengetahuan ilmu komputer dan secara umum lebih banyak pekerjaan (yaitu seseorang perlu membuat atau menggunakan kembali kelas untuk manipulasi array, dan menangani manajemen memori dengan tangan atau menggunakan beberapa perpustakaan seperti Teuchos dari Trilinos). Non-ahli cenderung menulis program Fortran yang cukup bagus, tetapi program C ++ yang mengerikan (berbicara dari pengalaman saya sendiri).

Penafian: Saya pribadi sangat menyukai Fortran dan saya lebih suka daripada C ++ untuk komputasi numerik. Saya telah menghabiskan lebih dari 2 tahun pemrograman dalam C ++ setiap hari, dan hampir setahun pemrograman dalam harian Fortran modern (di area elemen hingga). Saya menggunakan banyak Python dan Cython juga.

Ondřej Čertík
sumber
1
Satu untuk jawaban pertama yang seimbang. Saya pikir C ++ dan Fortran sejauh ini bukan satu-satunya kemungkinan di HPC kontemporer. Saya pikir itu baik untuk mengetahui kekuatan dan titik-titik lemah ketika Anda memutuskan untuk Fortran, C ++ atau Python (atau apa pun yang Anda suka). Saya telah melihat 20.000 baris Fortran dalam satu file tunggal, tumbuh secara organik selama beberapa dekade. Saya pribadi tidak akan menggunakan apa pun selain komputasi array berat yang terisolasi. Bahkan untuk apa pun yang terkait dengan output. Sejauh ini untuk komentar bias.
shuhalo
6
Saya tidak bisa tidak setuju dengan tanggapan ini lebih lanjut. Kode elemen hingga kami tidak mungkin ditulis di Fortran. Bahkan, itu dimulai 15 tahun yang lalu sebagai campuran dari C dan Fortran (yang terakhir adalah untuk bagian-bagian intensif metode ini), dan secara bertahap pindah ke C murni dan kemudian ke C ++ selama beberapa tahun. Kode menjadi lebih pendek secara konsisten, lebih cepat, dan lebih mudah dipahami, dan lebih mampu setelah setiap iterasi. Saya setuju dengan orang lain yang menunjukkan bahwa C ++ memberi Anda banyak tali untuk menembak diri sendiri. Pilih bahasa yang paling Anda sukai.
Bill Barth
6
Bill, apakah Anda menggunakan Fortran modern (tambahan 90 dan yang lebih baru?). Ini sangat penting (saya seharusnya lebih eksplisit dalam jawaban saya tentang ini). Tentu saja, "20.000 baris Fortran", atau f77 biasanya tidak lebih baik daripada C ++ yang ditulis dengan baik.
Ondřej Čertík
1
@ OndřejČertík: Saya pikir jika Anda percaya bahwa program elemen hingga modern menggunakan struktur data "sederhana", maka Anda belum melihat satu pun dari mereka baru-baru ini. Cobalah menerapkan elemen hingga adaptif, metode hp, atau multigrid pada jerat tidak terstruktur menggunakan struktur data sederhana. Bill sangat tepat dan saya percaya saya bisa berbicara untuknya dengan mengatakan bahwa menggunakan "Fortran modern" akan membuat hampir tidak lebih dari perbedaan kecil.
Wolfgang Bangerth
6
@ WolfgangBangerth, lihat misalnya Phaml ( math.nist.gov/phaml ) untuk implementasi Fortran dari hampir semua yang Anda sebutkan.
Ondřej Čertík
31

Saya juga melempar dua sen saya agak terlambat, tapi saya baru saja melihat utas ini dan saya merasa bahwa, untuk anak cucu, ada beberapa poin yang sangat perlu dibuat.

Perhatikan di bawah ini bahwa saya akan berbicara tentang C dan bukan C ++. Mengapa? Nah, kalau tidak itu apel dan jeruk untuk membandingkan bahasa berorientasi objek mengetik dinamis penuh dengan sesuatu yang statis seperti Fortran. Ya, beberapa implementasi modern dari standar Fortran terbaru dapat melakukan lebih dari itu, tetapi sangat sedikit orang yang menggunakannya, dan ketika kita berbicara tentang Fortran, kita berpikir bahasa yang sederhana, statis, dan imperatif. Di situlah C juga, jadi saya akan mengganti C dengan C ++ untuk yang berikut ini.

Pertama-tama, setiap diskusi tentang Fortran / C yang memiliki kompiler yang lebih baik adalah moot. Kompiler C / Fortran khusus adalah sesuatu dari masa lalu. Baik gcc / gfortran dan icc / ifc hanya ujung depan yang berbeda dengan ujung belakang yang sama, yaitu program Anda akan diubah menjadi deskripsi abstrak oleh ujung depan dan kemudian dioptimalkan dan disusun oleh ujung belakang. Jika Anda menulis, secara semantik, kode yang sama di Fortran atau di C, kompiler akan, dalam kedua kasus, menghasilkan rakitan yang sama yang akan berjalan sama cepatnya.

Ini sekarang mengarah pada poin kedua saya: mengapa kita masih melihat perbedaan? Masalahnya adalah bahwa sebagian besar perbandingan dibuat oleh programmer Fortran mencoba sesuatu dalam C atau sebaliknya. Pernah perhatikan bagaimana sebagian besar penulis atau penyair lebih suka menulis dalam bahasa ibu mereka? Apakah Anda ingin menulis puisi dalam bahasa yang Anda tidak merasa percaya diri atau betah? Tentu saja tidak ... Saya sendiri menganggap C sebagai bahasa pemrograman "asli" saya. Namun, saya juga menghabiskan tiga tahun bekerja dalam sebuah kelompok yang hanya menggunakan Fortran, di mana saya telah mencapai tingkat kefasihan tertentu. Namun, saya tidak akan pernah menulis apa pun di Fortran karena saya lebih nyaman dengan C dan, sebagai akibatnya, kode yang dihasilkan akan lebih baik , apa pun yang Anda definisikan sebagai.

Jadi perbedaan utamanya ada pada programmer, bukan bahasa. Jadi tidak ada perbedaan? Ya tidak cukup. Berikut ini beberapa contoh:

  • SIMD: Apakah itu SSE, SSE3 atau AltiVec, jika Anda ingin menggunakannya dalam Fortran, Anda harapan yang lebih baik dan berdoa bahwa dugaan compiler persis apa yang Anda inginkan dan melakukannya begitu. Semoga berhasil. Dalam C Anda umumnya memiliki fungsi intrinsik untuk setiap arsitektur, atau, yang lebih baru, tipe vektor SIMD umum dalam gcc . Kebanyakan kompiler Fortran hanya akan menggunakan instruksi SIMD untuk membuka gulungan, tetapi jika Anda memiliki kernel yang bekerja pada vektor data pendek dengan cara yang tidak jelas, kompiler kemungkinan besar tidak akan melihatnya.

  • Arsitektur perangkat keras yang berbeda: Seluruh arsitektur CUDA dibangun di sekitar kernel di C. Ya, Grup Portland sekarang memiliki kompiler fortran yang mampu CUDA juga, tetapi komersial, dan yang paling penting, itu bukan dari NVIDIA. Hal yang sama berlaku untuk OpenCL, yang terbaik yang bisa saya temukan adalah proyek terbaru yang hanya mendukung beberapa panggilan dasar.

  • Pemrograman paralel: Ya, baik MPI dan OpenMP bekerja dengan baik dengan C dan Fortran. Namun, jika Anda ingin kontrol nyata dari utas Anda, yaitu jika Anda memiliki komputasi shared-memory yang sepenuhnya dinamis, Anda akan kedinginan bersama Fortran. Di C Anda memiliki pthreads standar yang, meskipun tidak hangat dan tidak jelas, masih akan membantu Anda melewati badai. Secara umum, sebagian besar perhitungan yang mengandalkan akses ke sistem operasi, mis. Utas, proses, sistem file, dll ... lebih baik disajikan dengan C. Oh, dan jangan coba-coba membuat jaringan sendiri dengan Fortran.

  • Kemudahan penggunaan: Fortran lebih dekat ke Matlab daripada C. Setelah Anda mempelajari semua kata kunci yang berbeda dan cara mendeklarasikan variabel, sisa kode tersebut terlihat seperti Matlab, membuatnya lebih mudah diakses oleh pengguna dengan pengalaman pemrograman terbatas.

  • Interoperabilitas: Ketika Anda membuat struct dalam C, tata letak data aktual bersifat langsung dan deterministik. Di Fortran, jika Anda menggunakan array pointer atau data terstruktur, tata letak data yang sebenarnya sangat bergantung pada kompiler, tidak lurus ke depan, dan biasanya tidak berdokumen. Anda dapat memanggil C dari Fortran dan sebaliknya, tetapi jangan mulai berpikir mungkin lebih mudah untuk melewatkan sesuatu lebih dari array statis dari satu ke yang lain dan kembali.

Ini semua agak aneh, hal-hal tingkat rendah, tapi ini Komputasi Kinerja Tinggi yang sedang kita bicarakan, kan? Jika Anda tidak tertarik pada cara terbaik mengeksploitasi paradigma perangkat keras yang mendasarinya, yaitu menerapkan dan / atau mengembangkan algoritma yang terbaik untuk memori bersama / didistribusikan, utas, vektorisasi SIMD, GPU menggunakan SIMT, dan sebagainya, maka Anda hanya mengerjakan matematika di komputer.

Ini telah menjadi jauh lebih lama dari apa pun yang saya maksudkan, jadi inilah ringkasannya - satu set pesan yang dapat dibawa pulang:

  • Anda akan menulis kode terbaik yang Anda bisa dalam bahasa yang Anda tahu paling baik.
  • Tidak ada perbedaan dalam kualitas kode yang dihasilkan oleh dua kompiler yang menggunakan back-end yang sama - kitalah yang menulis kode buruk dalam satu bahasa atau lainnya.
  • Meskipun merasa lebih rendah, Fortran adalah abstraksi tingkat tinggi dan tidak akan membiarkan Anda mengakses fitur perangkat keras / OS tertentu secara langsung, misalnya SIMD, utas, jaringan, dll ...
Pedro
sumber
5
Respon yang bagus Namun saya kira komentar akhir Anda tidak selalu benar. Saya sendiri seorang programmer C, tetapi Anda mendapatkan akses ke hal-hal tingkat rendah di Fortran melalui praktik pemrograman yang baik. Cara ideal untuk memanfaatkan hal-hal seperti operasi SIMD adalah menulis kode yang sangat menyarankannya (memblokir loop, misalnya) dan membiarkan kompiler melakukannya untuk Anda. Untuk threading, cukup gunakan openMP (pthreads juga dapat digunakan dengan beberapa pekerjaan tambahan). Fortran memiliki semua hal yang Anda sebutkan tidak, hanya pada tingkat yang penting bagi pengguna umumnya: numerik.
Reid.Atcheson
@ Reid.Atcheson: Ya, jika Anda memblokir semua yang membuat kompiler akan menangkapnya, maka ia akan bekerja secara otomatis baik di C dan di Fortran. Masalahnya adalah, seberapa jauh Anda ingin mempercayai kompiler Anda? Dan mengapa Anda ingin mempercayainya jika Anda tahu persis apa yang ingin Anda lakukan? OpenMP melakukan threading, ya, tetapi blok-bijaksana. Anda dapat mengelabunya agar mendapatkan kumpulan utas yang berbeda untuk melakukan hal yang berbeda, tetapi itu hanya menggunakan OpenMP yang salah. Pthreads untuk Fortran hanyalah pembungkus untuk fungsi C. Saya setuju, bahwa Fortran lebih mudah jika Anda tidak ke rinciannya.
Pedro
1
Tentu Anda tidak akan mendapatkan efisiensi puncak 99% sepenuhnya dengan mengandalkan kompiler, tetapi Anda dapat dengan mudah mendekat. Selain ini, Anda juga harus menggunakan intrinsik atau inline ASM. Anda harus membuat konsesi di suatu tempat untuk efisiensi programmer secara keseluruhan, itu sebabnya bahasa pemrograman ada di tempat pertama. Pada tahap yang sebenarnya Anda cukup gila untuk masuk ke rincian intrinsik atau ASM (saya telah beberapa kali), Fortran bukan penopang. Anda tahu cara menautkan kode yang dioptimalkan dengan tangan Anda.
Reid.Atcheson
@ Reid.Atcheson: Baiklah, saya berpendapat bahwa untuk aplikasi paralel HPC, Anda mungkin berakhir jauh di bawah efisiensi puncak 99% ... Dan tipe vektor gcc menjadikan penggunaan intrinsik sebagai non-masalah :)
Pedro
1
@Pedro, Pos brilian. Sangat brilian. Terima kasih banyak untuk memposting. Baru saja menemukannya saat secara acak mencari-cari melalui utas yang menarik.
Pemeriksaan
16

Dari 15 tahun saya berpikir tentang perangkat lunak ilmiah: Jika kode Anda berjalan 25% lebih cepat karena Anda menulisnya di Fortran, tetapi Anda membutuhkan waktu 4 kali lebih lama untuk menulisnya (tidak ada STL, kesulitan menerapkan struktur data yang kompleks, dll), kemudian Fortran hanya menang jika Anda menghabiskan sebagian besar hari Anda memutar-mutar ibu jari dan menunggu perhitungan Anda selesai. Mengingat bahwa bagi hampir semua dari kita hal yang paling berharga adalah waktu kita sendiri, kesimpulannya adalah ini: gunakan bahasa yang memungkinkan Anda untuk mengembangkan, men-debug dan menguji kode Anda tercepat, dengan alasan mengabaikan bahwa itu mungkin lebih lambat daripada mungkin jika Anda menulisnya di Fortran.

Wolfgang Bangerth
sumber
13

Pendekatan saya adalah menggunakan C ++ untuk semuanya kecuali kernel komputasi, yang biasanya paling baik ditulis dalam assembly; ini memberi Anda semua kinerja pendekatan HPC tradisional tetapi memungkinkan Anda untuk menyederhanakan antarmuka, misalnya, dengan membebani kernel komputasi seperti SGEMM / DGEMM / CGEMM / ZGEMM ke dalam satu rutinitas tunggal, katakanlah Gemm. Jelas tingkat abstraksi dapat dinaikkan jauh lebih tinggi dengan menghindari pointer mentah dan beralih ke kelas buram, tetapi ini adalah langkah pertama yang bagus.

Saya menemukan kelemahan terbesar dari C ++ menjadi peningkatan dalam waktu kompilasi, tetapi, dalam pengalaman saya, penghematan dalam waktu pengembangan lebih dari sekadar menebusnya. Kelemahan lain adalah bahwa kompiler vendor C ++ cenderung memiliki lebih banyak bug daripada kompiler vendor C dan Fortran. Pada tahun lalu, saya pikir saya telah menemukan hampir sepuluh bug dalam kompiler C ++.

Dengan semua itu, saya berpikir bahwa kehancuran paket-paket ilmiah yang ditulis dalam bahasa tingkat rendah (dan Fortran) adalah keengganan untuk mengekspos antarmuka yang nyaman untuk struktur data yang canggih: kebanyakan orang puas dengan antarmuka Fortran BLAS, karena hanya membutuhkan pointer dan dimensi terkemuka untuk menggambarkan matriks, tetapi beberapa orang akan berpendapat bahwa antarmuka pemecah Fortran jarang-langsung 40-integer adalah sesuatu yang dekat dengan nyaman (lih. UHM, SuperLU, PETSc, dan Trilinos).

Singkatnya, saya berpendapat untuk menggunakan perakitan untuk kernel komputasi tingkat rendah, tetapi bahasa tingkat yang lebih tinggi untuk yang lain, terutama ketika beroperasi pada struktur data non-sepele.

y: =αx+y

Jack Poulson
sumber
2
Mengapa Anda tidak mempercayai kompiler C standar dengan optimisasi yang sesuai diaktifkan untuk tujuan mengkompilasi kernel kecil? Pada tingkat ukuran dan kerumitan kode perbedaan dalam apa yang bisa ditarik oleh kompiler tidak jelas.
Peter Brune
1
Saya telah berbicara dengan beberapa orang yang mengatakan kepada saya bahwa, bahkan dengan penggunaan pembatasan yang tepat, Fortran mereka masih lebih cepat daripada kode C dan / atau C ++ mereka untuk beberapa operasi seperti transpose matriks eksplisit. Saya tidak mengatakan bahwa tidak mungkin untuk membuat kode C atau C ++ secepat, tetapi bahwa kompiler Fortran cenderung melakukan pekerjaan yang lebih baik.
Jack Poulson
Saya memiliki pengalaman yang sama dengan kata kunci "batasi" (kode Fortran saya yang sederhana selalu sedikit lebih cepat). Tetapi keahlian saya terbatas, dan saya tidak punya waktu untuk berinvestasi dalam memahami perakitan yang dihasilkan dari gcc. Jadi saya hanya menggunakan Fortran, sederhana dan cepat.
Ondřej Čertík
@JackPoulson: Argumen kompiler adalah sesuatu yang saya dengar sedikit dari komunitas Fortran. Sayangnya, kebanyakan kompiler, misalnya gcc atau ifc / icc, menggunakan front-end bahasa yang berbeda untuk back-end yang sama. Mesin yang melakukan optimasi dan pembuatan kode identik dan oleh karena itu perbedaan dalam hasil kemungkinan besar disebabkan oleh perbedaan dalam keakraban programmer dengan bahasa yang mendasarinya ...
Pedro
1
Hanya untuk memberikan sedikit perspektif tentang klaim yang sering diulang, jarang divalidasi bahwa Fortran lebih cepat pada kernel numerik: Beberapa waktu lalu kami memperhatikan bahwa vektor-vektor jarang dalam paket Epetra Trilinos adalah 30% lebih lambat dari yang ada di kesepakatan.II. Yang pertama ditulis dalam lurus ke depan Fortran 77, yang terakhir dalam lurus ke depan C tanpa menggunakan 'batasan'. Keduanya memiliki sekitar 10-15 baris kode. Hari ini, Trilinos menggunakan potongan kode yang diangkat dari deal.II. Saya yakin orang dapat menemukan banyak kasus di mana F77 lebih cepat dari C. Intinya adalah tidak universal lagi hari ini.
Wolfgang Bangerth
8

Karena saya baru di sini, saya mencari pertanyaan lama dan menemukan yang ini. Semoga itu tidak tabu untuk menjawab yang lama!

Karena tidak ada orang lain yang menyebutkan ini, kupikir aku akan melakukannya. Fortran 2003 hampir sepenuhnya didukung oleh sebagian besar kompiler utama (intel, ibm, cray, NAG, PCG) bahkan gcc dengan rilis terbaru 4.7 (segera). Fortran 2003 (dan 2008) adalah bahasa berorientasi objek, meskipun sedikit lebih verbose daripada C ++. Salah satu hal yang saya anggap baik tentang Fortran adalah fakta bahwa komite standar melihat komputasi ilmiah sebagai audiens utamanya (saya berterima kasih kepada Damian Rouson karena menunjukkan hal ini kepada saya di hari lain).

Saya membawa semua ini tidak sehingga programmer C ++ menjadi programmer Fortran, tetapi agar orang Fortran tahu bahwa mereka memiliki lebih banyak pilihan sekarang selain beralih ke C ++ atau meniru konsep berorientasi objek di Fortran 90/95.

Satu peringatan yang akan saya tambahkan adalah bahwa ada biaya untuk berada di tepi pendarahan dari apa yang diterapkan dalam kompiler. Jika Anda melakukan proyek besar di Fortran 2003 sekarang Anda akan menemukan bug dan terus-menerus perlu memperbarui kompiler Anda (terutama jika Anda menggunakan gcc), meskipun ini telah menjadi jauh lebih baik secara signifikan dalam beberapa bulan terakhir!

Jeremy Kozdon
sumber
7

Masalah dengan C ++ adalah bahwa Anda memiliki banyak peluang untuk merusak kinerja, misalnya dengan membabi buta menggunakan STL, pengecualian, kelas (masalah overhead virtual ditambah masalah penyelarasan), overloading operator (redundant new / delete) atau templat (kompilasi tanpa akhir dan kesalahan samar) tampak jinak, tetapi Anda bisa menghabiskan berjam-jam seperti ini).

Namun, semakin Anda mendapatkan akses yang lebih baik ke perpustakaan umum dan kemungkinan visibilitas kode Anda (meskipun ini sangat tergantung pada bidangnya, dan Anda masih memiliki C murni). Dan Anda masih bisa mengompensasi kurangnya fleksibilitas Fortran dengan membungkus kodenya dalam bahasa skrip seperti R, Lush, Matlab / Scilab atau bahkan Python, Ruby atau Lua.

mbq
sumber
1
Pada umumnya ide yang buruk untuk menerapkan teknik tingkat rendah dalam bahasa tingkat tinggi. Sebagai contoh, STL dirancang untuk beroperasi pada tingkat yang sangat abstrak. Kita harus menyadari apa antarmuka dirancang untuk itu, menggunakannya untuk tugas ini dan kemudian keluar dari jalan kompiler.
shuhalo
2
Saya pikir poin mbq dan Martin tidak adil. Ya, ada beberapa cara untuk menembak diri sendiri jika Anda mencoba menerapkan vektor numerik untuk keperluan aljabar linier menggunakan std :: list <double>. Tapi itu argumen konyol: setidaknya C ++ memiliki kelas daftar tertaut yang dapat Anda gunakan, sedangkan Fortran tidak. Itu seperti mengatakan "Mobil melaju dengan kecepatan tinggi sehingga Anda bisa menabrak dinding dan terluka; Anda sebaiknya menggunakan kereta kuda." Itu hanya ide konyol untuk membuang bahasa tingkat tinggi yang juga mendukung hal-hal tingkat rendah (misalnya C ++) karena memiliki fitur tingkat tinggi.
Wolfgang Bangerth
@WolfgangBangerth Tidak, sekarang Anda menyakiti Fortran - itu adalah "tingkat rendah" karena bakteri "kurang berevolusi" daripada manusia. Jika Anda ingin analogi mobil, itu harus lebih seperti "Anda dapat menggunakan Jeep dan Lexus untuk menyeberang jalan berawa, tetapi menggunakan yang pertama tidak terlalu menyakitkan".
mbq
1
Saya menghargai pendapat Anda, tetapi saya berpendapat bahwa Fortran tidak berevolusi seperti C ++ :-)
Wolfgang Bangerth
7

Tiga fakta:

  • Array n-dimensi gaya F77 dalam C: Tidak ada masalah menggunakan CnD (steker yang tidak tahu malu, harus diakui)

  • Sistem modul F90 dirancang dengan buruk dan tidak bersahabat untuk membangun lingkungan. (Nama modul tidak harus cocok dengan nama file, misalnya)

  • Fortran tidak mendukung refactoring dengan baik. Menarik sedikit fungsionalitas dari suatu fungsi mengharuskan Anda menyentuh empat tempat: Kode aktual, deklarasi variabel, deklarasi argumen, dan daftar argumen. C bertahan dengan dua tempat untuk disentuh. Ini memperparah efek dari kegagalan mengelola data dengan baik (dijelaskan di bawah): Karena modularitas skala kecil sangat menyakitkan, hampir semua orang menulis subrutin raksasa.

Satu kesan pribadi:

  • Fortran tidak berfungsi dengan baik untuk mengelola data. Coba kembalikan pointer ke struktur data buram pengguna di F77 atau F90. ( transfer(), kami datang)
Andreas Klöckner
sumber
Hai Andreas! CnD menarik, saya tidak tahu. Ah, kamu yang menulisnya. :) (f90 juga mendukung slicing, dapat dialokasikan untuk array dan yang paling penting - sintaks array untuk perkalian, penjumlahan, dan sebagainya.) Saya menggunakan CMake dengan Fortran dan bekerja sangat baik dengan modul. Apa sebenarnya "daftar argumen"? Saya tidak berpikir saya menggunakan ini, jadi hanya 3 tempat yang diperlukan untuk memodifikasi. Dalam C, Anda biasanya perlu memodifikasi kode aktual, parameter, dan file header, jadi itu juga 3 tempat (paling pasti di C ++). Ya, transfer () tidak super bagus, tetapi biasanya Anda tidak memerlukannya dalam praktik.
Ondřej Čertík
3
Refactoring fortran modern sepele dengan IDE yang tepat, seperti Photran dalam gerhana.
2
"Nama modul tidak harus cocok dengan nama filenya, mis." Anda pasti bercanda, Anda dapat memiliki banyak modul dalam satu file. Beberapa dari mereka hanya menjangkau beberapa baris. Mereka lebih mudah dibuat jika Anda tidak harus membuat file untuk masing-masing.
Vladimir F
1
Hanya ingin menambahkan apa yang dikatakan @ user389, sementara Photran hebat dan merupakan satu-satunya Fortran IDE yang memungkinkan perbaikan, parsernya gagal setiap saat. Di sisi lain, tidak perlu mengomentari fakta bahwa Eclipse haus akan memori.
astrojuanlu
5

Fortran dioptimalkan untuk komputasi array / matriks dan sangat sulit untuk digunakan untuk semua jenis penguraian teks. C dan C ++ mungkin tidak cocok dengan Fortran dalam komputasi numerik (sudah dekat), tapi saya merasa jauh lebih mudah untuk memproses teks dan mengatur data (yaitu struktur data khusus) dengan C / C ++.

Seperti yang telah disebutkan orang lain, jangan hitung bahasa dinamis yang ditafsirkan (Python et al). Mereka mungkin tidak menawarkan kecepatan melelehkan wajah Fortan di depan, tetapi mereka memungkinkan Anda untuk lebih fokus pada memecahkan masalah komputasi Anda daripada semua detail implementasi. Seringkali Anda dapat mengimplementasikan solusi dengan Python, dan jika kinerjanya tidak dapat diterima, lakukan profil, identifikasi area masalah, dan optimalkan kode tersebut menggunakan Cython atau implementasikan kembali seluruh program dalam bahasa yang dikompilasi. Setelah Anda memiliki logika penyelesaian masalah, sisanya hanya implementasi dan, dengan pemahaman yang baik tentang dasar-dasar komputasi, harus mudah untuk diwakili dalam berbagai bahasa pemrograman.

Daniel Standage
sumber
Tepat sekali. Untuk parsing teks saya juga menggunakan Python.
Ondřej Čertík
Anda juga dapat mengimplementasikan bagian dari skrip Python dalam bahasa yang dikompilasi misalnya C ++ dan menghubungkannya. Misalnya Tingkatkan Python, Swig, dll.
Faheem Mitha
4

Saya saat ini bekerja di salah satu laboratorium nasional. Sebagian besar orang di sekitar saya adalah insinyur mesin. Mengobrol dengan beberapa orang di grup HPC, mereka kebanyakan melakukan Linux dan sebagian besar C ++. Grup saya saat ini kebanyakan melakukan aplikasi desktop dan kami menggunakan Windows dan dalam urutan menurun: C #, FORTRAN, Python, VBA, dan VB (6, bukan .NET). Beberapa mesin simulasi yang kami gunakan ditulis di laboratorium nasional lain di FORTRAN.

Tangurena
sumber
4

Maaf telah menggali utas lama tetapi tampaknya bahkan pada 2015, Fortran banyak digunakan.

Aku hanya menemukan ini (alternatif link yang ) daftar yang pada dasarnya adalah daftar 13 kode disetujui oleh fasilitas OCLF DOE untuk berjalan di mesin 300-petaFLOPS Summit yang akan dibuat tersedia untuk para peneliti di 2018. Saya mencoba untuk menemukan bahasa utama yang digunakan untuk kode (berdasarkan pencarian google cepat) dan inilah yang saya temukan:

XGC Fortran

SPECFEM Fortran

ACME Fortran (Bunch of climate codes)

DIRAC Fortran (Mostly)

FLASH Fortran

GTC Fortran

HACC C/C++

LS-DALTON Fortran (some C)

NAMD C/C++

NUCCOR Fortran

NWCHEM Fortran

QMCPACK C++

RAPTOR Fortran

Jadi dari 13 kode, setidaknya 10 (berdasarkan pencarian cepat saya) tampaknya ditulis dalam Fortran. Lumayan untuk bahasa yang berumur 50 tahun.

CATATAN: Saya sangat menyadari bahwa perbandingan bahasa tidak berguna tetapi mengingat jumlah orang (khususnya pengguna C ++) yang buruk di mulutnya, saya pikir mungkin ada baiknya untuk menyebutkannya.

stali
sumber
3
Saya tidak setuju, karena pengalaman saya di laboratorium nasional justru sebaliknya. Sebagian besar proyek baru yang saya lihat di Lawrence Livermore ditulis dalam C ++, dan sebagian besar perpustakaan open-source state-of-the-art yang baru dalam pemecah ODE, diskritisasi FEM, dan perpustakaan komputasi ilmiah untuk keperluan umum tampaknya berada di C atau C ++. Fortran tampaknya terutama digunakan dalam proyek-proyek yang menggunakan perpustakaan yang ada / warisan; Saya tidak melihat banyak proyek besar dan baru menggunakan Fortran, terlepas dari apa yang saya pikirkan tentang bahasa tersebut.
Geoff Oxberry
Beberapa kode teori fungsional kerapatan juga ditulis dalam Fortran termasuk VASP dan CASTEP , meskipun seperti yang ditunjukkan @GeoffOxberry, proyek-proyek baru cenderung mengarah ke C ++.
dr.blochwave
@ blochwave Seperti yang dapat Anda baca di tautan, proyek-proyek ini untuk mesin baru (dengan akselerator dll.) yang akan online pada tahun 2018. Jadi tidak seperti mereka mengambil kode 25 tahun dan mengkompilasinya, berharap berjalan dengan baik kinerja. Saya yakin sebagian besar kode dalam daftar di atas telah atau telah ditulis ulang, seperti dalam kode baru. Sejumlah kode iklim "baru" juga ada di Fortran dan digunakan oleh banyak lembaga di sejumlah negara.
stali
0

Apa yang Jack P. saya pikir coba katakan adalah bahwa Anda harus bergaul dan cocok. Sepotong perangkat lunak yang bagus dilapisi dengan hati-hati. Lapisan yang berbeda dapat memetakan lebih alami, atau efisien, ke bahasa yang berbeda. Anda harus memilih bahasa yang paling tepat untuk setiap lapisan. Anda juga harus memahami bagaimana bahasa dapat saling beroperasi, yang dapat memengaruhi bahasa apa yang Anda pilih untuk lapisan apa.

Pertanyaan yang lebih baik adalah contoh apa dari perangkat lunak yang dirancang dengan sangat baik di luar sana yang layak dipelajari untuk belajar tentang bagaimana merancang perangkat lunak berlapis.

Robert van de Geijn
sumber