Skip to content

Commit

Permalink
Initial error handling:
Browse files Browse the repository at this point in the history
* Make functions in point_to_point.rs return Result
* Add error.rs + ErrorKind enum for representing MPI error classes
* Set the errhandler for MPI_COMM_WORLD to ERRORS_RETURN by default
  • Loading branch information
jtronge committed Aug 25, 2022
1 parent f3110f4 commit 8b78725
Show file tree
Hide file tree
Showing 53 changed files with 781 additions and 373 deletions.
2 changes: 1 addition & 1 deletion examples/all_gather.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use mpi::Count;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();
let root_rank = 0;

let count = world.size() as usize;
Expand Down
2 changes: 1 addition & 1 deletion examples/all_gather_bool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use mpi::traits::*;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();

let rank = world.rank();
let count = world.size() as usize;
Expand Down
2 changes: 1 addition & 1 deletion examples/all_gather_varcount.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use mpi::Count;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();

let rank = world.rank();
let size = world.size();
Expand Down
2 changes: 1 addition & 1 deletion examples/all_to_all.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use mpi::traits::*;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();
let rank = world.rank();
let size = world.size();

Expand Down
15 changes: 9 additions & 6 deletions examples/barrier.rs
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
#![deny(warnings)]
extern crate mpi;

use mpi::error::ErrorKind;
use mpi::traits::*;

fn main() {
fn main() -> Result<(), ErrorKind> {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();
let receiver_rank = 0;

if world.rank() == receiver_rank {
let n = (world.size() - 1) as usize;
let mut buf = vec![0u64; 2 * n];
for x in buf[0..n].iter_mut() {
world.any_process().receive_into(x);
world.any_process().receive_into(x)?;
}
world.barrier();
for x in buf[n..2 * n].iter_mut() {
world.any_process().receive_into(x);
world.any_process().receive_into(x)?;
}
println!("{:?}", buf);
assert!(buf[0..n].iter().all(|&x| x == 1));
assert!(buf[n..2 * n].iter().all(|&x| x == 2));
} else {
world.process_at_rank(0).send(&1u64);
world.process_at_rank(0).send(&1u64)?;
world.barrier();
world.process_at_rank(0).send(&2u64);
world.process_at_rank(0).send(&2u64)?;
}

Ok(())
}
2 changes: 1 addition & 1 deletion examples/broadcast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use mpi::traits::*;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();
let root_rank = 0;
let root_process = world.process_at_rank(root_rank);

Expand Down
14 changes: 9 additions & 5 deletions examples/buffered.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
#![deny(warnings)]
extern crate mpi;

use mpi::error::ErrorKind;
use mpi::request::WaitGuard;
use mpi::traits::*;

const BUFFER_SIZE: usize = 10 * 1024 * 1024;

fn main() {
fn main() -> Result<(), ErrorKind> {
let mut universe = mpi::initialize().unwrap();
// Try to attach a buffer.
universe.set_buffer_size(BUFFER_SIZE);
Expand All @@ -17,17 +18,20 @@ fn main() {
// Attach another buffer.
universe.set_buffer_size(BUFFER_SIZE);

let world = universe.world();
let world = universe.world().unwrap();

let x = vec![std::f32::consts::PI; 1024];
let mut y = vec![0.0; 1024];
mpi::request::scope(|scope| {
let _rreq = WaitGuard::from(
world
.any_process()
.immediate_receive_into(scope, &mut y[..]),
.immediate_receive_into(scope, &mut y[..])?,
);
world.this_process().buffered_send(&x[..]);
});
world.this_process().buffered_send(&x[..])?;
Ok(())
})?;
assert_eq!(x, y);

Ok(())
}
2 changes: 1 addition & 1 deletion examples/cartesian.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use mpi::traits::*;
fn main() {
let universe = mpi::initialize().unwrap();

let comm = universe.world();
let comm = universe.world().unwrap();

if comm.size() < 4 {
return;
Expand Down
2 changes: 1 addition & 1 deletion examples/cartesian_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use mpi::traits::*;
fn main() {
let universe = mpi::initialize().unwrap();

let comm = universe.world();
let comm = universe.world().unwrap();

let new_rank = comm.cartesian_map(&[2, comm.size() / 4], &[false, false]);

Expand Down
2 changes: 1 addition & 1 deletion examples/comm_name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const CNAME: &str = "__rsmpi__test";

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();
assert_eq!("MPI_COMM_WORLD", world.get_name());
world.set_name(CNAME);
assert_eq!(CNAME, world.get_name());
Expand Down
2 changes: 1 addition & 1 deletion examples/complex_datatype.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ unsafe impl Equivalence for ComplexDatatype {

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();

let root_process = world.process_at_rank(0);

Expand Down
2 changes: 1 addition & 1 deletion examples/contiguous.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use mpi::traits::*;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();
let rank = world.rank();
let size = world.size();

Expand Down
2 changes: 1 addition & 1 deletion examples/datatype_dup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use mpi::traits::*;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();

let root_process = world.process_at_rank(0);

Expand Down
2 changes: 1 addition & 1 deletion examples/duplicate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use mpi::traits::*;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();
let moon = world.duplicate();

world.barrier();
Expand Down
2 changes: 1 addition & 1 deletion examples/gather.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use mpi::Count;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();
let root_rank = 0;
let root_process = world.process_at_rank(root_rank);

Expand Down
2 changes: 1 addition & 1 deletion examples/gather_varcount.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use mpi::Count;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();

let rank = world.rank();
let size = world.size();
Expand Down
2 changes: 1 addition & 1 deletion examples/group.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use mpi::traits::*;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();

let g = world.group();
// Group accessors and Communicator accessors agree
Expand Down
51 changes: 30 additions & 21 deletions examples/immediate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@
#![allow(clippy::float_cmp)]
extern crate mpi;

use mpi::error::ErrorKind;
use mpi::request::{CancelGuard, WaitGuard};
use mpi::traits::*;

fn main() {
fn main() -> Result<(), ErrorKind> {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();

let x = std::f32::consts::PI;
let mut y: f32 = 0.0;

mpi::request::scope(|scope| {
let mut sreq = world.this_process().immediate_send(scope, &x);
let rreq = world.any_process().immediate_receive_into(scope, &mut y);
let mut sreq = world.this_process().immediate_send(scope, &x)?;
let rreq = world.any_process().immediate_receive_into(scope, &mut y)?;
rreq.wait();
loop {
match sreq.test() {
Expand All @@ -26,42 +27,46 @@ fn main() {
}
}
}
});

Ok(())
})?;
assert_eq!(x, y);

y = 0.0;
mpi::request::scope(|scope| {
let _rreq = WaitGuard::from(world.any_process().immediate_receive_into(scope, &mut y));
let _sreq = WaitGuard::from(world.this_process().immediate_ready_send(scope, &x));
});
let _rreq = WaitGuard::from(world.any_process().immediate_receive_into(scope, &mut y)?);
let _sreq = WaitGuard::from(world.this_process().immediate_ready_send(scope, &x)?);
Ok(())
})?;
assert_eq!(x, y);

assert!(world.any_process().immediate_probe().is_none());
assert!(world.any_process().immediate_matched_probe().is_none());
assert!(world.any_process().immediate_probe()?.is_none());
assert!(world.any_process().immediate_matched_probe()?.is_none());

y = 0.0;
mpi::request::scope(|scope| {
let _sreq: WaitGuard<_, _> = world
.this_process()
.immediate_synchronous_send(scope, &x)
.immediate_synchronous_send(scope, &x)?
.into();
let preq = world.any_process().immediate_matched_probe();
let preq = world.any_process().immediate_matched_probe()?;
assert!(preq.is_some());
let (msg, _) = preq.unwrap();
let _rreq: WaitGuard<_, _> = msg.immediate_matched_receive_into(scope, &mut y).into();
});
let _rreq: WaitGuard<_, _> = msg.immediate_matched_receive_into(scope, &mut y)?.into();
Ok(())
})?;
assert_eq!(x, y);

let future = world.any_process().immediate_receive();
world.this_process().send(&x);
let future = world.any_process().immediate_receive()?;
world.this_process().send(&x)?;
let (msg, _) = future.get();
assert_eq!(x, msg);

let future = world.any_process().immediate_receive();
let future = world.any_process().immediate_receive()?;
let res = future.r#try();
assert!(res.is_err());
let mut future = res.err().unwrap();
world.this_process().send(&x);
world.this_process().send(&x)?;
loop {
match future.r#try() {
Ok((msg, _)) => {
Expand All @@ -75,10 +80,14 @@ fn main() {
}

mpi::request::scope(|scope| {
let sreq = world.this_process().immediate_send(scope, &x);
let sreq = world.this_process().immediate_send(scope, &x)?;
sreq.cancel();
sreq.wait();

let _sreq = CancelGuard::from(world.this_process().immediate_receive_into(scope, &mut y));
});
let _sreq = CancelGuard::from(world.this_process().immediate_receive_into(scope, &mut y)?);

Ok(())
})?;

Ok(())
}
2 changes: 1 addition & 1 deletion examples/immediate_all_gather.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use mpi::Count;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();
let root_rank = 0;

let count = world.size() as usize;
Expand Down
2 changes: 1 addition & 1 deletion examples/immediate_all_gather_varcount.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use mpi::Count;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();

let rank = world.rank();
let size = world.size();
Expand Down
2 changes: 1 addition & 1 deletion examples/immediate_all_to_all.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use mpi::traits::*;

fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let world = universe.world().unwrap();
let rank = world.rank();
let size = world.size();

Expand Down
Loading

0 comments on commit 8b78725

Please sign in to comment.