immediate_broadcast/
immediate_broadcast.rs

1#![deny(warnings)]
2extern crate mpi_fork_fnsp as mpi;
3
4use mpi::traits::*;
5
6fn main() {
7    let universe = mpi::initialize().unwrap();
8    let world = universe.world();
9    let root_rank = 0;
10    let root_process = world.process_at_rank(root_rank);
11
12    let mut x;
13    if world.rank() == root_rank {
14        x = 2_u64.pow(10);
15        println!("Root broadcasting value: {}.", x);
16    } else {
17        x = 0_u64;
18    }
19    mpi::request::scope(|scope| {
20        root_process.immediate_broadcast_into(scope, &mut x).wait();
21    });
22    println!("Rank {} received value: {}.", world.rank(), x);
23    assert_eq!(x, 1024);
24    println!();
25
26    let mut a;
27    let n = 4;
28    if world.rank() == root_rank {
29        a = (1..).map(|i| 2_u64.pow(i)).take(n).collect::<Vec<_>>();
30        println!("Root broadcasting value: {:?}.", &a[..]);
31    } else {
32        a = std::iter::repeat(0_u64).take(n).collect::<Vec<_>>();
33    }
34    mpi::request::scope(|scope| {
35        root_process
36            .immediate_broadcast_into(scope, &mut a[..])
37            .wait();
38    });
39    println!("Rank {} received value: {:?}.", world.rank(), &a[..]);
40    assert_eq!(&a[..], &[2, 4, 8, 16]);
41}