Skip to main content

bigmsg/
bigmsg.rs

1//! Exercises the large-message rendezvous path: multi-megabyte point-to-point
2//! transfers (both directions) and a large all-reduce.
3
4use 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    // ---- point-to-point: 4 MB round trip (well above the 64 KiB threshold) ----
14    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    // ---- large all-reduce (400 KB per rank -> rendezvous inside the tree) ----
32    {
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}