Apa bahasa pemrograman yang paling banyak digunakan dalam komputasi kinerja tinggi? Dan mengapa? [Tutup]

25

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?

Fanatic23
sumber
9
C ++ tidak memiliki pengumpul sampah dan tidak mengharuskan Anda untuk menggunakan polimorfisme runtime.
Jason Baker
@Jason Maksud saya adalah untuk mencari tahu fitur C ++ apa yang membuatnya menjadi kasus yang menarik untuk HPC.
Fanatic23
@ Fanatic23 - Saya mengerti. Hanya ingin membuat catatan tentang itu. :-)
Jason Baker
1
@Fanatic Wish Saya bisa mengatakan ya, tapi saya tidak punya terlalu banyak ... Saya punya banyak tautan tentang beberapa masalah kinerja dalam .NET / bahasa fungsional. Anda mungkin dapat menyatukan konsep secara mental untuk memahami keterbatasan kinerja tertentu: msdn.microsoft.com/en-us/library/0xy59wtx.aspx stackoverflow.com/questions/2909282/… msdn.microsoft.com/en -us / magazine / cc163329.aspx en.wikipedia.org/wiki/Just-in-time_compilation
Rei Miyasaka
1
Saya pikir, jika Anda membutuhkan waktu respons yang sangat baik, yang Anda cari adalah OS waktu nyata seperti QNX: en.wikipedia.org/wiki/QNX
Rei Miyasaka

Jawaban:

11

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
14
Nitpick: Optimalisasi JIT tersedia untuk kompiler statis jika Anda bersedia melakukan sedikit pekerjaan. Baik GCC dan MS Visual Studio mendukung Optimalisasi Terpandu Profil yang mengoptimalkan menggunakan data runtime yang disimpan. Agak menyesatkan untuk menyarankan ada optimasi "yang tidak dapat dilakukan oleh kompiler statis".
Corbin
4
Saya tidak tahu mengapa ini adalah jawaban yang diterima, tidak ada dalam posting ini yang memiliki kemiripan kebenaran. Bahasa berbasis C akan selalu mengungguli Java, karena Java adalah mesin Virtual yang bergantung pada bahasa lain secara inheren. Selain itu, apa pun yang dapat Anda capai di Jawa dapat Anda capai dalam C dengan biaya overhead yang lebih sedikit. Bahasa berbasis C tidak akan pernah berhenti menjadi bahasa 'pemain'.
Mike
31

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

Benteng
sumber
16

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.

Omega Centauri
sumber
2
Baru-baru ini saya melakukan percobaan kecil, menemukan jumlah pop string 64000 bit, direpresentasikan sebagai array panjang yang tidak ditandai. Saya menggunakan algoritma yang sama persis menggunakan banyak hal bithean yang menarik dan dikemas aritmatika. Dalam C dengan -O3 butuh 10 jam per lama, sedangkan dengan fortran Intel Fortran 10.1, dengan optimasi default adalah 6.5! Dan setiap programmer berpikir C lebih unggul untuk twiddling! Asumsi defacto Fortran memungkinkan pengkodean instruksi tingkat rendah yang lebih efisien dihasilkan secara aman.
Omega Centauri
4
Itu seharusnya bertuliskan "Aturan defacto di Fortran memungkinkan kompiler untuk MENANGGUNG bahwa dua alamat adalah unik ...". Manual semua memberitahu Anda bahwa kompiler diperbolehkan untuk menganggap ini, dan memperingatkan Anda secara rinci bahwa hal-hal buruk dapat terjadi jika Anda melanggar asumsi itu.
John R. Strohm
15

Hanya beberapa catatan anekdotal. Saya sendiri belum melakukan komputasi kinerja tinggi.

Untuk perhitungan (angka-angka), Fortran dan C. Ya itu karena alasan warisan:

  • Ketersediaan kode sumber dan resep domain publik yang cukup.
  • Keduanya mendukung MPI .
  • Kedua bahasa dikompilasi.
  • Kompiler untuk kedua bahasa disediakan oleh semua OS dan vendor HPC.
  • Kompiler vektorisasi tersedia.
  • Keduanya membutuhkan tingkat tweaker gila untuk mendapatkan kinerja tinggi ketika porting ke cluster yang berbeda (ukuran memori berbeda, jumlah CPU dll)
    • Ini sebenarnya menjelaskan mengapa kode sumber terbuka itu penting: diperlukan tweaker, oleh karena itu resep asli harus ditulis dalam bahasa yang baik untuk tweaker manual.

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 .

