让我尝试分解您的要求:
- 可维护性
- 读/写文本数据
- 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的经验,那么您将获得非常可比的性能(即使使用Fortran,C和C ++也会死机,即使花费很多精力,Python和MATLAB的时间开销也只有大约25%)。MATLAB通过JIT编译器和非常好的线性代数表示性来实现这一点。您可能需要使用Cython,numpy,numexpr或嵌入式数字内核,才能从Python获得所需的性能。我不能评论Java的性能,因为我不太了解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发行版非常容易地开始使用此堆栈。
您也可以在C,C ++或Fortran中完成大多数操作。对于具有丰富经验的专业开发人员而言,C和C ++是非常吸引人的语言,但经常使新开发人员感到困惑,因此从某种意义上来说,对于更具学术性的代码而言,这可能不是一个好主意。Fortran和MATLAB在学术计算中很流行,但是在Python提供的高级数据结构和表达能力上却很薄弱(例如,想想Python dict对象)。
相关问题: