我希望为我的研究创建一些小型生物信息学程序的实现.我的主要考虑因素之一是性能,虽然我知道我可以将Rust程序安排在带有qsub的网格上运行——我可以访问的集群使用Oracle的GridEngine——但我担心我没有直接调用MPI会导致Rust程序出现性能问题.
在不使用MPI库的情况下调度程序会极大地影响性能吗?我应该在Rust中使用MPI库吗?如果是,是否有已知的Rust MPI库?我已经找过了,但什么也没找到.
我希望为我的研究创建一些小型生物信息学程序的实现.我的主要考虑因素之一是性能,虽然我知道我可以将Rust程序安排在带有qsub的网格上运行——我可以访问的集群使用Oracle的GridEngine——但我担心我没有直接调用MPI会导致Rust程序出现性能问题.
在不使用MPI库的情况下调度程序会极大地影响性能吗?我应该在Rust中使用MPI库吗?如果是,是否有已知的Rust MPI库?我已经找过了,但什么也没找到.
我使用过几种超级计算工具(我是一名天体物理学家),经常遇到同样的问题:我非常熟悉C/C++但更喜欢使用其他语言.
一般来说,除了MPI以外的任何方法都可以,但考虑到这样的超级计算机通常都有大量优化的MPI库,通常针对集群中集成的特定硬件量身定做.如果不使用MPI,很难判断Rust程序的性能会受到多大影响,但最安全的方法是继续使用集群上提供的MPI实现.
在像MPI库这样的C库周围使用防 rust 包装不会对性能造成影响,因为瓶颈是 node 之间传输数据(例如通过MPI_发送)所需的时间,而不是额外函数调用的可忽略成本.(此外,Rust的情况并非如此:如上所述,没有额外的函数调用.)
然而,尽管Rust提供了非常好的FFI,但创建MPI绑定并不容易.问题在于MPI不是一个库,而是一个规范.流行的MPI库有OpenMPI(http://www.open-mpi.org)和MPICH(http://www.mpich.org).它们在实现标准的方式上略有不同,通常使用C预处理器宏来覆盖这些差异.很少有 foreign 金融机构能够处理复杂的宏;我不知道铁 rust 是怎么在这里腐蚀的.
例如,我正在用免费的Pascal实现一个MPI程序,但我不能使用现有的MPICH绑定(http://wiki.lazarus.freepascal.org/MPICH),因为我使用的集群提供了自己的MPI库,出于上述原因,我更喜欢使用这个MPI库.我无法重用MPICH绑定,因为它们假设像MPI_字节这样的常量是硬编码的整数常量.但在我的例子中,它们是指向不透明 struct 的指针,这些 struct 似乎是在调用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/和https://forge.ocamlcore.org/projects/ocamlmpi/.)http://mpi4py.scipy.org.)事情进展顺利,到目前为止我没有任何问题.