Skip to main content

parallel_io/
parallel_io.rs

1//! Parallel I/O self test: each rank writes its own block at a distinct offset;
2//! rank 0 reads the whole file back and verifies. Exits non-zero on mismatch.
3
4use mpi::io::{File, MODE_CREATE, MODE_DELETE_ON_CLOSE, MODE_RDWR};
5use mpi::traits::*;
6
7fn main() {
8    let universe = mpi::initialize().unwrap();
9    let world = universe.world();
10    let rank = world.rank();
11    let size = world.size();
12
13    // Path depends on world size so concurrent jobs of different sizes don't
14    // collide; identical across the ranks of a single job.
15    let path = std::env::temp_dir().join(format!("mpi_no_c_io_{size}.bin"));
16    let mut f = File::open(
17        &world,
18        &path,
19        MODE_CREATE | MODE_RDWR | MODE_DELETE_ON_CLOSE,
20    )
21    .expect("File::open failed");
22
23    let block = [rank * 100, rank * 100 + 1, rank * 100 + 2, rank * 100 + 3];
24    f.write_at_all(rank as u64 * 16, &block)
25        .expect("write failed");
26
27    if rank == 0 {
28        for r in 0..size {
29            let mut buf = [0i32; 4];
30            f.read_at(r as u64 * 16, &mut buf).expect("read failed");
31            assert_eq!(
32                buf,
33                [r * 100, r * 100 + 1, r * 100 + 2, r * 100 + 3],
34                "I/O block mismatch"
35            );
36        }
37        println!("IO PASS: parallel write/read verified on {size} ranks.");
38    }
39
40    world.barrier();
41    // File is deleted on close (drop).
42}