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