Дозвольте спробувати розбити ваші вимоги:
- Технічне обслуговування
- Читання / запис текстових даних
- Міцні інтерфейси / можливості для LU-факторизації
- Рідкі лінійні розв'язувачі
- Продуктивність та масштабованість великих даних
З цього списку я розглядаю наступні мови:
C, C ++, Fortran, Python, MATLAB, Java
Юлія - це багатообіцяюча нова мова, але спільнота все ще формується навколо неї, і вона не розгорнута в жодних основних нових кодах.
Читання / запис текстових даних
Це легко отримати правильно на будь-якій мові програмування. Переконайтеся, що ви належним чином буферизуєте та з’єднуєте доступ до вводу-виводу, і ви отримаєте хороші показники роботи з будь-якої з мов, які ви повинні врахувати. Уникайте об'єктів потоку в C ++, якщо ви не знаєте, як їх ефективно використовувати.
Міцні інтерфейси / можливості для LU-факторизації
Якщо ви виконуєте щільні фактори LU, вам потрібно використовувати паралельну функціональність LAPACK або ScaLAPACK / Elemental. LAPACK і ScaLAPACK написані у Fortran, Elemental написано на C ++. Усі три бібліотеки є працездатними та добре підтримуваними та задокументованими. Ви можете інтерфейсувати в них будь-яку з мов, які слід врахувати.
Рідкі лінійні розв'язувачі
Прем'єр вільно доступні рідкісні лінійні розв'язувачі майже всі доступні через PETSc , написаний на C, який добре задокументований та підтримується. Ви можете інтерфейсувати в PETSc з будь-якої з мов, які слід врахувати.
Продуктивність та масштабованість великих даних
Єдиними парадигмами паралельного програмування, які ви згадуєте, є спільна пам'ять, що означає, що ви не розглядаєте обчислювальний підхід на основі MPI (передачі повідомлень), розподіленої пам'яті. На мій досвід, набагато простіше написати код, який масштабує значно більше десятка ядер, використовуючи рішення з розподіленою пам'яттю. Майже всі університетські «кластери» є заснованими на MPI в наші дні, великі машини спільної пам’яті дорогі і відповідно рідкісні. Ви повинні врахувати MPI для свого підходу, але моя порада застосовуватиметься незалежно від обраної вами парадигми програмування.
Що стосується продуктивності на вузлі, якщо ви самі пишете числові процедури, найпростіше отримати хороші серійні показники у Fortran. Якщо у вас є трохи досвіду роботи з C, C ++ або Python, ви можете отримати дуже порівнянні показники роботи (C і C ++ мертві, навіть якщо Fortran, Python і MATLAB приходять приблизно за 25% накладні витрати без особливих зусиль). MATLAB робить це за допомогою компілятора JIT і дуже гарної експресивності лінійної алгебри. Ймовірно, вам потрібно буде використовувати Cython, numpy, numexpr або вбудувати числові ядра, щоб отримати заявлену продуктивність від Python. Я не можу коментувати продуктивність Java, тому що я не дуже добре знаю мову, але підозрюю, що це недалеко від Python, якщо її написав експерт.
Примітка про інтерфейси
Сподіваюся, я переконав вас, що ви зможете робити все, що завгодно, на будь-якій з мов програмування, які ви розглядаєте. Якщо ви використовуєте Java, інтерфейси C будуть трохи складними. Python має чудову підтримку інтерфейсів C та Fortran через ctypes, Cython та f2py. LAPACK вже обгорнутий і доступний через scipy. MATLAB має весь функціонал, який вам потрібен у своїх рідних бібліотеках, але його не можна легко масштабувати або особливо легко працювати на кластерах. Java може підтримувати інтерфейси C і Fortran з JNI , але зазвичай не зустрічається на кластерах і паралельному програмному забезпеченні для наукових обчислень.
Технічне обслуговування
Багато цього зводиться до особистого смаку, але загальний консенсус щодо ремонтопридатності полягає в тому, що ви хочете мінімізувати кількість рядків коду у вашому програмному забезпеченні, писати модульний код з чітко визначеними інтерфейсами та для обчислювального програмного забезпечення. тести, що підтверджують правильність та функціональність реалізації.
Рекомендація
Особисто мені пощастило з Python, і я рекомендую його для багатьох обчислювальних проектів. Думаю, ви повинні чітко врахувати це для свого проекту. Python та MATLAB, мабуть, найбільш виразні з мов, доступних для наукових обчислень. Ви можете легко інтерфейсувати Python з будь-якою іншою мовою програмування. Ви можете використовувати f2py, щоб обернути поточну реалізацію Fortran і переписати по частинах ті частини, які ви бажаєте в Python, перевіривши, що ви підтримуєте функціональність. У цей час я рекомендував би поєднувати офіційну реалізацію Python 2.7 з scipy . Ви можете дуже легко розпочати цей стек із вільно доступного дистрибутива Enthought Python .
Ви також можете зробити більшість цього в C, C ++ або Fortran. C і C ++ є дуже привабливими мовами для професійних розробників з великим досвідом роботи, але часто відвідують нових розробників і, мабуть, у цьому сенсі не є чудовою ідеєю для більш академічного коду. Fortran та MATLAB користуються популярністю в академічних обчисленнях, але слабкі в передових структурах даних та експресивності, які пропонує Python (подумайте, наприклад, про об'єкт диктанту Python).
Пов’язані запитання: