Biarkan saya mencoba dan menjabarkan persyaratan Anda:
- Maintabilitas
- Membaca / menulis data teks
- Antarmuka / kemampuan yang kuat untuk faktorisasi LU
- Pemecah linier yang jarang
- Kinerja dan skalabilitas untuk data besar
Dari daftar ini, saya akan mempertimbangkan bahasa-bahasa berikut:
C, C ++, Fortran, Python, MATLAB, Java
Julia adalah bahasa baru yang menjanjikan, tetapi komunitas masih membentuk sekitarnya dan belum digunakan dalam kode baru utama.
Membaca / menulis data teks
Ini mudah dilakukan dengan benar dalam bahasa pemrograman apa pun. Pastikan Anda melindungi dan menyatukan akses I / O Anda dengan tepat, dan Anda akan mendapatkan kinerja yang baik dari salah satu bahasa yang harus Anda pertimbangkan. Hindari streaming objek di C ++ kecuali Anda tahu cara menggunakannya secara performant.
Antarmuka / kemampuan yang kuat untuk faktorisasi LU
Jika Anda melakukan padat faktorisasi LU, Anda akan ingin menggunakan LAPACK, atau ScaLAPACK / Elemental untuk fungsi paralel. LAPACK dan ScaLAPACK ditulis dalam Fortran, Elemental ditulis dalam C ++. Ketiga perpustakaan tersebut berkinerja baik, didukung dan didokumentasikan dengan baik. Anda dapat antarmuka ke dalamnya dari salah satu bahasa yang harus Anda pertimbangkan.
Pemecah linier yang jarang
Solver linier jarang yang tersedia secara bebas hampir semuanya tersedia melalui PETSc , ditulis dalam C, yang didokumentasikan dan didukung dengan baik. Anda dapat antarmuka ke dalam PETSc dari salah satu bahasa yang harus Anda pertimbangkan.
Kinerja dan skalabilitas untuk data besar
Satu-satunya paradigma pemrograman paralel yang Anda sebutkan adalah berbasis memori bersama, yang berarti Anda tidak mempertimbangkan pendekatan komputasi distribusi memori berbasis MPI (message-passing). Dalam pengalaman saya, jauh lebih mudah untuk menulis kode yang skala jauh melampaui selusin inti menggunakan solusi memori terdistribusi. Hampir semua "cluster" Universitas berbasis MPI hari ini, mesin memori bersama yang besar harganya mahal, dan jarang terjadi. Anda harus mempertimbangkan MPI untuk pendekatan Anda, tetapi saran saya akan berlaku terlepas dari paradigma pemrograman yang Anda pilih.
Sehubungan dengan kinerja on-node, jika Anda menulis rutinitas numerik sendiri, paling mudah untuk mendapatkan kinerja serial yang baik di Fortran. Jika Anda memiliki sedikit pengalaman dalam C, C ++, atau Python, Anda bisa mendapatkan kinerja yang sangat sebanding (C dan C ++ mati-bahkan dengan Fortran, Python dan MATLAB memiliki sekitar 25% waktu overhead tanpa banyak usaha). MATLAB melakukan ini melalui kompiler JIT dan ekspresifitas aljabar linier yang sangat baik. Anda mungkin perlu menggunakan kernel Cython, numpy, numexpr, atau embed numerik untuk mendapatkan kinerja yang diklaim dari Python. Saya tidak dapat mengomentari kinerja Java, karena saya tidak tahu bahasanya dengan baik, tetapi saya curiga bahasa ini tidak jauh dari Python jika ditulis oleh seorang ahli.
Catatan tentang antarmuka
Saya harap saya telah meyakinkan Anda bahwa Anda akan dapat melakukan semua yang Anda inginkan dalam bahasa pemrograman yang Anda pertimbangkan. Jika Anda menggunakan Java, antarmuka C akan sedikit menantang. Python memiliki dukungan antarmuka C dan Fortran yang sangat baik melalui ctypes, Cython, dan f2py. LAPACK sudah dibungkus dan tersedia melalui scipy. MATLAB memiliki semua fungsionalitas yang Anda butuhkan di pustaka aslinya, tetapi tidak mudah diskalakan atau sangat mudah dijalankan pada cluster. Java dapat mendukung antarmuka C dan Fortran dengan JNI , tetapi tidak umum ditemukan pada cluster dan perangkat lunak paralel untuk komputasi ilmiah.
Maintabilitas
Banyak dari ini akan turun ke selera pribadi, tetapi konsensus umum tentang rawatan adalah bahwa Anda ingin meminimalkan jumlah baris kode dalam perangkat lunak Anda, menulis kode modular dengan antarmuka yang terdefinisi dengan baik, dan untuk perangkat lunak komputasi, menyediakan tes yang memverifikasi kebenaran dan fungsionalitas implementasi.
Rekomendasi
Saya pribadi telah memiliki banyak keberuntungan dengan Python dan saya merekomendasikannya untuk banyak proyek komputasi. Saya pikir Anda harus sangat mempertimbangkannya untuk proyek Anda. Python dan MATLAB mungkin adalah bahasa yang paling ekspresif yang tersedia untuk komputasi ilmiah. Anda dapat dengan mudah antarmuka Python ke bahasa pemrograman lain, Anda dapat menggunakan f2py untuk membungkus implementasi Fortran Anda saat ini dan menulis ulang sepotong demi sepotong bagian mana pun yang Anda inginkan dalam Python sambil memverifikasi bahwa Anda mempertahankan fungsionalitas. Pada saat ini, saya akan merekomendasikan kombinasi implementasi Python 2.7 resmi dengan scipy . Anda dapat dengan mudah memulai dengan tumpukan ini dari Enthought Python Distribution yang tersedia secara bebas .
Anda juga bisa melakukan sebagian besar ini dalam C, C ++, atau Fortran. C dan C ++ adalah bahasa yang sangat menarik untuk pengembang profesional dengan banyak pengalaman, tetapi sering membuat pengembang baru dan dalam hal ini mungkin bukan ide yang bagus untuk kode yang lebih akademis. Fortran dan MATLAB populer dalam perhitungan akademis, tetapi lemah pada struktur data canggih dan penawaran ekspresif Python (pikirkan objek dict Python, misalnya).
Pertanyaan-pertanyaan Terkait: