spawn/
spawn.rs

1#![deny(warnings)]
2use std::env;
3use std::process::Command;
4
5use mpi::topology::MergeOrder;
6use mpi::traits::*;
7
8fn main() -> Result<(), mpi::MpiError> {
9    let universe = mpi::initialize().unwrap();
10    let world = universe.world();
11
12    let merged = if let Some(parent) = world.parent() {
13        assert_eq!("from_parent", env::args().skip(1).next().unwrap());
14
15        parent.process_at_rank(0).send(&7i32);
16
17        println!(
18            "[{}/{}] Child universe {:?}",
19            world.rank(),
20            world.size(),
21            universe.size()
22        );
23        parent.merge(MergeOrder::High)
24    } else {
25        let child_size = 1;
26        let mut exe = Command::new(env::current_exe().unwrap());
27        exe.arg("from_parent");
28
29        let child = world.process_at_rank(0).spawn(&exe, child_size)?;
30
31        assert_eq!(child_size, child.remote_size());
32
33        if world.rank() == 0 {
34            assert_eq!(7i32, child.process_at_rank(0).receive().0);
35        }
36        println!(
37            "[{}/{}] Parent universe {:?} appnum {}",
38            world.rank(),
39            world.size(),
40            universe.size(),
41            universe.appnum().unwrap_or(-1),
42        );
43        child.merge(MergeOrder::Low)
44    };
45    println!(
46        "[{}/{}] Merged is World {}/{}",
47        merged.rank(),
48        merged.size(),
49        world.rank(),
50        world.size()
51    );
52    Ok(())
53}