Saya percaya banyak Fortran digunakan dalam HPC, tetapi tidak yakin apakah itu hanya untuk alasan warisan.
Fitur bahasa pemrograman modern seperti pengumpulan sampah atau polimorfisme run-time tidak cocok untuk HPC karena masalah kecepatan jadi tidak yakin di mana C # atau Java atau C ++ masuk.
Adakah pikiran?
programming-languages
Fanatic23
sumber
sumber
Jawaban:
Saya telah melihat banyak Java yang digunakan untuk HPC di daerah di mana (1) ada sedikit kode warisan, dan (2) waktu pengembangan dan masalah kualitas kode. Domain aplikasi yang umum adalah keuangan, penambangan data, atau bio-informatika.
Ini benar-benar tergantung pada aplikasi (ada kehidupan di luar aljabar linier), tetapi kinerja JVM baru-baru ini sering setara dengan kode C. Terkadang lebih cepat ketika JVM mampu melakukan optimisasi pintar pada saat runtime yang tidak dapat dilakukan oleh kompiler statis (C, Fortran). Dan tentu saja lebih cepat ketika ada banyak perhitungan simbolik.
Mengingat jumlah waktu yang tetap untuk pengembangan program, kode Java yang dihasilkan secara konsisten lebih cepat daripada kode C. HPC di Jawa jelas masuk akal ketika kode dikembangkan atau dimodifikasi secara berkala. Fitur penting lainnya adalah mobilitas kode pada perangkat keras yang berbeda.
Anda akan menemukan referensi di http://ateji.blogspot.com/2010/09/java-for-high-performance-computing.html
Mengenai asumsi Fortran bahwa dua alamat adalah unik, kami sedang mengerjakan alat analisis statis yang akan memungkinkan pengoptimalan serupa untuk kode dalam bahasa tingkat tinggi, tetapi tanpa bit "Hal Buruk Dapat Terjadi". Hubungi saya jika tertarik.
sumber
Dalam pengalaman saya bertahun-tahun, hingga 5 tahun yang lalu, selalu Fortran dan C. Yang mana sebagian besar tergantung pada apakah orang-orang lebih banyak berasal dari teknik atau lebih dari sekolah pemikiran CS (saya tidak tahu bagaimana membuat ini lebih baik , oke? :-)
Dalam apa yang kami lakukan, Fortran hampir secara eksklusif digunakan.
Dari apa yang saya baca saat ini, dengan pembaruan baru ke Standar F2003 / 08 dan dengan diperkenalkannya Co-Arrays, tampaknya akan mendapatkan momentum lagi.
Juga, satu, jika artikel agak bias - Bahasa Pemrograman HPC Ideal
sumber
Saya pikir untuk pedal nyata ke logam, satu-satunya pilihan nyata adalah Fortran. Alasannya adalah bahwa hal yang paling penting untuk eksploitasi ILP tingkat rendah (Parallism Level Instruksi) adalah disambiguasi alamat memori. Aturan defacto di Fortran memungkinkan kompiler untuk menentukan bahwa dua alamat itu unik (dan karenanya urutan muatan dan penyimpanan, atau bahkan toko dan toko dapat dipertukarkan tanpa risiko menghasilkan kode yang salah). C meninggalkan terlalu banyak ruang untuk tumpang tindih pointer untuk dikompilasi untuk mengekstrak paralelisme tingkat rendah dari kode.
Selain itu, penyelarasan larik, garis cache wrt, dan batas SSE / AVX adalah penting untuk menghasilkan dan mengeksekusi loop yang efisien. Jika array dilewatkan melalui blok umum, kompiler / pemuat dapat memastikan bahwa semua array mulai pada batas-batas penyelarasan alamat yang sama, dan beban serta toko SSE / AVX yang lebih efisien dapat dimanfaatkan. Perangkat keras yang lebih baru dapat menangani akses memori yang tidak selaras, tetapi karena akses memori tidak sejajar dengan penggunaan parsial garis cache menghasilkan kinerja yang lebih rendah. Bahkan jika seorang programmer C benar menyelaraskan semua array-nya, apakah ada mekanisme untuk berkomunikasi ini ke kompiler?
Untuk meringkas, dua masalah yang paling penting, adalah independensi alamat memori, dan pengakuan oleh kompiler bahwa struktur data yang diakses memiliki keselarasan "alami" yang sama dengan yang diinginkan perangkat keras. Sejauh ini Fortran melakukan pekerjaan terbaik pada kedua tugas itu.
sumber
Hanya beberapa catatan anekdotal. Saya sendiri belum melakukan komputasi kinerja tinggi.
Untuk perhitungan (angka-angka), Fortran dan C. Ya itu karena alasan warisan:
Tren saat ini untuk angka-angka adalah untuk menulis generator program yang mengotomatisasi tweak kode sumber untuk mengoptimalkan kinerja mengingat karakteristik cluster. Generator ini sering menghasilkan C.
Tren kedua adalah menulis dalam beberapa dialek khusus C untuk GPU tertentu atau Cell BE.
Untuk pekerjaan non-numerik, seperti program yang memproses data dari suatu basis data (tetapi bukan dari basis data itu sendiri), jauh lebih murah untuk dijalankan pada kelompok mesin "komoditas" tanpa peralatan jaringan yang mahal. Ini biasanya disebut "Komputasi Throughput Tinggi". Dan Python adalah bahasa # 1 di sini (menggunakan Pengurangan Peta yang terkenal). Sebelum ke Python, proyek pemrosesan batch dapat ditulis dalam bahasa apa pun, dan biasanya dikirim oleh Condor .
sumber
Saya telah mengerjakan beberapa kode intensif perhitungan SANGAT dalam (terkesiap!) C #.
Saya sedang membangun implementasi GPGPU FDTD untuk pemodelan optik. Pada kluster kecil (128 prosesor), banyak dari simulasi kami yang membutuhkan waktu berminggu-minggu untuk berjalan. Implementasi GPU, bagaimanapun, cenderung berjalan sekitar 50x lebih cepat - dan itu pada kartu NVidia kelas konsumen. Kami sekarang memiliki server dengan dua kartu dual-prosesor GTX295 (beberapa ratus core), dan akan segera mendapatkan beberapa Teslas.
Bagaimana hal ini berkaitan dengan bahasa Anda? Dengan cara yang sama bahwa kode C ++ FDTD yang kami gunakan sebelumnya adalah CPU-terikat, ini adalah GPU-terikat, sehingga perbedaan tenaga kuda ( sangat kecil) dari kode dikelola vs asli tidak pernah ikut bermain. Aplikasi C # bertindak sebagai konduktor - memuat kernel OpenCL, meneruskan data ke dan dari GPU, menyediakan antarmuka pengguna, melaporkan, dll. - semua tugas yang menyebalkan di C ++.
Dalam beberapa tahun terakhir, perbedaan kinerja antara kode yang dikelola dan yang tidak dikelola cukup signifikan sehingga kadang-kadang layak untuk bertahan dengan model objek C ++ yang mengerikan untuk mendapatkan kecepatan ekstra beberapa persen. Saat ini, biaya pengembangan C ++ vs C # jauh lebih besar daripada manfaat untuk sebagian besar aplikasi.
Juga, sebagian besar perbedaan kinerja Anda tidak akan datang dari pilihan bahasa Anda, tetapi dari keterampilan pengembang Anda. Beberapa minggu yang lalu, saya memindahkan operasi divisi tunggal dari dalam loop tiga bersarang (3D array traversal) loop, yang mengurangi waktu eksekusi untuk domain komputasi tertentu sebesar 15%. Itu adalah hasil dari arsitektur prosesor: divisi lambat, yang merupakan salah satu wajah yang Anda hanya perlu mengambil di suatu tempat.
sumber
Fortran paling umum, terutama karena warisan (orang masih menjalankan kode lama) dan keakraban (kebanyakan orang yang melakukan HPC tidak terbiasa dengan jenis bahasa lain).
Itu tidak benar secara umum. HPC klasik kebanyakan melakukan aljabar linier dengan angka presisi mesin. Namun, HPC modern semakin menggunakan superkomputer untuk variasi yang lebih luas, seperti perhitungan simbolis dengan ekspresi matematika acak alih-alih angka presisi mesin. Ini menempatkan karakteristik yang sangat berbeda pada alat yang Anda gunakan dan tidak jarang menggunakan bahasa pemrograman selain Fortran karena perhitungan simbolis dapat menjadi sangat sulit tanpa GC dan jenis pengoptimal pengoptimal lainnya seperti pengoptimal pencocokan pola pengoptimalan OCaml.
Sebagai contoh, baca makalah ini oleh Fischbacher et al. yang mengatakan "penulis memiliki alasan kuat untuk percaya bahwa ini mungkin perhitungan simbolis terbesar yang dilakukan sejauh ini".
sumber
Fortran, untuk beberapa alasan yang baik dan beberapa alasan yang tidak begitu baik. Untuk perhitungan matematika yang berat, alasan yang bagus adalah ada perpustakaan yang luas (BLAS, LAPACK) dari subrutin-subrutin yang dicoba-dan-benar, semua ditulis dalam Fortran (meskipun itu dapat dipanggil dari C dan C ++).
Alasan yang tidak terlalu baik adalah dugaan keunggulan kinerja Fortran daripada C / C ++. Pengoptimal cukup bagus, dan hanya sedikit orang yang mengerti bahwa manfaat mengoptimalkan sepotong kode sebanding dengan persentase waktu sibuknya, yang hampir semua kode hampir nol.
Alasan lain yang tidak begitu baik adalah kesenjangan budaya antara programmer CS dan non-CS. Programmer ilmiah cenderung diajarkan kebiasaan buruk dalam Fortran, dan untuk melihat ke bawah pada programmer CS dan kebiasaan buruk mereka telah diajarkan, dan yang melihat ke bawah pada mantan.
sumber
Pada dasarnya, semua program yang melakukan pekerjaan sebenarnya dari angka-angka masih FORTRAN (blas lama, lapack, arnoldi dll masih yang digunakan) ... Namun, ketika datang ke struktur tingkat yang lebih tinggi ... orang semakin menggunakan C ++.
Kompleksitas simulasi melibatkan kode besar dan untuk mendapatkan segala manfaat dari penulisan satu adalah membuatnya dapat digunakan kembali. Selain itu, konsep yang digunakan juga menjadi sangat kompleks. Hampir gila untuk merepresentasikan informasi tersebut menggunakan FORTRAN. Di situlah C ++ masuk karena secara inheren mendukung Desain Berorientasi Objek. Namun, Run-Time Polymorphism jarang disukai. Orang-orang malah hampir selalu menggunakan Static Polymorphism (yang diimplementasikan dalam C ++ dengan templat meta-programming)
Juga, sekarang kompiler benar-benar baik, maka banyak optimasi diserahkan kepada kompiler.
sumber
Ada dua jenis masalah yang perlu diatasi dalam aplikasi HPC: satu adalah angka-angka itu sendiri dan yang lainnya adalah pengelolaan perhitungan. Yang pertama biasanya didekati dengan kode yang ditulis dalam Fortran, C atau C ++ karena kecepatan dan karena fakta bahwa sudah ada banyak algoritma ilmiah yang ditulis dalam bahasa ini. Kemudi komputasi lebih mudah diimplementasikan dalam bahasa tingkat yang lebih tinggi. Python adalah bahasa "lem" pilihan untuk menangani logika aplikasi dan ekstensi panggilan yang diimplementasikan dalam bahasa yang dikompilasi. Java sering digunakan oleh proyek-proyek di mana mengelola jaringan dan komputasi terdistribusi sangat penting.
sumber