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}