vector/
vector.rs

1#![deny(warnings)]
2
3use mpi::datatype::{MutView, UserDatatype, View};
4use mpi::point_to_point as p2p;
5use mpi::topology::Rank;
6use mpi::traits::*;
7
8fn main() {
9    let universe = mpi::initialize().unwrap();
10    let world = universe.world();
11    let rank = world.rank();
12    let size = world.size();
13
14    let next_rank = (rank + 1) % size;
15    let next_process = world.process_at_rank(next_rank);
16    let previous_rank = (rank - 1 + size) % size;
17    let previous_process = world.process_at_rank(previous_rank);
18
19    let b1 = (1..).map(|x| rank * x).take(6).collect::<Vec<_>>();
20    let mut b2 = std::iter::repeat(-1).take(6).collect::<Vec<_>>();
21    println!("Rank {} sending message: {:?}.", rank, b1);
22    world.barrier();
23
24    let t = UserDatatype::vector(2, 2, 3, &Rank::equivalent_datatype());
25    let status;
26    {
27        let v1 = unsafe { View::with_count_and_datatype(&b1[..], 1, &t) };
28        let mut v2 = unsafe { MutView::with_count_and_datatype(&mut b2[..], 1, &t) };
29        status = p2p::send_receive_into(&v1, &next_process, &mut v2, &previous_process);
30    }
31
32    println!(
33        "Rank {} received message: {:?}, status: {:?}.",
34        rank, b2, status
35    );
36    world.barrier();
37
38    let b3 = (1..)
39        .map(|x| if x % 3 == 0 { -1 } else { previous_rank * x })
40        .take(6)
41        .collect::<Vec<_>>();
42    assert_eq!(b3, b2);
43}