1use mpi::collective::SystemOperation;
5use mpi::traits::*;
6
7fn main() {
8 let universe = mpi::initialize().unwrap();
9 let world = universe.world();
10 let rank = world.rank();
11 let size = world.size();
12
13 let n: i32 = 1_000_000;
15 if size >= 2 {
16 if rank == 0 {
17 let data: Vec<i32> = (0..n).collect();
18 world.process_at_rank(1).send(&data[..]);
19 let (back, _) = world.process_at_rank(1).receive_vec::<i32>();
20 assert_eq!(back.len(), n as usize, "echo length");
21 assert_eq!(back[n as usize - 1], n - 1, "echo tail");
22 } else if rank == 1 {
23 let (data, _) = world.process_at_rank(0).receive_vec::<i32>();
24 assert_eq!(data.len(), n as usize, "bigmsg length");
25 assert_eq!(data[0], 0);
26 assert_eq!(data[n as usize - 1], n - 1, "bigmsg content");
27 world.process_at_rank(0).send(&data[..]);
28 }
29 }
30
31 {
33 let local = vec![rank; 100_000];
34 let mut sum = vec![0i32; 100_000];
35 world.all_reduce_into(&local[..], &mut sum[..], SystemOperation::sum());
36 let expected: i32 = (0..size).sum();
37 assert!(
38 sum.iter().all(|&x| x == expected),
39 "big all_reduce mismatch"
40 );
41 }
42
43 world.barrier();
44 if rank == 0 {
45 println!(
46 "BIGMSG PASS: {} MB round-trip + large all-reduce via rendezvous on {size} ranks.",
47 n * 4 / 1_000_000
48 );
49 }
50}