use ferrompi::{Mpi, Result};
fn main() -> Result<()> {
let mpi = Mpi::init()?;
let world = mpi.world();
let rank = world.rank();
let size = world.size();
if size < 2 {
if rank == 0 {
eprintln!("This example requires at least 2 processes");
}
return Ok(());
}
let next = (rank + 1) % size;
let prev = (rank + size - 1) % size;
let send_data = vec![rank as f64 * 100.0 + 1.0, rank as f64 * 100.0 + 2.0];
let mut recv_data = vec![0.0; 2];
println!("Rank {}: sending {:?} to rank {}", rank, send_data, next);
if rank % 2 == 0 {
world.send(&send_data, next, 0)?;
let (source, tag, count) = world.recv(&mut recv_data, prev, 0)?;
println!(
"Rank {}: received {:?} from rank {} (tag={}, count={})",
rank, recv_data, source, tag, count
);
} else {
let (source, tag, count) = world.recv(&mut recv_data, prev, 0)?;
println!(
"Rank {}: received {:?} from rank {} (tag={}, count={})",
rank, recv_data, source, tag, count
);
world.send(&send_data, next, 0)?;
}
let expected = vec![prev as f64 * 100.0 + 1.0, prev as f64 * 100.0 + 2.0];
assert_eq!(recv_data, expected, "Data mismatch!");
world.barrier()?;
if rank == 0 {
println!("\nRing communication test passed!");
}
Ok(())
}