structured/
structured.rs

1#![deny(warnings)]
2extern crate mpi_fork_fnsp as mpi;
3
4use mpi::{datatype::UserDatatype, traits::*};
5use std::mem::size_of;
6
7struct MyInts([i32; 3]);
8
9unsafe impl Equivalence for MyInts {
10    type Out = UserDatatype;
11    fn equivalent_datatype() -> Self::Out {
12        UserDatatype::structured(
13            &[1, 1, 1],
14            &[
15                (size_of::<i32>() * 2) as mpi::Address,
16                size_of::<i32>() as mpi::Address,
17                0,
18            ],
19            &[i32::equivalent_datatype(); 3],
20        )
21    }
22}
23
24fn main() {
25    let universe = mpi::initialize().unwrap();
26    let world = universe.world();
27
28    let root_process = world.process_at_rank(0);
29
30    if world.rank() == 0 {
31        root_process.broadcast_into(&mut MyInts([3, 2, 1]));
32    } else {
33        let mut ints: [i32; 3] = [0, 0, 0];
34        root_process.broadcast_into(&mut ints[..]);
35
36        assert_eq!([1, 2, 3], ints);
37    }
38}