我希望为我的研究创建一些小型生物信息学程序的实现.我的主要考虑因素之一是性能,虽然我知道我可以将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.)事情进展顺利,到目前为止我没有任何问题.

Rust相关问答推荐

WebDriver等待三十四?(Rust Se)

有条件默认实现

铁 rust 干线无法使用PowerShell获取环境变量

如何使用syn插入 comments ?

为什么Rust函数的移植速度比C++慢2倍?

在IntoIter上调用.by_ref().Take().rev()时会发生什么情况

如何在嵌套的泛型 struct 中调用泛型方法?

将特征与具有生命周期的关联类型一起使用时的生命周期方差问题

如何在 Rust 中将函数项变成函数指针

Rust 如何将链表推到前面?

更新 rust ndarray 中矩阵的一行

相当于 Rust 中 C++ 的 std::istringstream

Rust中的一生语法有什么作用?

如何在 Rust 中显式声明 std::str::Matches<'a, P> ?

Rust 中的自动取消引用是如何工作的?

使用 lalrpop 在 rust 中解析由 " 引用的字符串

如何使用泛型满足 tokio 异步任务中的生命周期界限

在构建器模式中捕获 &str 时如何使用生命周期?

如何存储返回 Future 的闭包列表并在 Rust 中的线程之间共享它?

火箭整流罩、tokio-scheduler 和 cron 的生命周期问题