Apa yang membuat Fortran cepat?

41

Fortran memiliki tempat khusus dalam pemrograman numerik. Anda tentu dapat membuat perangkat lunak yang baik dan cepat dalam bahasa lain, tetapi Fortran tetap berkinerja sangat baik meskipun usianya sudah lanjut. Selain itu, lebih mudah membuat program cepat di Fortran. Saya telah membuat program cepat di C ++, tetapi Anda harus lebih berhati-hati tentang hal-hal seperti pointer alias. Jadi, harus ada alasan untuk ini, dan alasan yang sangat teknis. Apakah karena kompiler dapat mengoptimalkan lebih banyak? Saya benar-benar ingin mengetahui detail teknis, jadi jika saya menggunakan bahasa lain saya dapat mempertimbangkan hal-hal ini.

Sebagai contoh, saya tahu - atau saya pikir - bahwa satu hal adalah bahwa standar menentukan bahwa pointer selalu bersebelahan dalam memori yang berarti akses memori lebih cepat. Saya percaya Anda bisa melakukan ini di C ++ dengan memberikan bendera ke kompiler. Dengan cara ini membantu mengetahui apa yang Fortran lakukan dengan baik, sehingga jika menggunakan bahasa lain kita bisa meniru ini.

jbcolmenares
sumber
7
Saya akan mengatakan ini mungkin pertanyaan yang lebih baik untuk stackoverflow, meskipun saya pikir itu pertanyaan yang bagus. Pencarian cepat ( stackoverflow.com/search?q=fortran+fast ) mengarahkan saya ke pertanyaan ini yang mungkin membantu Anda: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann
3
Anda perlu menentukan jenis fortran yang Anda gunakan. Ada perbedaan mendasar antara 77 dan 90+. Saya berasumsi setidaknya 90 jika kita berbicara tentang pointer ...
qubyte
Saya selalu membaca tentang Fortran lebih cepat dari C. Yah mungkin, tetapi apakah lebih cepat seperti 2% atau lebih cepat seperti 50%?
shuhalo
4
Itu adalah mitos urban. Kecuali jika kompiler dapat menggunakan instruksi khusus, Anda dapat mengoptimalkan hampir semua program, terlepas dari kompiler, untuk menghasilkan sekitar bahasa mesin yang sama.
Mike Dunlavey

Jawaban:

50

Desainer bahasa menghadapi banyak pilihan. Ken Kennedy menekankan dua: (1) abstraksi yang lebih baik dan (2) tingkat yang lebih tinggi atau lebih rendah (kurang seperti mesin). Sementara bahasa fungsional seperti Haskell dan Skema fokus pada yang pertama, bahasa komputasi ilmiah tradisional seperti Fortran dan C / C ++ berfokus pada yang terakhir. Mengatakan bahwa satu bahasa lebih cepat dari yang lain biasanya cukup menyesatkan: setiap bahasa memiliki domain masalah yang unggul. Harga Fortran lebih baik dalam domain kode numerik berbasis array daripada bahasa lain karena dua alasan dasar: model array dan kesederhanaannya.

Model Array

Programmer Fortran sebagian besar melakukan manipulasi array. Untuk itu, Fortran memfasilitasi beberapa optimisasi kompiler yang tidak tersedia dalam bahasa lain. Contoh terbaik adalah vektorisasi: mengetahui tata letak data memungkinkan kompiler untuk memanggil intrinsik tingkat perakitan di atas array.

Penjelasan Bahasa

Meskipun tampaknya bahasa yang lebih sederhana harus dikompilasi "lebih baik" daripada yang lebih kompleks, itu sebenarnya tidak terjadi. Ketika seseorang menulis dalam bahasa assembly , tidak banyak kompiler yang dapat melakukannya: semua yang dilihatnya adalah instruksi yang sangat bagus. Fortran membutuhkan kesaksian (dengan demikian, lebih banyak pekerjaan oleh programmer) hanya dalam kasus yang menghasilkan hadiah nyata untuk komputasi berbasis array. Fortran menggunakan tipe data sederhana, aliran kontrol dasar, dan ruang nama terbatas; sebaliknya, ia tidak memberi tahu komputer cara memuat register (yang mungkin diperlukan untuk waktu-nyata ). Dimana Fortran adalah eksplisit, memungkinkan hal-hal seperti inferensi tipe lengkap, yang membantu pemula untuk memulai. Itu juga menghindari satu hal yang sering membuat C lambat:pointer buram .

