问题 网格计算上的锈


我正在寻找为我的研究创建一些小型生物信息学程序的Rust实现。我的主要考虑因素之一是性能,虽然我知道我可以安排Rust程序在qsub的网格上运行 - 我可以访问的集群使用Oracle的GridEngine - 我担心我没有打电话MPI直接导致Rust程序出现性能问题。

在不使用MPI库的情况下安排程序会大大降低性能吗?我应该在Rust中使用MPI库吗?如果是这样,Rust是否有任何已知的MPI库?我找了一个,但我没找到任何东西。


2941
2018-04-08 22:31


起源

如果您选择的MPI库有一个C接口(大多数都有AFAIK),您可以使用Rust的那个接口。它可能不太方便(或者更多的工作,如果你自己创建一个方便的包装器),但它应该快得多。
我假设使用MPI的C库/接口将与在C中使用它一样高效...这是正确的吗?或者在Rust中使用C lib时我是否会失去一些性能?理想情况下,我可以使用用Rust编写的MPI库,但似乎不存在。另外,在提到原始问题时 - 如果我不使用MPI lib,它会产生多大影响吗? - josh
C FFI的官方意图与C-to-C呼叫一样快。我不知道这是否已经完全实现,但如果没有,它现在应该非常接近,将来更接近。对于你的其余问题:我不知道用Rust编写的任何MPI库,我不知道使用MPI库和使用qsub将如何影响性能。 (而且我对该领域的了解不足以声称后者在没有更多细节的情况下无法回答。)
好的,谢谢@delnan。我有最后一个问题,这是主观的 - 你认为在Rust中创建一个MPI库是值得的吗? OpenMPI源码?看看Rust处理FFI的方式,即将C函数看作是不安全的,我觉得这是一个妥协,拥有一个不需要明智地使用的直接MPI库会更好。 unsafe。此外,如果你想回答问题而不是评论,我会接受。 - josh


答案:


我使用了几个超级计算设备(我是天体物理学家)并经常面临同样的问题:我非常了解C / C ++,但更喜欢使用其他语言。

一般而言,除MPI之外的任何方法都可以,但考虑到这种超级计算机通常具有大量优化的MPI库,通常是针对集群中集成的特定硬件而定制的。如果不使用MPI,很难说出Rust程序的性能会受到多大影响,但最安全的选择是继续使用集群上提供的MPI实现。

在诸如MPI库之类的C库周围使用Rust包装器没有性能损失,因为瓶颈是在节点之间传输数据(例如,通过MPI_Send)所需的时间,而不是额外函数调用的可忽略的成本。 (此外,Rust的情况并非如此:没有额外的函数调用,如上所述。)

但是,尽管Rust提供了非常好的FFI,但创建MPI绑定并不容易。问题在于MPI不是库,而是规范。流行的MPI库是OpenMPI(http://www.open-mpi.org)和MPICH(http://www.mpich.org)。它们中的每一个在实现标准方面略有不同,它们通常使用C预处理器宏来弥补这些差异。很少有FFI能够处理复杂的宏;我不知道Rust在这里得分如何。

作为一个例子,我正在使用Free Pascal实现MPI程序但是我无法使用现有的MPICH绑定(http://wiki.lazarus.freepascal.org/MPICH),因为我使用的集群提供了自己的MPI库,我更喜欢使用这个库,原因如上所述。我无法重用MPICH绑定,因为他们认为像MPI_BYTE这样的常量是硬编码的整数常量。但在我的例子中,它们是指向不透明结构的指针,这些结构似乎是在调用MPI_Init时创建的。

朱莉娅绑定到MPI(https://github.com/lcw/MPI.jl)通过在安装期间运行C和Fortran程序来解决此问题,这些程序生成具有此类常量的正确值的Julia代码。参见例如 https://github.com/lcw/MPI.jl/blob/master/deps/make_f_const.f

在我的情况下,我倾向于实现一个中间件,即一个小型C库,它使用更“可预测”的界面包装MPI调用。 (这或多或少是Python和Ocaml绑定所做的,请参阅 https://forge.ocamlcore.org/projects/ocamlmpi/ 和 http://mpi4py.scipy.org事情进展顺利,到目前为止我没有遇到任何问题。


15
2017-08-29 19:53



谢谢!很抱歉花了这么长时间才接受这个答案。我的研究最终朝着不同的方向发展,所以我不需要在Rust中为我的集群编写任何程序,但我可能会重新审视它,因为Rust接近v 1.0并且API被锁定。您是否在MPI(使用OpenMPI或MPICH)设置中使用了Rust?我有兴趣知道它如何处理你提出的关于宏的问题。 - josh
不,目前我正在慢慢放弃Free Pascal而转而支持 稔,因为它生成C程序而不是像Rust这样的二进制文件。因此,应该更容易创建绑定到“讨厌”的库,如OpenMPI。 (我还没有写过绑定到MPI,但是:我仍在为我的目的编写一些基本库。但是MPI绑定肯定是我很快就会做的。) - Maurizio Tomasi


在不使用MPI库的情况下安排程序会大大降低性能吗?

有很多方法可以进行并行计算。 MPI是一个,并且对你的问题的评论表明你可以通过一些体操调用Rust的MPI。

但还有其他方法,如PGAS系列(Chapel,OpenSHMEM,Co-array Fortran),或者像Charm ++使用的替代消息。

MPI“简单地”提供(非常有用,高度可移植,积极优化)消息传递抽象,但只要您有一些方法来管理并行性,您就可以在集群上运行任何东西。


1
2017-07-23 14:36