让我尝试分解您的要求:
- 可维护性
- 读/写文本数据
- LU分解的强大接口/能力
- 稀疏线性求解器
- 大数据的性能和可扩展性
从这个列表中,我会考虑以下语言:
C、C++、Fortran、Python、MATLAB、Java
Julia 是一种很有前途的新语言,但社区仍在围绕它形成,并且尚未在任何主要的新代码中部署。
读/写文本数据
这在任何编程语言中都很容易做到。确保您适当地缓冲和合并您的 I/O 访问,并且您将从您应该考虑的任何语言中获得良好的性能。避免使用 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 通过 ctypes、Cython 和 f2py 具有出色的 C 和 Fortran 接口支持。LAPACK 已经打包并通过 scipy 提供。MATLAB 在其本机库中具有您需要的所有功能,但不易扩展或特别容易在集群上运行。Java 可以通过JNI支持 C 和 Fortran 接口,但在集群和用于科学计算的并行软件中并不常见。
可维护性
很多这将归结为个人喜好,但关于可维护性的普遍共识是,您希望最大限度地减少软件中的代码行数,编写具有明确定义的接口的模块化代码,对于计算软件,提供验证实现的正确性和功能性的测试。
推荐
我个人对 Python 很幸运,我推荐它用于许多计算项目。我认为您应该为您的项目强烈考虑它。Python 和 MATLAB 可能是可用于科学计算的最具表现力的语言。您可以轻松地将 Python 连接到任何其他编程语言,您可以使用 f2py 来包装您当前的 Fortran 实现,并在验证您是否正在维护功能的同时,在 Python 中逐段重写您希望使用的任何部分。此时,我会推荐将官方 Python 2.7 实现与scipy结合使用。您可以从免费提供的 Enthought Python Distribution轻松开始使用此堆栈。
您也可以在 C、C++ 或 Fortran 中完成大部分操作。对于具有丰富经验的专业开发人员来说,C 和 C++ 是非常有吸引力的语言,但经常会绊倒新开发人员,从这个意义上说,对于更具学术性的代码来说,这可能不是一个好主意。Fortran 和 MATLAB 在学术计算中很流行,但在 Python 提供的高级数据结构和表达能力方面很弱(例如,想想 Python dict 对象)。
相关问题: