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 在 科学
每月426次下载
97KB
2K SLoC
对消息传递接口(MPI)的轻量级封装
内容
介绍
MsgPass(消息传递)是MPI的Rust轻量级封装。我们考虑MPI函数的小子集。随着我们的项目需要更多功能,这个子集将增长。我们在c_code
目录中手动实现C函数,Rust可以轻松地通过FFI调用这些函数。
我们尽可能多地测试所有函数,但测试覆盖率可以更好。必须使用mpiexec
调用测试,因此可以使用run-tests.bash
脚本来轻松使用。
注意:我们可以通过将它们转换为字节数组来传递字符串。例如
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 MPImpich
:使用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
👆检查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