readme/
readme.rs

1#![deny(warnings)]
2extern crate mpi_fork_fnsp as mpi;
3
4use mpi::request::WaitGuard;
5use mpi::traits::*;
6
7fn main() {
8    let universe = mpi::initialize().unwrap();
9    let world = universe.world();
10    let size = world.size();
11    let rank = world.rank();
12
13    let next_rank = if rank + 1 < size { rank + 1 } else { 0 };
14    let previous_rank = if rank > 0 { rank - 1 } else { size - 1 };
15
16    let msg = vec![rank, 2 * rank, 4 * rank];
17    mpi::request::scope(|scope| {
18        let _sreq = WaitGuard::from(
19            world
20                .process_at_rank(next_rank)
21                .immediate_send(scope, &msg[..]),
22        );
23
24        let (msg, status) = world.any_process().receive_vec();
25
26        println!(
27            "Process {} got message {:?}.\nStatus is: {:?}",
28            rank, msg, status
29        );
30        let x = status.source_rank();
31        assert_eq!(x, previous_rank);
32        assert_eq!(vec![x, 2 * x, 4 * x], msg);
33
34        let root_rank = 0;
35        let root_process = world.process_at_rank(root_rank);
36
37        let mut a;
38        if world.rank() == root_rank {
39            a = vec![2, 4, 8, 16];
40            println!("Root broadcasting value: {:?}.", &a[..]);
41        } else {
42            a = vec![0; 4];
43        }
44        root_process.broadcast_into(&mut a[..]);
45        println!("Rank {} received value: {:?}.", world.rank(), &a[..]);
46        assert_eq!(&a[..], &[2, 4, 8, 16]);
47    });
48}