Fortran Bisa Lambat

Fortran tidak cepat untuk setiap tugas: itu sebabnya tidak banyak orang menggunakannya untuk membangun GUI atau bahkan untuk komputasi ilmiah yang sangat tidak terstruktur. Setelah Anda meninggalkan dunia array untuk grafik, pohon keputusan, dan bidang lainnya, keunggulan kecepatan ini dengan cepat hilang. Lihat tolok ukur bahasa komputer untuk beberapa contoh dan angka.

aterrel
sumber
7
Masalah GUI / IO dapat dengan mudah diselesaikan dengan membungkus Fortran berderak dalam bahasa "tujuan yang lebih umum". Saya sering menggunakan R untuk tujuan ini.
mbq
2
shootout.alioth.debian.org tidak lagi tersedia! Dan versi baru memiliki informasi jauh lebih sedikit :(
astrojuanlu
23

Desain Fortran memungkinkan kompiler melakukan optimasi yang lebih kuat dalam beberapa kasus, optimisasi yang umumnya tidak tersedia untuk C.

Salah satu contoh terkenal adalah penanganan aliasing . Di Fortran, Anda dapat mengakses area memori tertentu hanya melalui simbol spesifik yang terkait dengan area memori itu. Pengetahuan ini memungkinkan kompiler untuk menggunakan trik pintar ketika saatnya untuk melakukan cache: ia tahu jika suatu nilai berpotensi berubah atau tidak. Hingga F90, ini diverifikasi dengan mudah. Ketika Fortran 90 diperkenalkan pointers, anggapan itu tidak lagi benar: Anda bisa mengakses area memori yang sama melalui dua (atau lebih) simbol. Ini adalah alasan mengapa Anda harus menentukan targetuntuk array yang ingin Anda alamatkan melalui pointer.

Fakta lain yang menarik adalah bahwa banyak konstruksi memungkinkan kompiler untuk melakukan paralelisasi tanpa campur tangan pengguna. Kemewahan semacam itu dimungkinkan karena "agnostisisme platform" relatif Fortran sebagai bahasa.

Ada banyak trik halus lainnya seperti ini. Selain itu, ingatlah bahwa tidak ada yang menggunakan Fortran hari ini, kecuali untuk perhitungan numerik, yang berarti bahwa fitur inti dan nilai jual kompiler Fortran adalah kecepatan kode yang dihasilkan. Akibatnya, vendor fokus pada ini.

Meskipun demikian, Anda dapat menghasilkan kode performan juga dengan bahasa lain. Namun, hal itu mungkin memerlukan perawatan khusus atau intervensi manusia. Poin umum, bagaimanapun, adalah bahwa kinerja tidak menjadi masalah sampai ada masalah, dan waktu kerja jauh lebih mahal daripada waktu komputer. Jadi praktik pengkodean harus fokus pada penghematan waktu manusia, bukan waktu komputer.

Stefano Borini
sumber
2
Ketika komputer Anda masuk ke kisaran> $ 100 juta, waktu orang (mahasiswa pascasarjana) berhenti terlihat sangat mahal dibandingkan.
Phil Miller
6
@Novelocrat: Jumlah kode yang berjalan pada komputer $ 100 juta telah ditulis oleh jam kerja yang tak terhitung yang melampaui nilai $ 100 juta, bahkan dengan harga mahasiswa pascasarjana. Ingat biaya seseorang adalah dua kali lipat dari pendapatannya. Sisanya masuk ke pajak dan dikorelasikan. Juga, komputer tidak mengalami terbakar. Seseorang melakukannya, dan akan berganti pekerjaan.
Stefano Borini
1
@StefanoBorini Saya memiliki sejarah panjang PC yang mengalami burn off ...
N74
1
"Selain itu, ingatlah bahwa tidak ada yang menggunakan Fortran hari ini, kecuali untuk perhitungan numerik," Fortran = "FORmula TRANslation". Fortran selalu terutama digunakan dan dirancang untuk perhitungan numerik. Fortran memiliki banyak waktu untuk komputer berkinerja tinggi.
user21387
Hari ini, dan selalu, Fortran digunakan untuk semua tujuan yang sama - perhitungan numerik.
urutan
12

Saya tidak berpikir Fortran dekat dengan logam (lihat jawaban lain) tetapi cenderung mengoptimalkan dengan sangat mudah. Loop sederhana, dan bahasa siap mendukung ekstensi vektorisasi (oke ketika saya menggunakannya dalam pekerjaan pertama kami, kami menargetkan berbagai vektor besar besi).

Ada juga faktor inersia yang besar. Banyak kode numerik di Fortran, jadi pembangun server dan superkomputer kelas atas memastikan mereka menulis kompilator Fortran yang optimal. Kompilernya bagus (bahkan pada mesin dengan relatif tidak ada kompiler berkualitas tinggi) sehingga pengguna terus menggunakan Fortran dan bahkan menulis kode baru di dalamnya. Jadi pembangun memastikan generasi berikutnya memiliki kompiler yang baik, dll ...

dimenangkan
sumber
8

Hati-hati dengan mitos urban di sini. Jika dua kompiler menghasilkan kode perakitan yang sama, maka program yang dihasilkan akan memiliki kinerja yang sama.

Untuk setiap bagian logika, ada program dalam bahasa rakitan yang meminimalkan waktu eksekusi. Program itu tidak peduli kompiler mana yang membuatnya.

Yang mengatakan, ada bahasa yang dikompilasi untuk membuat hidup lebih mudah bagi programmer. Bagian dari biaya ini adalah mereka dapat menggoda pengguna untuk menggunakan fitur yang tidak menghasilkan waktu eksekusi minimal. Contoh utama dari ini adalah newdalam C ++. (Seberapa lambatnya - hanya tiga karakter?) Praktis meminta Anda untuk mengalokasikan memori secara dinamis, dan tidak memperhatikan biaya runtime. Jika itu yang ingin Anda lakukan, itu hebat, tetapi Fortran bisa lebih cepat hanya karena itu tidak membuat Anda kesal melakukan itu.

Tetapi jauh lebih dari itu, saya belum pernah melihat sebuah program yang, seperti yang ditulis pertama, tidak memiliki ruang besar untuk peningkatan kinerja seperti yang tidak pernah dapat dilakukan oleh kompiler untuk Anda. Sebagai satu contoh, menghabiskan sebagian besar waktu untuk menelepon expdan / atau logberulang kali dengan argumen yang sama. Sebagai contoh lain, memanggil DGEMM untuk melipatgandakan matriks dan mengetahui bahwa sebagian besar waktu digunakan untuk memanggil LSAME hanya untuk menguraikan argumen karakter inputnya.

Ini pada saat yang sama karena orang mengatakan Fortran lebih cepat karena penunjuk alias atau loop terbuka. Itu seperti mengatakan bus yang dibuat oleh Porsche pasti akan lebih cepat daripada bus yang dibuat oleh Chevrolet. Perlu ada sedikit akal sehat.

Mike Dunlavey
sumber
4
Saya tidak berpikir itu hanya mitos urban. Dukungan Fortran untuk operasi seluruh array, fungsi PURE / ELEMENTAL dll. Dapat membantu kompiler dengan mudah mengoptimalkan / membuat vektor atau bahkan memparalelkan. Untuk misalnya, lihat thinkingparallel.com/2007/08/14/… . Apa yang sebenarnya dilakukan oleh kompiler adalah cerita yang berbeda (tergantung pada vendor).
stali
@stali: Tergantung pada lebih dari vendor. Itu tergantung pada program yang sedang dikompilasi. Saya telah melihat orang menggeneralisasi dari "ada program yang dapat membuat Fortran berjalan cepat" ke "Fortran lebih cepat pada program apa pun". Jika Anda menunjukkan ini, orang-orang dapat mulai mengelupas dan memotong rambut, dan apa yang sebenarnya terjadi pada akhirnya, pada dasarnya tidak lebih dari apa yang orang pikirkan.
Mike Dunlavey