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.
56
Jawaban:
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!
sumber
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.
sumber
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:
sumber
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.
sumber
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.
sumber
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!
sumber
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.
sumber
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)
Satu kesan pribadi:
transfer()
, kami datang)sumber
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.
sumber
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.
sumber
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:
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.
sumber
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.
sumber