jos*_*osh 13 mpi grid-computing rust
我正在寻找为我的研究创建一些小型生物信息学程序的Rust实现.我的一个主要考虑因素是性能,虽然我知道我可以安排Rust程序在qsub的网格上运行 - 我可以访问的集群使用Oracle的GridEngine - 我担心的是我没有调用它MPI直接导致Rust程序出现性能问题.
在不使用MPI库的情况下安排程序会大大降低性能吗?我应该在Rust中使用MPI库吗?如果是这样,Rust是否有任何已知的MPI库?我找了一个,但我没找到任何东西.
Mau*_*asi 18
我使用了几个超级计算设备(我是天体物理学家)并经常面临同样的问题:我非常了解C/C++,但更喜欢使用其他语言.
一般而言,除MPI之外的任何方法都可以,但考虑到这种超级计算机通常具有大量优化的MPI库,通常是针对集群中集成的特定硬件而定制的.如果不使用MPI,很难说出Rust程序的性能会受到多大影响,但最安全的选择是继续使用集群上提供的MPI实现.
在像CID库这样的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库,它用更"可预测"的界面包装MPI调用.(这或多或少是Python和Ocaml绑定所做的,请参阅https://forge.ocamlcore.org/projects/ocamlmpi/和http://mpi4py.scipy.org.)事情进展顺利,到目前为止我没有任何问题.