rwong
sumber
1
Bisakah Anda menguraikan sedikit pada bagian "tingkat gila tweaker"?
Benteng
Pusat komputasi mempekerjakan mahasiswa pascasarjana untuk mengatur ulang panggilan MPI untuk membuatnya berjalan lebih cepat.
rwong
(?) Kata pertama di sini, tapi saya kira praktiknya berbeda.
Benteng
Itu adalah pusat penelitian pemodelan iklim.
rwong
4

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.

3Dave
sumber
1
c ++ memiliki model objek? Tapi sepertinya Anda harus menggunakan bahasa skrip untuk menulis pengontrol Anda - jika C # lebih baik daripada C ++ karena kecepatan dev, maka python (atau lua, dll) juga lebih baik daripada C #.
gbjbaanb
3
@ gbjbaanb Belum tentu. Implementasi ini terikat GPU, tetapi pindah ke bahasa scripting dapat dengan mudah mengubahnya. C # dikompilasi dan memiliki pengoptimal yang sangat bagus. Bahasa yang dikompilasi dan diketik dengan sangat baik adalah teman Anda! Bahasa scripting yang kurang ketat cenderung menyebabkan peningkatan waktu pengembangan untuk proyek yang cukup kompleks.
3Dave
1
Sudah tujuh tahun. Saya sudah belajar banyak. c ++ cukup mengagumkan, C # juga luar biasa, saya sangat suka python dan: CPU perf masih penting.
3Dave
3

Fortran paling umum, terutama karena warisan (orang masih menjalankan kode lama) dan keakraban (kebanyakan orang yang melakukan HPC tidak terbiasa dengan jenis bahasa lain).

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.

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".

Jon Harrop
sumber
Fortran adalah hal yang umum karena banyak orang menggunakan waktu superkomputer untuk menjalankan simulasi sistem fisik, seperti peramalan cuaca global, dan implementasi algoritma yang diperlukan di Fortran sangat jelas dan ringkas.
Sharpie
3

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.

Mike Dunlavey
sumber
"Kesenjangan budaya antara programmer CS dan non-CS. Programer ilmiah cenderung diajari kebiasaan buruk di Fortran, dan untuk memandang rendah para programmer CS dan kebiasaan buruk yang telah mereka pelajari, dan yang memandang rendah pada yang pertama." Sebagian ini hanya karena mereka berkonsentrasi pada berbagai aspek masalah. Fortran berarti FORmula TRANslation, dan cukup efisien dalam menerjemahkan rumus matematika ke dalam kode. Untuk jenis pemrograman yang biasanya dilakukan tipe CS, bahasa lain lebih unggul.
Omega Centauri
1
@ Omega: Anda benar. Orang-orang Fortran yang diajarkan cenderung tidak memiliki konsep format, membenci "tidak ada yang implisit", dan menjejalkan kode bersama-sama karena mereka masih berurusan dengan garis 72 karakter dan berpikir membuat kode yang dapat dimengerti adalah untuk para pengecut. Orang-orang yang diajari CS membuat piramid monster kelas yang penuh dengan polimorfisme, notifikasi, dan abstraksi, ketika sesuatu yang sederhana akan melakukan pekerjaan itu. Jadi mereka layak mendapatkan satu sama lain :)
Mike Dunlavey
7
kutipan yang digunakan untuk menjadi "fisikawan sedang memecahkan masalah besok pada perangkat keras kemarin - sedangkan orang-orang CS memecahkan masalah kemarin pada perangkat keras besok"
Martin Beckett
@ Martin: Saya pikir mungkin saya pernah mendengarnya di suatu tempat. Itu benar berdering.
Mike Dunlavey
Martin: Jadi, orang-orang perangkat keras adalah yang paling efisien :)
Dhaivat Pandya
2

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
1

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.

j ..
sumber