Позвольте мне попробовать и разбить ваши требования:
- Ремонтопригодность
- Чтение / запись текстовых данных
- Сильные интерфейсы / возможности для факторизации LU
- Разреженные линейные решатели
- Производительность и масштабируемость для больших данных
Из этого списка я бы рассмотрел следующие языки:
C, C ++, Фортран, Python, MATLAB, Java
Джулия - новый многообещающий язык, но сообщество все еще формируется вокруг него, и оно не было развернуто ни в каких новых важных кодах.
Чтение / запись текстовых данных
Это легко получить право на любом языке программирования. Убедитесь, что вы должным образом буферизируете и объединяете свой доступ ввода / вывода, и вы получите хорошую производительность на любом из языков, которые вам следует рассмотреть. Избегайте потоковых объектов в C ++, если вы не знаете, как использовать их эффективно.
Сильные интерфейсы / возможности для факторизации LU
Если вы выполняете плотную факторизацию LU, вы захотите использовать LAPACK или ScaLAPACK / Elemental для параллельной функциональности. LAPACK и ScaLAPACK написаны на Фортране, Elemental написан на C ++. Все три библиотеки эффективны, хорошо поддерживаются и документированы. Вы можете взаимодействовать с ними на любом из языков, которые вы должны рассмотреть.
Разреженные линейные решатели
Первичные свободно доступные разреженные линейные решатели почти все доступны через PETSc , написанный на C, который хорошо документирован и поддерживается. Вы можете взаимодействовать с PETSc на любом из языков, которые вы должны рассмотреть.
Производительность и масштабируемость для больших данных
Единственные парадигмы параллельного программирования, о которых вы упомянули, основаны на разделяемой памяти, что означает, что вы не рассматриваете основанный на MPI (передача сообщений) подход к распределенной памяти. По моему опыту, с помощью решения с распределенной памятью гораздо проще писать код, который масштабируется гораздо дальше десятка ядер. В наши дни почти все университетские «кластеры» основаны на MPI, большие машины с общей памятью дороги и, соответственно, редки. Вы должны рассмотреть MPI для вашего подхода, но мой совет будет применяться независимо от выбранной вами парадигмы программирования.
Что касается производительности на узле, если вы сами пишете числовые подпрограммы, проще всего добиться хорошей производительности последовательного интерфейса в Fortran. Если у вас есть небольшой опыт работы с C, C ++ или Python, вы можете получить очень сопоставимую производительность (C и C ++ не имеют себе равных, даже если Fortran, Python и MATLAB занимают около 25% времени без особых усилий). MATLAB делает это с помощью JIT-компилятора и очень хорошей выразительности линейной алгебры. Скорее всего, вам потребуется использовать Cython, numpy, Numberxpr или встраивать числовые ядра, чтобы получить заявленную производительность от Python. Я не могу комментировать производительность Java, потому что я не очень хорошо знаю язык, но подозреваю, что он не так уж далек от Python, если он написан экспертом.
Примечание по интерфейсам
Я надеюсь, что убедил вас, что вы сможете делать все, что хотите, на любом из языков программирования, которые вы рассматриваете. Если вы используете Java, интерфейсы C будут немного сложными. Python имеет превосходную поддержку интерфейса C и Fortran через ctypes, Cython и f2py. LAPACK уже упакован и доступен через scipy. MATLAB обладает всеми необходимыми функциями в своих собственных библиотеках, но его нелегко масштабировать или особенно легко запускать в кластерах. Java может поддерживать интерфейсы C и Fortran с JNI , но обычно не встречается в кластерах и в параллельном программном обеспечении для научных вычислений.
Ремонтопригодность
Многое из этого придет к личному вкусу, но общее согласие в отношении удобства обслуживания заключается в том, что вы хотите минимизировать количество строк кода в своем программном обеспечении, писать модульный код с четко определенными интерфейсами, а для вычислительного программного обеспечения обеспечить тесты, которые проверяют правильность и функциональность реализации.
Рекомендация
Мне лично очень повезло с Python, и я рекомендую его для многих вычислительных проектов. Я думаю, что вы должны строго рассмотреть это для вашего проекта. Python и MATLAB, вероятно, являются наиболее выразительными из языков, доступных для научных вычислений. Вы можете легко связать Python с любым другим языком программирования, вы можете использовать f2py, чтобы обернуть вашу текущую реализацию на Фортране и пошагово переписать те части, которые вы пожелаете в Python, проверяя, поддерживаете ли вы функциональность. В настоящее время я бы порекомендовал сочетание официальной реализации Python 2.7 с scipy . Вы можете легко начать работу с этим стеком из свободно распространяемого дистрибутива Python Enthought .
Вы также можете сделать большую часть этого в C, C ++ или Fortran. C и C ++ являются очень привлекательными языками для профессиональных разработчиков с большим опытом, но часто путают новых разработчиков и в этом смысле, вероятно, не являются хорошей идеей для более академического кода. Fortran и MATLAB популярны в академических вычислениях, но слабы в продвинутых структурах данных и выразительности, которые предлагает Python (например, вспомним объект dict Python).
Смежные вопросы: