it-swarm-id.com

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

Saya percaya banyak Fortran digunakan dalam HPC, tetapi tidak yakin apakah itu hanya untuk alasan warisan.

Fitur-fitur bahasa pemrograman modern seperti pengumpulan sampah atau run-time polymorphism tidak cocok untuk HPC karena masalah kecepatan jadi tidak yakin dari mana C # atau Java atau C++ masuk.

Adakah pikiran?

25
Fanatic23

Saya telah melihat banyak Java digunakan untuk HPC di area 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.

Dengan tetap jumlah waktu untuk pengembangan program, hasilnya Java kode secara konsisten lebih cepat daripada kode C. HPC di Java pasti masuk akal ketika kode sering dikembangkan atau dimodifikasi. 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 "Bad Things May Happen". Hubungi saya jika tertarik.

11
Patrick Viry

Dalam pengalaman saya bertahun-tahun, hingga 5 tahun yang lalu, selalu Fortran dan C. Yang mana sebagian besar tergantung pada apakah orang-orang lebih 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 F2003/08 Standar dan dengan diperkenalkannya Co-Arrays, tampaknya akan mendapatkan momentum lagi.

Juga, satu, jika artikel agak bias - Bahasa Pemrograman HPC Ideal

31
Rook

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 menentukan bahwa dua alamat 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.

Juga, penyelarasan array, baris cache w.r.t, dan batas-batas SSE/AVX adalah penting untuk pembuatan dan pelaksanaan 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 mengkomunikasikan 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.

16
Omega Centauri

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 yang berbeda, jumlah CPU dll)
    • Ini benar-benar menjelaskan mengapa kode sumber terbuka itu penting: diperlukan penyesuaian, oleh karena itu resep asli harus ditulis dalam bahasa yang baik untuk penyesuaian manual.

Kecenderungan 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 Python, proyek pemrosesan batch dapat ditulis dalam bahasa apa pun, dan biasanya dikirim oleh Condor .

15
rwong

Saya telah mengerjakan beberapa kode intensif perhitungan SANGAT dalam (terkesiap!) C #.

Saya sedang membangun implementasi GPGPU dari 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 terikat-CPU, ini terikat-GPU, jadi perbedaan tenaga kuda ( sangat kecil) 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. Hari-hari ini, biaya pengembangan C++ vs C # jauh melebihi manfaat untuk sebagian besar aplikasi.

Selain itu, sebagian besar perbedaan kinerja Anda tidak akan berasal dari pilihan bahasa Anda, tetapi dari keahlian 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.

4
3Dave

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 dari 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 simbolik 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.

Misalnya, baca makalah ini oleh Fischbacher dkk. yang mengatakan "penulis memiliki alasan kuat untuk percaya bahwa ini mungkin baik menjadi perhitungan simbolis terbesar yang dilakukan sejauh ini ".

3
Jon Harrop

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 yang sudah terbukti benar, semua ditulis dalam Fortran (meskipun itu bisa disebut dari C dan C++).

Alasan yang tidak terlalu bagus adalah keunggulan kinerja seharusnya dari 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. Pemrogram ilmiah cenderung diajari kebiasaan buruk di Fortran, dan memandang rendah para programmer CS dan kebiasaan buruk mereka telah diajarkan, dan yang memandang rendah kebiasaan sebelumnya.

3
Mike Dunlavey

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 itu 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 template meta-programming)

Juga, sekarang kompiler benar-benar bagus, maka banyak optimasi diserahkan kepada kompiler.

2
user27946

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 diterapkan dalam bahasa yang dikompilasi. Java sering digunakan oleh proyek di mana mengelola jaringan dan komputasi terdistribusi sangat penting.

1
j..