spawn_multiple/
spawn_multiple.rs

1#![deny(warnings)]
2use std::env;
3use std::process::Command;
4
5use mpi::traits::*;
6
7fn main() -> Result<(), mpi::MpiError> {
8    let universe = mpi::initialize().unwrap();
9    let world = universe.world();
10
11    if let Some(parent) = world.parent() {
12        let child_name = env::args().skip(1).next().unwrap();
13        let appnum = universe.appnum().unwrap_or(-1);
14        println!(
15            "[{}/{}] {} ({}) has parent size {}, universe {:?}",
16            world.rank(),
17            world.size(),
18            child_name,
19            appnum,
20            parent.remote_size(),
21            universe.size(),
22        );
23    } else {
24        fn self_with_arg(arg: &str) -> Command {
25            let mut exe = Command::new(env::current_exe().unwrap());
26            exe.arg(arg);
27            exe
28        }
29        let child_sizes = [2, 1];
30        let commands = vec![self_with_arg("FirstChild"), self_with_arg("SecondChild")];
31
32        let child = world
33            .process_at_rank(0)
34            .spawn_multiple(&commands, &child_sizes)?;
35
36        assert_eq!(child_sizes.iter().sum::<i32>(), child.remote_size());
37
38        println!(
39            "[{}/{}] Parent universe {:?}",
40            world.rank(),
41            world.size(),
42            universe.size(),
43        );
44    }
45    Ok(())
46}