test_layout/
test_layout.rs1use 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}