Skip to main content

test_layout/
test_layout.rs

1// Multi-lane layout test: rank 2 packs two incoming lanes into one window
2// (offsets 0 and slot bytes) and two ack counters. Run under mpirun:
3//   mpirun -n 3 test_layout
4
5use mpi::Threading;
6use mpi::collective::CommunicatorCollectives;
7use mpi::topology::{Communicator, Rank, SimpleCommunicator};
8
9use mpi_rma::{Message, Ring};
10
11fn lanes(depth: usize, capacity: usize) -> Vec<(Rank, Rank, usize, usize)> {
12    vec![
13        (0, 2, depth, capacity),
14        (1, 2, depth, capacity),
15        (2, 0, depth, capacity),
16        (2, 1, depth, capacity),
17    ]
18}
19
20fn run(world: &SimpleCommunicator, safe: bool) {
21    let rank = world.rank();
22    let ring = if safe {
23        Ring::safe(world, &lanes(2, 8)).unwrap()
24    } else {
25        Ring::raw(world, &lanes(2, 8)).unwrap()
26    };
27
28    if rank < 2 {
29        ring.send(2, &[rank as u8, 1]).unwrap();
30    }
31    world.barrier();
32
33    if rank == 2 {
34        let messages = ring.poll().unwrap();
35        assert_eq!(messages.len(), 2);
36        assert_eq!(messages[0].origin, 0);
37        assert_eq!(messages[0].data, vec![0, 1]);
38        assert_eq!(messages[1].origin, 1);
39        assert_eq!(messages[1].data, vec![1, 1]);
40        ring.ack(0, 1).unwrap();
41        ring.ack(1, 1).unwrap();
42        ring.send(0, &[2, 1]).unwrap();
43        ring.send(1, &[2, 1]).unwrap();
44    }
45    world.barrier();
46
47    if rank < 2 {
48        let messages = ring.poll().unwrap();
49        assert_eq!(
50            messages,
51            vec![Message {
52                origin: 2,
53                sequence: 1,
54                data: vec![2, 1]
55            }]
56        );
57        ring.ack(2, 1).unwrap();
58    }
59    world.barrier();
60
61    ring.close().unwrap();
62}
63
64fn main() {
65    let (universe, provided) =
66        mpi::initialize_with_threading(Threading::Multiple).expect("MPI must initialize once");
67    assert_eq!(provided, Threading::Multiple);
68    let world = universe.world();
69    assert_eq!(world.size(), 3);
70
71    run(&world, true);
72    run(&world, false);
73
74    if world.rank() == 0 {
75        println!("test_layout: ok");
76    }
77}