pub struct DistGraphCommunicator { /* private fields */ }Expand description
A distributed-graph topology communicator (MPI_Dist_graph_create_adjacent)
where each rank declares its own in-neighbours (sources) and out-neighbours
(destinations).
Implementations§
Source§impl DistGraphCommunicator
impl DistGraphCommunicator
Sourcepub fn in_degree(&self) -> usize
pub fn in_degree(&self) -> usize
Number of in-neighbours.
Examples found in repository?
examples/topo_inter.rs (line 38)
5fn main() {
6 let universe = mpi::initialize().unwrap();
7 let world = universe.world();
8 let rank = world.rank();
9 let size = world.size();
10
11 // ---- graph topology: a ring, node i adjacent to i-1 and i+1 ----
12 if size >= 2 {
13 let mut index = Vec::new();
14 let mut edges = Vec::new();
15 for i in 0..size {
16 edges.push((i - 1 + size) % size);
17 edges.push((i + 1) % size);
18 index.push(2 * (i + 1));
19 }
20 let g = world
21 .create_graph_communicator(&index, &edges)
22 .expect("graph create returned None");
23 let expected = vec![(rank - 1 + size) % size, (rank + 1) % size];
24 assert_eq!(g.my_neighbors(), expected, "graph neighbours mismatch");
25 assert_eq!(g.neighbor_count(rank), 2);
26 // Neighbourhood all-gather: each neighbour contributes its own rank.
27 let mut ng = vec![-1i32; 2];
28 g.neighbor_all_gather_into(&rank, &mut ng[..]);
29 assert_eq!(ng, expected, "neighbor_all_gather mismatch");
30 g.barrier();
31 }
32
33 // ---- distributed-graph adjacent: directed ring (recv prev, send next) ----
34 if size >= 2 {
35 let prev = (rank - 1 + size) % size;
36 let next = (rank + 1) % size;
37 let dg = world.create_dist_graph_adjacent(&[prev], &[next]);
38 assert_eq!(dg.in_degree(), 1, "dist-graph in-degree");
39 assert_eq!(dg.out_degree(), 1, "dist-graph out-degree");
40 let mut r = vec![-1i32; 1];
41 dg.neighbor_all_gather_into(&rank, &mut r[..]);
42 assert_eq!(r, vec![prev], "dist-graph neighbor mismatch");
43 dg.barrier();
44 }
45
46 // ---- inter-communicator: split world into two halves ----
47 if size >= 2 {
48 let half = size / 2;
49 let in_a = rank < half;
50 let inter = world.split_intercommunicator(in_a);
51 assert_eq!(
52 inter.local_size() + inter.remote_size(),
53 size,
54 "intercomm size mismatch"
55 );
56
57 // Leaders of the two groups exchange their world ranks across the
58 // inter-communicator.
59 if inter.rank() == 0 {
60 if in_a {
61 inter.process_at_rank(0).send(&rank);
62 let (peer, _): (i32, _) = inter.process_at_rank(0).receive();
63 assert_eq!(peer, half, "intercomm exchange mismatch (A)");
64 } else {
65 let (peer, _): (i32, _) = inter.process_at_rank(0).receive();
66 assert_eq!(peer, 0, "intercomm exchange mismatch (B)");
67 inter.process_at_rank(0).send(&rank);
68 }
69 }
70
71 // Merge back into one intra-communicator spanning everyone.
72 let merged = inter.merge();
73 assert_eq!(merged.size(), size, "merge size mismatch");
74 merged.barrier();
75 }
76
77 world.barrier();
78 if rank == 0 {
79 println!("TOPO/INTER PASS: graph + inter-communicator verified on {size} ranks.");
80 }
81}Sourcepub fn out_degree(&self) -> usize
pub fn out_degree(&self) -> usize
Number of out-neighbours.
Examples found in repository?
examples/topo_inter.rs (line 39)
5fn main() {
6 let universe = mpi::initialize().unwrap();
7 let world = universe.world();
8 let rank = world.rank();
9 let size = world.size();
10
11 // ---- graph topology: a ring, node i adjacent to i-1 and i+1 ----
12 if size >= 2 {
13 let mut index = Vec::new();
14 let mut edges = Vec::new();
15 for i in 0..size {
16 edges.push((i - 1 + size) % size);
17 edges.push((i + 1) % size);
18 index.push(2 * (i + 1));
19 }
20 let g = world
21 .create_graph_communicator(&index, &edges)
22 .expect("graph create returned None");
23 let expected = vec![(rank - 1 + size) % size, (rank + 1) % size];
24 assert_eq!(g.my_neighbors(), expected, "graph neighbours mismatch");
25 assert_eq!(g.neighbor_count(rank), 2);
26 // Neighbourhood all-gather: each neighbour contributes its own rank.
27 let mut ng = vec![-1i32; 2];
28 g.neighbor_all_gather_into(&rank, &mut ng[..]);
29 assert_eq!(ng, expected, "neighbor_all_gather mismatch");
30 g.barrier();
31 }
32
33 // ---- distributed-graph adjacent: directed ring (recv prev, send next) ----
34 if size >= 2 {
35 let prev = (rank - 1 + size) % size;
36 let next = (rank + 1) % size;
37 let dg = world.create_dist_graph_adjacent(&[prev], &[next]);
38 assert_eq!(dg.in_degree(), 1, "dist-graph in-degree");
39 assert_eq!(dg.out_degree(), 1, "dist-graph out-degree");
40 let mut r = vec![-1i32; 1];
41 dg.neighbor_all_gather_into(&rank, &mut r[..]);
42 assert_eq!(r, vec![prev], "dist-graph neighbor mismatch");
43 dg.barrier();
44 }
45
46 // ---- inter-communicator: split world into two halves ----
47 if size >= 2 {
48 let half = size / 2;
49 let in_a = rank < half;
50 let inter = world.split_intercommunicator(in_a);
51 assert_eq!(
52 inter.local_size() + inter.remote_size(),
53 size,
54 "intercomm size mismatch"
55 );
56
57 // Leaders of the two groups exchange their world ranks across the
58 // inter-communicator.
59 if inter.rank() == 0 {
60 if in_a {
61 inter.process_at_rank(0).send(&rank);
62 let (peer, _): (i32, _) = inter.process_at_rank(0).receive();
63 assert_eq!(peer, half, "intercomm exchange mismatch (A)");
64 } else {
65 let (peer, _): (i32, _) = inter.process_at_rank(0).receive();
66 assert_eq!(peer, 0, "intercomm exchange mismatch (B)");
67 inter.process_at_rank(0).send(&rank);
68 }
69 }
70
71 // Merge back into one intra-communicator spanning everyone.
72 let merged = inter.merge();
73 assert_eq!(merged.size(), size, "merge size mismatch");
74 merged.barrier();
75 }
76
77 world.barrier();
78 if rank == 0 {
79 println!("TOPO/INTER PASS: graph + inter-communicator verified on {size} ranks.");
80 }
81}Sourcepub fn destinations(&self) -> &[Rank] ⓘ
pub fn destinations(&self) -> &[Rank] ⓘ
The ranks this process sends to.
Sourcepub fn neighbor_all_gather_into<S, R>(&self, sendbuf: &S, recvbuf: &mut R)
pub fn neighbor_all_gather_into<S, R>(&self, sendbuf: &S, recvbuf: &mut R)
Send sendbuf to every out-neighbour and gather one block from each
in-neighbour, in source order (MPI_Neighbor_allgather).
Examples found in repository?
examples/topo_inter.rs (line 41)
5fn main() {
6 let universe = mpi::initialize().unwrap();
7 let world = universe.world();
8 let rank = world.rank();
9 let size = world.size();
10
11 // ---- graph topology: a ring, node i adjacent to i-1 and i+1 ----
12 if size >= 2 {
13 let mut index = Vec::new();
14 let mut edges = Vec::new();
15 for i in 0..size {
16 edges.push((i - 1 + size) % size);
17 edges.push((i + 1) % size);
18 index.push(2 * (i + 1));
19 }
20 let g = world
21 .create_graph_communicator(&index, &edges)
22 .expect("graph create returned None");
23 let expected = vec![(rank - 1 + size) % size, (rank + 1) % size];
24 assert_eq!(g.my_neighbors(), expected, "graph neighbours mismatch");
25 assert_eq!(g.neighbor_count(rank), 2);
26 // Neighbourhood all-gather: each neighbour contributes its own rank.
27 let mut ng = vec![-1i32; 2];
28 g.neighbor_all_gather_into(&rank, &mut ng[..]);
29 assert_eq!(ng, expected, "neighbor_all_gather mismatch");
30 g.barrier();
31 }
32
33 // ---- distributed-graph adjacent: directed ring (recv prev, send next) ----
34 if size >= 2 {
35 let prev = (rank - 1 + size) % size;
36 let next = (rank + 1) % size;
37 let dg = world.create_dist_graph_adjacent(&[prev], &[next]);
38 assert_eq!(dg.in_degree(), 1, "dist-graph in-degree");
39 assert_eq!(dg.out_degree(), 1, "dist-graph out-degree");
40 let mut r = vec![-1i32; 1];
41 dg.neighbor_all_gather_into(&rank, &mut r[..]);
42 assert_eq!(r, vec![prev], "dist-graph neighbor mismatch");
43 dg.barrier();
44 }
45
46 // ---- inter-communicator: split world into two halves ----
47 if size >= 2 {
48 let half = size / 2;
49 let in_a = rank < half;
50 let inter = world.split_intercommunicator(in_a);
51 assert_eq!(
52 inter.local_size() + inter.remote_size(),
53 size,
54 "intercomm size mismatch"
55 );
56
57 // Leaders of the two groups exchange their world ranks across the
58 // inter-communicator.
59 if inter.rank() == 0 {
60 if in_a {
61 inter.process_at_rank(0).send(&rank);
62 let (peer, _): (i32, _) = inter.process_at_rank(0).receive();
63 assert_eq!(peer, half, "intercomm exchange mismatch (A)");
64 } else {
65 let (peer, _): (i32, _) = inter.process_at_rank(0).receive();
66 assert_eq!(peer, 0, "intercomm exchange mismatch (B)");
67 inter.process_at_rank(0).send(&rank);
68 }
69 }
70
71 // Merge back into one intra-communicator spanning everyone.
72 let merged = inter.merge();
73 assert_eq!(merged.size(), size, "merge size mismatch");
74 merged.barrier();
75 }
76
77 world.barrier();
78 if rank == 0 {
79 println!("TOPO/INTER PASS: graph + inter-communicator verified on {size} ranks.");
80 }
81}Trait Implementations§
Source§impl Clone for DistGraphCommunicator
impl Clone for DistGraphCommunicator
Source§fn clone(&self) -> DistGraphCommunicator
fn clone(&self) -> DistGraphCommunicator
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Communicator for DistGraphCommunicator
impl Communicator for DistGraphCommunicator
Source§fn target_size(&self) -> Rank
fn target_size(&self) -> Rank
Number of processes on the remote side (equals
Communicator::size
for an intra-communicator).Source§fn process_at_rank(&self, r: Rank) -> Process<'_>
fn process_at_rank(&self, r: Rank) -> Process<'_>
A handle to the process with the given rank.
Source§fn this_process(&self) -> Process<'_>
fn this_process(&self) -> Process<'_>
A handle to this process.
Source§fn any_process(&self) -> AnyProcess<'_>
fn any_process(&self) -> AnyProcess<'_>
A handle matching any source (
MPI_ANY_SOURCE), for receives.Source§fn compare(&self, other: &dyn Communicator) -> CommunicatorRelation
fn compare(&self, other: &dyn Communicator) -> CommunicatorRelation
Compare this communicator to
other (MPI_Comm_compare).Source§fn duplicate(&self) -> SimpleCommunicator
fn duplicate(&self) -> SimpleCommunicator
Duplicate the communicator with a fresh context (
MPI_Comm_dup).
Collective over all members.Source§fn split_by_color(&self, color: Color) -> Option<SimpleCommunicator>
fn split_by_color(&self, color: Color) -> Option<SimpleCommunicator>
Split the communicator by colour (
MPI_Comm_split). Collective.Source§fn split_by_color_with_key(
&self,
color: Color,
key: Key,
) -> Option<SimpleCommunicator>
fn split_by_color_with_key( &self, color: Color, key: Key, ) -> Option<SimpleCommunicator>
Split by colour, ordering new ranks by
key then old rank
(MPI_Comm_split). Collective.Source§fn split_by_subgroup(&self, group: &Group) -> Option<SimpleCommunicator>
fn split_by_subgroup(&self, group: &Group) -> Option<SimpleCommunicator>
Split by an explicit subgroup (
MPI_Comm_create style). Collective;
returns None for processes not in group.Source§fn abort(&self, errorcode: i32) -> !
fn abort(&self, errorcode: i32) -> !
Abort the whole job with an exit code (
MPI_Abort). Notifies every peer
so the entire job exits rather than leaving ranks blocked.Source§fn pack_size(&self, incount: Count, dt: DatatypeRef) -> Count
fn pack_size(&self, incount: Count, dt: DatatypeRef) -> Count
Number of bytes needed to pack
incount elements of datatype dt
(MPI_Pack_size).Source§fn pack<Buf: Buffer + ?Sized>(&self, inbuf: &Buf) -> Vec<u8> ⓘwhere
Self: Sized,
fn pack<Buf: Buffer + ?Sized>(&self, inbuf: &Buf) -> Vec<u8> ⓘwhere
Self: Sized,
Pack a buffer into a freshly allocated byte vector (
MPI_Pack). Since
this implementation uses contiguous native layouts, packing is a copy.Source§fn pack_into<Buf: Buffer + ?Sized>(
&self,
inbuf: &Buf,
outbuf: &mut [u8],
position: Count,
) -> Countwhere
Self: Sized,
fn pack_into<Buf: Buffer + ?Sized>(
&self,
inbuf: &Buf,
outbuf: &mut [u8],
position: Count,
) -> Countwhere
Self: Sized,
Pack a buffer into
outbuf starting at byte offset position, returning
the new position (MPI_Pack).Source§unsafe fn unpack_into<Buf: BufferMut + ?Sized>(
&self,
inbuf: &[u8],
outbuf: &mut Buf,
position: Count,
) -> Countwhere
Self: Sized,
unsafe fn unpack_into<Buf: BufferMut + ?Sized>(
&self,
inbuf: &[u8],
outbuf: &mut Buf,
position: Count,
) -> Countwhere
Self: Sized,
Unpack from
inbuf starting at byte offset position into outbuf,
returning the new position (MPI_Unpack). Read moreSource§fn create_graph_communicator(
&self,
index: &[Count],
edges: &[Count],
) -> Option<GraphCommunicator>
fn create_graph_communicator( &self, index: &[Count], edges: &[Count], ) -> Option<GraphCommunicator>
Create a graph topology communicator (
MPI_Graph_create). Read moreSource§fn create_dist_graph_adjacent(
&self,
sources: &[Rank],
destinations: &[Rank],
) -> DistGraphCommunicator
fn create_dist_graph_adjacent( &self, sources: &[Rank], destinations: &[Rank], ) -> DistGraphCommunicator
Create a distributed-graph topology where this rank receives from
sources and sends to destinations (MPI_Dist_graph_create_adjacent).
Collective; each rank supplies its own adjacency.Source§fn split_intercommunicator(&self, in_group_a: bool) -> InterCommunicator
fn split_intercommunicator(&self, in_group_a: bool) -> InterCommunicator
Collectively split this communicator into an inter-communicator between
two disjoint groups. Ranks passing
true form one group (“A”); the rest
form the other. Each rank’s InterCommunicator has the other group
as its remote group (MPI_Intercomm_create-style, collective).Source§fn create_cartesian_communicator(
&self,
dims: &[Count],
periods: &[bool],
_reorder: bool,
) -> Option<CartesianCommunicator>
fn create_cartesian_communicator( &self, dims: &[Count], periods: &[bool], _reorder: bool, ) -> Option<CartesianCommunicator>
Create a Cartesian topology communicator (
MPI_Cart_create). Read moreSource§fn parent(&self) -> Option<InterCommunicator>
fn parent(&self) -> Option<InterCommunicator>
If this process was created by
crate::collective::Root::spawn,
return the inter-communicator to the parent group (MPI_Comm_get_parent).
The local group is this world; the remote group is the spawner.Auto Trait Implementations§
impl Freeze for DistGraphCommunicator
impl RefUnwindSafe for DistGraphCommunicator
impl Send for DistGraphCommunicator
impl Sync for DistGraphCommunicator
impl Unpin for DistGraphCommunicator
impl UnsafeUnpin for DistGraphCommunicator
impl UnwindSafe for DistGraphCommunicator
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<C> CommunicatorAttributes for Cwhere
C: Communicator + ?Sized,
impl<C> CommunicatorAttributes for Cwhere
C: Communicator + ?Sized,
Source§fn set_attr<T: Any + Send + Sync>(&self, key: &CommKeyval, value: T)
fn set_attr<T: Any + Send + Sync>(&self, key: &CommKeyval, value: T)
Cache
value under key on this communicator (MPI_Comm_set_attr).Source§fn get_attr<T: Any + Clone>(&self, key: &CommKeyval) -> Option<T>
fn get_attr<T: Any + Clone>(&self, key: &CommKeyval) -> Option<T>
Retrieve a clone of the attribute cached under
key
(MPI_Comm_get_attr), if present and of type T.Source§fn has_attr(&self, key: &CommKeyval) -> bool
fn has_attr(&self, key: &CommKeyval) -> bool
Whether an attribute is cached under
key.Source§fn delete_attr(&self, key: &CommKeyval)
fn delete_attr(&self, key: &CommKeyval)
Remove the attribute cached under
key (MPI_Comm_delete_attr).Source§impl<C> CommunicatorCollectives for Cwhere
C: Communicator + ?Sized,
impl<C> CommunicatorCollectives for Cwhere
C: Communicator + ?Sized,
Source§fn all_gather_into<S, R>(&self, sendbuf: &S, recvbuf: &mut R)
fn all_gather_into<S, R>(&self, sendbuf: &S, recvbuf: &mut R)
Gather equal-sized contributions from all ranks to all ranks
(
MPI_Allgather).Source§fn try_all_gather_into<S, R>(
&self,
sendbuf: &S,
recvbuf: &mut R,
) -> Result<(), MpiError>
fn try_all_gather_into<S, R>( &self, sendbuf: &S, recvbuf: &mut R, ) -> Result<(), MpiError>
Fallible
all_gather_into.Source§fn all_to_all_into<S, R>(&self, sendbuf: &S, recvbuf: &mut R)
fn all_to_all_into<S, R>(&self, sendbuf: &S, recvbuf: &mut R)
All-to-all scatter/gather with equal block sizes (
MPI_Alltoall).Source§fn try_all_to_all_into<S, R>(
&self,
sendbuf: &S,
recvbuf: &mut R,
) -> Result<(), MpiError>
fn try_all_to_all_into<S, R>( &self, sendbuf: &S, recvbuf: &mut R, ) -> Result<(), MpiError>
Fallible
all_to_all_into.Source§fn all_reduce_into<S, R, O>(&self, sendbuf: &S, recvbuf: &mut R, op: O)
fn all_reduce_into<S, R, O>(&self, sendbuf: &S, recvbuf: &mut R, op: O)
Reduce contributions from all ranks and make the result available on all
ranks (
MPI_Allreduce).Source§fn try_all_reduce_into<S, R, O>(
&self,
sendbuf: &S,
recvbuf: &mut R,
op: O,
) -> Result<(), MpiError>
fn try_all_reduce_into<S, R, O>( &self, sendbuf: &S, recvbuf: &mut R, op: O, ) -> Result<(), MpiError>
Fallible
all_reduce_into.Source§fn all_reduce_into_in_place<R, O>(&self, buf: &mut R, op: O)
fn all_reduce_into_in_place<R, O>(&self, buf: &mut R, op: O)
In-place all-reduce:
buf is both the input and the output
(MPI_Allreduce with MPI_IN_PLACE).Source§fn all_gather_into_in_place<R>(&self, buf: &mut R)
fn all_gather_into_in_place<R>(&self, buf: &mut R)
In-place all-gather:
buf holds this rank’s block at slot rank on
entry and every rank’s block on return (MPI_Allgather with
MPI_IN_PLACE).Source§fn reduce_scatter_block_into<S, R, O>(
&self,
sendbuf: &S,
recvbuf: &mut R,
op: O,
)
fn reduce_scatter_block_into<S, R, O>( &self, sendbuf: &S, recvbuf: &mut R, op: O, )
Reduce, then scatter equal-sized blocks of the result
(
MPI_Reduce_scatter_block).Source§fn scan_into<S, R, O>(&self, sendbuf: &S, recvbuf: &mut R, op: O)
fn scan_into<S, R, O>(&self, sendbuf: &S, recvbuf: &mut R, op: O)
Inclusive prefix reduction (
MPI_Scan).Source§fn try_scan_into<S, R, O>(
&self,
sendbuf: &S,
recvbuf: &mut R,
op: O,
) -> Result<(), MpiError>
fn try_scan_into<S, R, O>( &self, sendbuf: &S, recvbuf: &mut R, op: O, ) -> Result<(), MpiError>
Fallible
scan_into.Source§fn exclusive_scan_into<S, R, O>(&self, sendbuf: &S, recvbuf: &mut R, op: O)
fn exclusive_scan_into<S, R, O>(&self, sendbuf: &S, recvbuf: &mut R, op: O)
Exclusive prefix reduction (
MPI_Exscan).Source§fn all_gather_varcount_into<S, R>(&self, sendbuf: &S, recvbuf: &mut R)
fn all_gather_varcount_into<S, R>(&self, sendbuf: &S, recvbuf: &mut R)
Varying-count all-gather (
MPI_Allgatherv).Source§fn all_to_all_varcount_into<S, R>(&self, sendbuf: &S, recvbuf: &mut R)
fn all_to_all_varcount_into<S, R>(&self, sendbuf: &S, recvbuf: &mut R)
Varying-count all-to-all (
MPI_Alltoallv): rank i sends its j-th
block to rank j, with per-peer counts and displacements on both sides.Source§fn immediate_barrier(&self) -> Request<'static, ()>
fn immediate_barrier(&self) -> Request<'static, ()>
Non-blocking barrier (
MPI_Ibarrier). Progresses on a background thread
using a fresh context, so it genuinely overlaps subsequent work; wait
joins it.Source§fn immediate_all_gather_into<'a, S, R, Sc>(
&self,
scope: Sc,
sendbuf: &'a S,
recvbuf: &'a mut R,
) -> Request<'a, R, Sc>
fn immediate_all_gather_into<'a, S, R, Sc>( &self, scope: Sc, sendbuf: &'a S, recvbuf: &'a mut R, ) -> Request<'a, R, Sc>
Non-blocking all-gather (
MPI_Iallgather).Source§fn immediate_all_to_all_into<'a, S, R, Sc>(
&self,
scope: Sc,
sendbuf: &'a S,
recvbuf: &'a mut R,
) -> Request<'a, R, Sc>
fn immediate_all_to_all_into<'a, S, R, Sc>( &self, scope: Sc, sendbuf: &'a S, recvbuf: &'a mut R, ) -> Request<'a, R, Sc>
Non-blocking all-to-all (
MPI_Ialltoall).Source§fn immediate_all_reduce_into<'a, S, R, O, Sc>(
&self,
scope: Sc,
sendbuf: &'a S,
recvbuf: &'a mut R,
op: O,
) -> Request<'a, R, Sc>
fn immediate_all_reduce_into<'a, S, R, O, Sc>( &self, scope: Sc, sendbuf: &'a S, recvbuf: &'a mut R, op: O, ) -> Request<'a, R, Sc>
Non-blocking all-reduce (
MPI_Iallreduce). Progresses on a background
thread using a fresh context so it overlaps computation; wait joins it.Source§fn immediate_scan_into<'a, S, R, O, Sc>(
&self,
scope: Sc,
sendbuf: &'a S,
recvbuf: &'a mut R,
op: O,
) -> Request<'a, R, Sc>
fn immediate_scan_into<'a, S, R, O, Sc>( &self, scope: Sc, sendbuf: &'a S, recvbuf: &'a mut R, op: O, ) -> Request<'a, R, Sc>
Non-blocking inclusive scan (
MPI_Iscan).Source§impl<C> CommunicatorErrorHandler for Cwhere
C: Communicator + ?Sized,
impl<C> CommunicatorErrorHandler for Cwhere
C: Communicator + ?Sized,
Source§fn set_error_handler(&self, handler: ErrorHandler)
fn set_error_handler(&self, handler: ErrorHandler)
Set this communicator’s error handler (
MPI_Comm_set_errhandler).Source§fn error_handler(&self) -> ErrorHandler
fn error_handler(&self) -> ErrorHandler
Get this communicator’s error handler (
MPI_Comm_get_errhandler).
Defaults to ErrorHandler::Fatal.