spawn_multiple/
spawn_multiple.rs1#![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}