#mpi #parallel #cluster

msgpass

对消息传递接口(MPI)的轻量级封装

7个版本 (4个重大更新)

0.5.0 2024年4月30日
0.4.0 2024年1月18日
0.3.0 2024年1月17日
0.2.2 2024年1月15日
0.1.0 2024年1月14日

#79科学

Download history 188/week @ 2024-04-28 4/week @ 2024-05-05 10/week @ 2024-05-19

每月426次下载

MIT许可证

97KB
2K SLoC

Rust 1.5K SLoC // 0.0% comments C 160 SLoC // 0.1% comments BASH 75 SLoC // 0.1% comments

对消息传递接口(MPI)的轻量级封装

Test on macOS Test on Linux Test on Linux with Intel MPI

documentation

内容

介绍

MsgPass(消息传递)是MPI的Rust轻量级封装。我们考虑MPI函数的小子集。随着我们的项目需要更多功能,这个子集将增长。我们在c_code目录中手动实现C函数,Rust可以轻松地通过FFI调用这些函数。

我们尽可能多地测试所有函数,但测试覆盖率可以更好。必须使用mpiexec调用测试,因此可以使用run-tests.bash脚本来轻松使用。

documentation

注意:我们可以通过将它们转换为字节数组来传递字符串。例如

let mut bytes = vec![0_u8; MAX];
str_to_bytes(&mut bytes, "Hello World 😊");
comm.broadcast_bytes(0, &mut bytes)?;

安装

Debian/Ubuntu Linux

首先,安装OpenMPI、MPICH或Intel MPI。例如,

sudo apt install libopenmpi-dev

sudo apt install libmpich-dev

bash ./zscripts/install-intel-mpi-debian.bash

使用相应的feature

  • intel:使用Intel MPI
  • mpich:使用MPICH
  • (默认):使用OpenMPI

对于Intel MPI,请记住首先调用setvars.sh

source /opt/intel/oneapi/setvars.sh

macOS

macOS上,安装以下软件包

brew install llvm open-mpi

还要导出以下环境变量

export echo TMPDIR=/tmp

设置Cargo.toml

Crates.io

👆检查crate版本并相应更新Cargo.toml

[dependencies]
msgpass = "*"

或者,考虑可选的features

[dependencies]
msgpass = { version = "*", features = ["intel"] }

示例

另请参阅

以下示例(位于examples目录中)将从一个ROOT发送数组到所有其他处理器。

use msgpass::*;

fn main() -> Result<(), StrError> {
    mpi_init()?;

    let mut comm = Communicator::new()?;
    let rank = comm.rank()?;
    let size = comm.size()?;

    const ROOT: i32 = 0;
    const TAG: i32 = 70;

    if rank == ROOT as usize {
        let x = vec![1.0, 2.0, 3.0];
        for to in 1..size {
            comm.send_f64(&x, to, TAG)?;
        }
        println!("{}: x = {:?}", rank, x);
    } else {
        let mut y = vec![0.0, 0.0, 0.0];
        comm.receive_f64(&mut y, ROOT, TAG)?;
        println!("{}: y = {:?}", rank, y);
    }

    mpi_finalize()
}

使用mpiexec -np 4 ex_send_receive运行上述代码(请参阅run-examples.bash),我们得到类似以下输出

### ex_send_receive ######################################################
2: y = [1.0, 2.0, 3.0]
0: x = [1.0, 2.0, 3.0]
3: y = [1.0, 2.0, 3.0]
1: y = [1.0, 2.0, 3.0]

路线图

  • 实现基本功能
    • 初始化和终结
    • 中止和屏障
  • 包装更多MPI函数
    • 实现发送/接收
    • 实现reduce/allreduce
    • 实现scatter/gather/allgather
  • 处理复数

依赖项

~205–455KB