我正在寻找为我的研究创建一些小型生物信息学程序的Rust实现。我的主要考虑因素之一是性能,虽然我知道我可以安排Rust程序在qsub的网格上运行 - 我可以访问的集群使用Oracle的GridEngine - 我担心我没有打电话MPI直接导致Rust程序出现性能问题。
在不使用MPI库的情况下安排程序会大大降低性能吗?我应该在Rust中使用MPI库吗?如果是这样,Rust是否有任何已知的MPI库?我找了一个,但我没找到任何东西。
我正在寻找为我的研究创建一些小型生物信息学程序的Rust实现。我的主要考虑因素之一是性能,虽然我知道我可以安排Rust程序在qsub的网格上运行 - 我可以访问的集群使用Oracle的GridEngine - 我担心我没有打电话MPI直接导致Rust程序出现性能问题。
在不使用MPI库的情况下安排程序会大大降低性能吗?我应该在Rust中使用MPI库吗?如果是这样,Rust是否有任何已知的MPI库?我找了一个,但我没找到任何东西。
我使用了几个超级计算设备(我是天体物理学家)并经常面临同样的问题:我非常了解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事情进展顺利,到目前为止我没有遇到任何问题。
在不使用MPI库的情况下安排程序会大大降低性能吗?
有很多方法可以进行并行计算。 MPI是一个,并且对你的问题的评论表明你可以通过一些体操调用Rust的MPI。
但还有其他方法,如PGAS系列(Chapel,OpenSHMEM,Co-array Fortran),或者像Charm ++使用的替代消息。
MPI“简单地”提供(非常有用,高度可移植,积极优化)消息传递抽象,但只要您有一些方法来管理并行性,您就可以在集群上运行任何东西。