首页 文章

网格计算上的锈

提问于
浏览
11

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

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

2 回答

  • 15

    我使用了几个超级计算设备(我是一名天体物理学家)并经常面临同样的问题:我非常了解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时创建的 .

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

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

  • 1

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

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

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

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

相关问题