1 个不稳定版本

0.6.0 2022年3月24日

#619 in 并发


funspace 中使用

MIT/Apache

245KB
5K SLoC

mpi-fork-fnsp

Rust 语言的 Message Passing Interface 绑定

Message Passing Interface (MPI) 是一种消息传递风格并发库的规范。MPI 的实现通常用于在高性能计算系统中结构化并行计算。MPI 规范描述了 C 编程语言(及其通过它 C++)以及 Fortran 编程语言的绑定。这个库试图将 Rust 世界连接起来。

这个包是从 RSMPI 分支出来的。

与原始库的主要区别

  • 使用最新版本,crates.io 上的旧版本无法编译
  • 增加对复数的支持
  • 将工作空间合并到单个 crate 中

用法

在您的 Cargo.toml 中将 mpi crate 添加为依赖项

[dependencies]
mpi = { path = "mpi-fork-fnsp",  version = "0.6" }

然后在您的程序中使用它,如下所示

extern crate mpi;

use mpi::traits::*;

fn main() {
    let universe = mpi::initialize().unwrap();
    let world = universe.world();
    let size = world.size();
    let rank = world.rank();

    if size != 2 {
        panic!("Size of MPI_COMM_WORLD must be 2, but is {}!", size);
     }

    match rank {
        0 => {
            let msg = vec![4.0f64, 8.0, 15.0];
            world.process_at_rank(rank + 1).send(&msg[..]);
        }
        1 => {
            let (msg, status) = world.any_process().receive_vec::<f64>();
            println!("Process {} got message {:?}.\nStatus is: {:?}", rank, msg, status);
        }
        _ => unreachable!()
    }
}

功能

绑定遵循 MPI 3.1 规范。

目前支持

  • 组、上下文、通信器:
    • 第 6 节中的组和管理(内联)通信器基本完成。
    • 无跨通信器
    • 无进程拓扑
  • 点对点通信:
    • 标准、缓冲、同步和就绪模式的发送,有阻塞和非阻塞两种形式
    • 接收,有阻塞和非阻塞两种形式
    • 发送-接收
    • 探测
    • 匹配的探测/接收
  • 集体通信:
    • 屏障
    • 广播
    • (全部) 聚集
    • 分散
    • 全到全
    • 可变计数操作
    • 归约/扫描
    • 阻塞和非阻塞形式
  • 数据类型:在 Rust 类型与 MPI 基本类型以及可以作为缓冲区视图的自定义 MPI 数据类型之间建立桥梁。

不支持(尚不支持)

  • 进程管理
  • 单向通信(RMA)
  • MPI 并行 I/O
  • 许多小事情

子模块包含了对哪些功能支持和不支持的更详细描述。

进一步阅读

虽然本仓库中的每个公开定义的项目都应该附有文档,但目前的描述大多非常简略,对于初学者来说,只有与MPI规范结合才能理解其含义。

许可证:MIT/Apache-2.0

依赖项

~0.4–3MB
~60K SLoC