ready_send/
ready_send.rs

1#![deny(warnings)]
2extern crate mpi_fork_fnsp as mpi;
3
4use mpi::topology::Rank;
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    if rank > 0 {
14        let msg = rank as u8;
15        world.barrier();
16        world.process_at_rank(0).ready_send(&msg);
17    } else {
18        let mut v = vec![0u8; (size - 1) as usize];
19        mpi::request::scope(|scope| {
20            let reqs = v
21                .iter_mut()
22                .zip(1..)
23                .map(|(x, i)| {
24                    world
25                        .process_at_rank(i as Rank)
26                        .immediate_receive_into(scope, x)
27                })
28                .collect::<Vec<_>>();
29            world.barrier();
30            for req in reqs {
31                req.wait();
32            }
33        });
34        println!("Got message: {:?}", v);
35        assert!(v.iter().zip(1..).all(|(x, i)| i == *x as usize));
36    }
37}