在 HPC 中使用 Java 或 Scala?

计算科学 正则 C
2021-12-25 20:45:18

我希望在我的免费 Amazon EC2 上为一个爱好项目复习和/或学习一些语言,我正在查看Java vs C(或Scala vs C)和Fortran vs C的基准测试结果。似乎 Java 与 C 的差距在 Fortran 与 C 中几乎相同,这让我想知道 JVM(及其 JIT 优化)的进步是否足够快以在高性能(科学)中占据与 C 和 Fortran 相同的地位) 在不久的将来计算。

除性能外,要考虑的因素可能是:

  1. 代码的可读性、可维护性和表达性
  2. 可扩展硬件基础设施的成本
  3. 图书馆的可用性
  4. 并行和/或并发编程支持
  5. 人才库

编辑问题:在所有高性能计算领域中,哪些领域可能会看到 Java/Scala JVM 生态系统的兴起?例如,在我看来,复杂系统分析、经济/金融、机器学习等可能是其中一些领域。还有什么?

2015 年 9 月 24 日编辑:在我发布了这个问题之后,我遇到了这篇旧的(2007 年)博客文章,它为 Java 和 C 重新做了一些相同的基准测试游戏,但在排除了最初的预热/优化运行之后(虽然, 它的效果是有争议的) 对于几个不同的 Java 编译器,结果是相当令人惊讶的。虽然,正如 Isaac Gouy 在该博客上的评论所说,为每个基准测试运行 4-5 次试验可能不足以平均该系统上运行的其他进程的处理器使用率。但仍然是一个有趣的博客。自 2007 年那篇博客以来,我相信 JRockit 和 HotSpot 编译器已被 Oracle 合并,但不确定它们与 C 编译器的组合性能如何。

4个回答

Java 作为一种主要的编程语言已经存在了将近 20 年,但到目前为止它还没有在科学计算领域流行起来。我认为这是一个很好的指标,可以预测未来会发生什么。

我的看法是,问题不在于速度。大多数人可能愿意放弃 20% 的性能(甚至是 2 倍),如果他们能更快地开发他们的程序的话。但 Java 与 C++ 的情况似乎并非如此(尽管 Java 与 Fortran 几乎可以肯定是这样)。我认为实际上情况正好相反:因为实际上所有 HPC 库(尤其是用于线性代数和有限元方法)都是用 C 或 C++ 编写的,所以使用 Java 将是一大痛苦,因为必须以某种方式翻译现有的接口。对于 PETSc、Trilinos(或我自己的项目 deal.II)大小的库,这根本不可行。

换句话说,使用 Java(或 Scala,或您想到的任何其他语言),与 C++ 相比,负担是巨大的:您要么必须编写现有库的包装器和接口,要么必须重新实现现有库的数十万行代码。听起来都不是一个有吸引力的选择。

在我看来这不太可能。Java MPI API 多年未开发(所以您对#4 的看法是错误的),而且 JVM 的浮点性能是出了名的差。由于快速的线程创建和简单的内存管理,Java 可能在某些领域胜过 C/C++ 或 Fortran,但这些并不是典型科学程序的瓶颈。

至于你的#5,很多 Java 程序员的可用性并不是那么有帮助。我发现优秀的科学程序员需要了解科学和软件工程。这两个方面都是可训练的,因此您必须花时间在科学或软件工程上进行培训,才能成为一名优秀的科学程序员。也有很多优秀的科学家,所以潜在的人才库足够大,最终可以从任何一方提供优秀的科学程序员。

我认为,与现代 c++ 相比,Java 实际上会降低生产力,甚至与现代 Fortran 相比,以科学计算为目的。写作

A = B*C+2*D

可读性比

A = B.mult(C).add(D.mult(2))

假设上面的代码处理数组,C++ 和 fortran 也会为该示例生成更高效的代码,具体取决于您选择的库。Scala 是一种更好的语言,因为它允许使用体面的语法,尽管创建大量临时对象仍然会影响性能。

Java 和 Scala 都没有将复杂数据作为原始类型,这意味着在进行计算时会有很大的开销。

正如其他人所说,您需要一个体面的 C/Fortran 库接口来进行科学计算。这可以在 Java 和 Scala 中完成,但可能需要大量工作。

如果您想学习一种“商业”编程语言,并且您正在使用科学计算作为培训,我会考虑使用 C#,它对这些东西具有更合理的语法。

如果你只是想做科学编程,我会考虑学习 Julia,作为一种“快速完成工作”的语言。这将使您获得比 JVM 语言更快的代码,具有出色的绘图支持(通过 python)并且为科学计算积极开发。

如果您想学习一种新的编程范式,请尝试 F#,因为您仍然可以轻松访问各种 .NET 库以进行科学计算。

最后,如果您想要高性能,C++ 目前比 Java 更具表现力,并且对 OMP 有不错的并行支持。可以说,它还具有上述任何语言的最佳库支持。

话虽这么说,Java 在金融领域被大量使用。请记住,COBOL 也是如此,它会告诉您有关金融领域编程的所有信息。

我是名为Deeplearning4j的机器学习库的贡献者。

我们看到金融、电信、政府机构等行业对基于 JVM 的工具有相当大的需求。

我们开发了ND4J,它支持 Java 的 n 维数组,并包含一个 Scala 包装器 ND4S。

所有优化都在 C/C++ 中,但该框架与 Hadoop 和 Spark 集成,使它们能够在多个 GPU 上运行。