Mengapa fisikawan masih menggunakan Fortran

Saya tidak tahu seperti apa bahasa pemrograman pada tahun 2000, tetapi saya tahu itu akan disebut FORTRAN.
- Charles Anthony Richard Hoar, kira-kira. 1982

Dalam industri ini, Fortran jarang digunakan saat ini - di salah satu daftar bahasa populer, ia berada di posisi ke-28 . Tetapi Fortran masih merupakan bahasa utama untuk simulasi sistem fisik skala besar - yaitu, untuk hal-hal seperti pemodelan astrofisika bintang dan galaksi (mis. Flash ), dinamika molekul skala besar, kode penghitungan struktur elektronik ( SIESTA ), model iklim, dll. Di bidang komputasi kinerja tinggi, subset yang merupakan simulasi numerik skala besar, saat ini hanya dua bahasa yang digunakan - C / C ++ dan "modern Fortran" (Fortran 90/95/03/08). Perpustakaan MPI Terbuka Populeralat paralelisasi kode telah dikembangkan untuk kedua bahasa ini. Secara umum, jika Anda memerlukan kode cepat yang berjalan pada banyak prosesor, Anda hanya memiliki dua opsi. Di Fortran modern ada fitur seperti " coarray ", yang memungkinkan bekerja secara langsung dengan bahasa dalam pemrograman paralel. Coarray muncul dalam ekstensi Fortran 95 dan kemudian dimasukkan ke dalam Fortran 2008.

Penggunaan aktif Fortran oleh fisikawan sering membingungkan ilmuwan komputer dan orang lain yang tidak terkait dengan daerah ini yang menganggap Fortran adalah anakronisme sejarah.

Saya ingin menjelaskan mengapa Fortran masih berguna. Saya tidak mendorong siswa belajar fisika untuk mengajar Fortran - karena kebanyakan dari mereka akan melakukan penelitian, mereka harus belajar C / C ++ (atau berhenti di Matlab / Octave / Python). Saya ingin menjelaskan mengapa Fortran masih digunakan, dan untuk membuktikan bahwa ini bukan hanya karena fisikawan “ketinggalan zaman” (walaupun terkadang demikian - tahun lalu saya melihat seorang siswa fisika yang bekerja dengan kode Fortran 77, sementara dia maupun manajernya tidak mendengar apa pun tentang Fortran 90). Ilmuwan komputer harus melihat dominasi Fortran dalam komputasi numerik sebagai tantangan.

Sebelum menggali topik, saya ingin membahas ceritanya, karena ketika orang mendengar kata "Fortran", mereka langsung membayangkan kartu punch dan kode dengan garis bernomor. Spesifikasi Fortran pertama ditulis pada tahun 1954. Fortran awal (kemudian namanya ditulis dengan huruf kapital, FORTRAN), menurut standar modern, adalah bahasa neraka, tetapi itu adalah langkah maju yang luar biasa dari pemrograman assembler sebelumnya. FORTRAN sering diprogram dengan kartu punch, seperti yang diingat Profesor Miriam Forman dari Stony Brook University tanpa kesenangan. Fortran memiliki banyak versi, yang paling terkenal adalah standar 66, 77, 90, 95, 03, dan 08.

Sering dikatakan bahwa Fortran masih digunakan karena kecepatannya. Tapi apakah dia yang tercepat? Di benchmarksgame.alioth.debian.orgada perbandingan C dan Fortrandalam beberapa tes di antara banyak bahasa. Dalam kebanyakan kasus, Fortran dan C / C ++ adalah yang tercepat. Pemrogram Python favorit sering tertinggal dalam kecepatan 100 kali, tetapi ini sesuai urutan untuk kode yang ditafsirkan. Python tidak cocok untuk perhitungan numerik yang kompleks, tetapi cocok untuk yang lain. Menariknya, C / C ++ mengungguli Fortran di semua kecuali dua tes, meskipun secara umum hasilnya sedikit berbeda. Tes di mana Fortran menang, yang paling "fisik" adalah simulasi sistem n tubuh dan perhitungan spektrum. Hasil tergantung pada jumlah core prosesor, misalnya, Fortran tertinggal C / C ++ pada quad core. Tes, di mana Fortran tertinggal jauh di belakang C / C ++, membaca dan menulis data sebagian besar waktu, dan dalam hal ini kelambatan Fortran dikenal.

Jadi C / C ++ secepat Fortran, dan terkadang sedikit lebih cepat. Kami tertarik pada, "mengapa profesor fisika terus menyarankan siswa mereka untuk menggunakan Fortran, bukan C / C ++?"

Fortran memiliki kode warisan


Berkat sejarah panjang Fortran, tidak mengherankan bahwa gunung kode fisika tertulis di sana. Fisikawan berusaha meminimalkan waktu pemrograman, jadi jika mereka menemukan kode sebelumnya, mereka akan menggunakannya. Bahkan jika kode lama tidak dapat dibaca, didokumentasikan dengan buruk, dan bukan yang paling efisien, lebih mungkin menggunakan kode yang sudah terbukti lama daripada menulis yang baru. Tugas fisikawan bukanlah menulis kode, mereka mencoba memahami sifat realitas. Para profesor selalu memiliki kode warisan di tangan (sering mereka menulis kode ini beberapa dekade yang lalu), dan mereka meneruskannya kepada siswa mereka. Ini menghemat waktu mereka dan menghilangkan ketidakpastian dari proses koreksi kesalahan.

Siswa Fisika Belajar Fortran Lebih Mudah Daripada C / C ++


Saya pikir Fortran lebih mudah dipelajari daripada C / C ++. Fortran 90 dan C sangat mirip, tetapi Fortran lebih mudah untuk ditulis. C adalah bahasa yang relatif primitif, sehingga fisikawan yang memilih C / C ++ terlibat dalam pemrograman berorientasi objek. OOP bisa bermanfaat, terutama dalam proyek perangkat lunak besar, tetapi pelajarilah lebih lama. Anda perlu mempelajari abstraksi seperti kelas dan pewarisan. Paradigma OOP sangat berbeda dengan paradigma prosedural yang digunakan oleh Fortran. Fortran didasarkan pada paradigma prosedural sederhana yang lebih dekat dengan apa yang terjadi di bawah tudung komputer. Ketika Anda mengoptimalkan / membuat vektor kode untuk meningkatkan kecepatan, paradigma prosedural lebih mudah digunakan. Fisikawan biasanya memahami cara kerja komputer, dan berpikir dalam hal proses fisik, misalnya, mentransfer data dari disk ke RAM, dan dari RAM ke cache prosesor.Mereka berbeda dari ahli matematika yang lebih suka berpikir dalam hal fungsi dan logika abstrak. Juga, pemikiran ini berbeda dari berorientasi objek. Optimalisasi kode OOP lebih rumit dari sudut pandang saya daripada prosedural. Objek adalah struktur yang sangat besar dibandingkan dengan struktur data yang disukai oleh fisikawan: array.

Lightness One: Pekerjaan Fortran Array


Array, atau, sebagaimana fisikawan menyebutnya, matriks, adalah jantung dari semua komputasi fisik. Di Fortran 90+, Anda dapat menemukan banyak peluang untuk bekerja dengannya, mirip dengan APL dan Matlab / Oktaf. Array dapat disalin, dikalikan dengan skalar, dikalikan di antara mereka dengan cara yang sangat intuitif:

A = B
A = 3.24*B
C = A*B
B = exp(A)
norm = sqrt(sum(A**2))

Di sini, A, B, C adalah array dari beberapa dimensi (katakanlah, 10x10x10). C = A * B memberi kita perkalian matriks secara elemen jika A dan B memiliki ukuran yang sama. Untuk perkalian matriks, C = matmul (A, B) digunakan. Hampir semua fungsi internal Fortran (Sin (), Exp (), Abs (), Floor (), dll) mengambil array sebagai argumen, yang mengarah pada kode sederhana dan bersih. Tidak ada kode serupa di C / C ++. Dalam implementasi C / C ++ dasar, hanya menyalin array memerlukan berjalan untuk loop di semua elemen atau memanggil fungsi perpustakaan. Jika Anda memberi makan array fungsi pustaka yang salah di C, kesalahan akan terjadi. Kebutuhan untuk menggunakan perpustakaan alih-alih fungsi internal berarti bahwa kode yang dihasilkan tidak akan bersih dan portabel, atau mudah dipelajari.

Di Fortran, mengakses elemen array bekerja melalui sintaksis sederhana A [x, y, z], ketika di C / C ++ Anda perlu menulis A [x] [y] [z]. Elemen array dimulai dengan 1, yang sesuai dengan pemahaman fisikawan tentang matriks, dan dalam array C / C ++, penomoran dimulai dari nol. Berikut adalah beberapa fitur untuk bekerja dengan array di Fortran.

A = (/ i , i = 1,100 /)
B = A(1:100:10)
C(10:) = B

Pertama, vektor A dibuat melalui loop tersirat tersirat, juga dikenal sebagai konstruktor array. Kemudian vektor B dibuat, terdiri dari setiap elemen ke-10 A, menggunakan langkah 10. Dan, akhirnya, array B disalin ke array C, mulai dari elemen ke-10. Fortran mendukung mendeklarasikan array dengan indeks nol atau negatif:

double precision, dimension(-1:10) :: myArray

Indeks negatif pada awalnya terlihat konyol, tetapi saya mendengar tentang kegunaannya - misalnya, bayangkan ini adalah area tambahan untuk memposting klarifikasi. Fortran juga mendukung indeks vektor . Misalnya, Anda dapat mentransfer elemen 1,5 dan 7 dari larik A dimensi N x 1 ke larik B dimensi 3 x 1:

subscripts = (/ 1, 5, 7 /)
B = A(subscripts)

Fortran mendukung masker array di semua fungsi internal. Misalnya, jika kita perlu menghitung logaritma semua elemen matriks yang lebih besar dari nol, kita menggunakan:

log_of_A = log(A, mask= A .gt. 0)

Atau kita dapat membatalkan semua elemen negatif dari array dalam satu baris:

where(my_array .lt. 0.0) my_array = 0.0

Fortran membuatnya mudah untuk secara dinamis mengalokasikan dan membebaskan array. Misalnya, untuk menempatkan array dua dimensi:

real, dimension(:,:), allocatable :: name_of_array
allocate(name_of_array(xdim, ydim))

Dalam C / C ++, ini membutuhkan entri berikut :

int **array;
array = malloc(nrows * sizeof(double *));
 
for(i = 0; i < nrows; i++){
     array[i] = malloc(ncolumns * sizeof(double));
}

Untuk membebaskan array di Fortran

deallocate(name_of_array)

Dalam C / C ++ untuk ini

for(i = 0; i < nrows; i++){
    free(array[i]);
}
free(array);

:


Dalam bahasa seperti C / C ++, semua variabel dilewatkan oleh nilai, dengan pengecualian array yang dilewatkan oleh referensi. Tetapi dalam banyak kasus, melewatkan array dengan nilai lebih masuk akal. Sebagai contoh, biarkan data terdiri dari posisi 100 molekul pada periode waktu yang berbeda. Kita perlu menganalisis pergerakan satu molekul. Kami mengambil sepotong array (subarray) yang sesuai dengan koordinat atom dalam molekul ini dan meneruskannya ke fungsi. Di dalamnya, kita akan berurusan dengan analisis kompleks dari subarray yang ditransmisikan. Jika kami melewatinya dengan referensi, data yang ditransfer tidak akan terletak di memori dalam satu baris. Karena sifat akses memori, bekerja dengan array seperti itu akan lambat. Jika kita berikan nilai, kita akan membuat array baru di memori yang disusun secara berurutan. Untuk menyenangkan fisikawan, kompiler mengambil semua pekerjaan kotor mengoptimalkan memori.

Dalam Fortran, variabel biasanya dilewatkan dengan referensi, bukan oleh nilai. Di bawah kap, kompiler Fortran secara otomatis mengoptimalkan transmisi mereka untuk meningkatkan efisiensi. Dari sudut pandang profesor di bidang mengoptimalkan penggunaan memori, kompiler harus lebih dipercaya daripada siswa! Akibatnya, fisikawan jarang menggunakan pointer, meskipun Fortran-90 + mereka memiliki .

Beberapa contoh lagi perbedaan antara Fortran dan C


Fortran memiliki beberapa opsi untuk mengelola kompiler saat mengatasi masalah dan mengoptimalkan. Kesalahan dalam kode dapat ditangkap pada tahap kompilasi, dan tidak selama eksekusi. Misalnya, variabel apa pun dapat dideklarasikan sebagai parameter, yaitu konstanta.

double precision, parameter :: hbar = 6.63e-34

Jika parameter dalam kode berubah, kompiler mengembalikan kesalahan. Dalam C ini disebut const

double const hbar = 6.63e-34

Masalahnya adalah bahwa real nyata berbeda dari real nyata. Jika suatu fungsi yang menerima nyata mendapat nyata, itu akan mengembalikan kesalahan. Sangat mudah untuk membayangkan bagaimana ini dapat menyebabkan masalah interoperabilitas dalam kode.

Fortran juga memiliki spesifikasi maksud yang memberi tahu kompiler apakah argumen yang dilewatkan ke fungsi adalah input, output, atau input dan parameter output. Ini membantu kompiler mengoptimalkan kode dan meningkatkan keterbacaan dan keandalannya.

Fortran memiliki fitur lain yang digunakan pada frekuensi yang berbeda. Misalnya, Fortran 95 memiliki kemampuan untuk mendeklarasikan fungsi dengan pengubah murni. Fungsi seperti itu tidak memiliki efek samping - hanya mengubah argumennya, dan tidak mengubah variabel global. Kasus khusus dari fungsi tersebut adalah fungsi elemen, yang menerima dan mengembalikan skalar. Ini digunakan untuk memproses elemen array. Informasi yang fungsinya murni atau unsur memungkinkan kompiler untuk melakukan optimasi tambahan, terutama ketika memparalelkan kode.

Apa yang diharapkan di masa depan?


Dalam perhitungan ilmiah, Fortran tetap menjadi bahasa utama, dan tidak akan hilang dalam waktu dekat. Dalam surveiDi antara pengunjung konferensi Konvensi Supercomputing 2014 menggunakan bahasa ini, 100% dari mereka mengatakan mereka akan menggunakannya dalam 5 tahun ke depan. Itu juga mengikuti dari survei bahwa 90% menggunakan campuran Fortran dan C. Mengantisipasi peningkatan dalam pencampuran bahasa-bahasa ini, pencipta spesifikasi Fortran 2015 mencakup lebih banyak fitur untuk interoperabilitas kode. Kode Fortran semakin banyak dipanggil dari kode Python. Ilmuwan komputer yang mengkritik penggunaan Fortran tidak mengerti bahwa bahasa ini tetap diadaptasi secara unik untuk apa yang dinamai setelah - TRAN inflasi, terjemahan rumus, yaitu, konversi formula fisik menjadi kode. Banyak dari mereka tidak menyadari bahwa bahasa tersebut berkembang dan secara konstan menyertakan fitur-fitur baru.

Memanggil Fortran 90+ modern lama seperti memanggil C ++ lama karena C dikembangkan pada tahun 1973. Di sisi lain, bahkan standar Fortran 2008 terbaru memiliki kompatibilitas dengan Fortran 77 dan sebagian besar dari Fortran 66. Karena itu, perkembangan bahasa dikaitkan dengan kesulitan tertentu. Baru-baru ini, peneliti di MIT memutuskan untuk mengatasi kesulitan ini dengan mengembangkan dari awal bahasa untuk HPC bernama Julia , pertama kali dirilis pada 2012. Apakah Julia menggantikan Fortran masih harus dilihat. Bagaimanapun, saya menduga ini akan memakan waktu yang sangat lama.

Source: https://habr.com/ru/post/id400523/


All Articles