1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
#![deny(missing_docs)] #![warn(missing_copy_implementations)] #![warn(trivial_casts)] #![warn(trivial_numeric_casts)] #![warn(unused_extern_crates)] #![warn(unused_import_braces)] #![warn(unused_qualifications)] #![deny(warnings)] #![cfg_attr(feature = "cargo-clippy", warn(cast_possible_truncation))] #![cfg_attr(feature = "cargo-clippy", warn(cast_possible_wrap))] #![cfg_attr(feature = "cargo-clippy", warn(cast_precision_loss))] #![cfg_attr(feature = "cargo-clippy", warn(cast_sign_loss))] #![cfg_attr(feature = "cargo-clippy", warn(enum_glob_use))] #![cfg_attr(feature = "cargo-clippy", warn(mut_mut))] #![cfg_attr(feature = "cargo-clippy", warn(mutex_integer))] #![cfg_attr(feature = "cargo-clippy", warn(non_ascii_literal))] #![cfg_attr(feature = "cargo-clippy", warn(nonminimal_bool))] #![cfg_attr(feature = "cargo-clippy", warn(option_unwrap_used))] #![cfg_attr(feature = "cargo-clippy", warn(result_unwrap_used))] #![cfg_attr(feature = "cargo-clippy", warn(single_match_else))] #![cfg_attr(feature = "cargo-clippy", warn(string_add))] #![cfg_attr(feature = "cargo-clippy", warn(string_add_assign))] #![cfg_attr(feature = "cargo-clippy", warn(unicode_not_nfc))] #![cfg_attr(feature = "cargo-clippy", warn(wrong_pub_self_convention))] //! Message Passing Interface bindings for Rust //! //! The [Message Passing Interface][MPI] (MPI) is a specification for a //! message-passing style concurrency library. Implementations of MPI are often used to structure //! parallel computation on High Performance Computing systems. The MPI specification describes //! bindings for the C programming language (and through it C++) as well as for the Fortran //! programming language. This library tries to bridge the gap into a more rustic world. //! //! [MPI]: http://www.mpi-forum.org //! //! # Usage //! //! Add the `mpi` crate as a dependency in your `Cargo.toml`: //! //! ```toml //! [dependencies] //! mpi = "0.5" //! ``` //! //! Then use it in your program like this: //! //! ```no_run //! extern crate mpi; //! //! use mpi::traits::*; //! //! fn main() { //! let universe = mpi::initialize().unwrap(); //! let world = universe.world(); //! let size = world.size(); //! let rank = world.rank(); //! //! if size != 2 { //! panic!("Size of MPI_COMM_WORLD must be 2, but is {}!", size); //! } //! //! match rank { //! 0 => { //! let msg = vec![4.0f64, 8.0, 15.0]; //! world.process_at_rank(rank + 1).send(&msg[..]); //! } //! 1 => { //! let (msg, status) = world.any_process().receive_vec::<f64>(); //! println!("Process {} got message {:?}.\nStatus is: {:?}", rank, msg, status); //! } //! _ => unreachable!() //! } //! } //! ``` //! //! # Features //! //! The bindings follow the MPI 3.1 specification. //! //! Currently supported: //! //! - **Groups, Contexts, Communicators**: //! - Group and (Intra-)Communicator management from section 6 is mostly complete. //! - no Inter-Communicators //! - no process topologies //! - **Point to point communication**: //! - standard, buffered, synchronous and ready mode send in blocking and non-blocking variants //! - receive in blocking and non-blocking variants //! - send-receive //! - probe //! - matched probe/receive //! - **Collective communication**: //! - barrier //! - broadcast //! - (all) gather //! - scatter //! - all to all //! - varying counts operations //! - reductions/scans //! - blocking and non-blocking variants //! - **Datatypes**: Bridging between Rust types and MPI basic types as well as custom MPI datatypes //! which can act as views into buffers. //! //! Not supported (yet): //! //! - Process management //! - One-sided communication (RMA) //! - MPI parallel I/O //! - A million small things //! //! The sub-modules contain a more detailed description of which features are and are not //! supported. //! //! # Further Reading //! //! While every publicly defined item in this crate should have some documentation attached to it, //! most of the descriptions are quite terse for now and to the uninitiated will only make sense in //! combination with the [MPI specification][MPIspec]. //! //! [MPIspec]: http://www.mpi-forum.org/docs/docs.html use std::os::raw::c_int; extern crate conv; #[cfg(feature = "user-operations")] extern crate libffi; extern crate mpi_sys; /// The raw C language MPI API /// /// Documented in the [Message Passing Interface specification][spec] /// /// [spec]: http://www.mpi-forum.org/docs/docs.html #[allow(missing_docs, dead_code, non_snake_case, non_camel_case_types)] #[macro_use] pub mod ffi { pub use mpi_sys::*; #[cfg(extern_statics_are_unsafe)] macro_rules! unsafe_extern_static { ( $x:expr ) => { unsafe { $x } } } #[cfg(not(extern_statics_are_unsafe))] macro_rules! unsafe_extern_static { ( $x:expr ) => { $x } } } pub mod collective; pub mod datatype; pub mod environment; pub mod point_to_point; pub mod raw; pub mod request; pub mod topology; /// Re-exports all traits. pub mod traits { pub use collective::traits::*; pub use datatype::traits::*; pub use point_to_point::traits::*; pub use raw::traits::*; pub use topology::traits::*; } #[doc(inline)] pub use environment::{initialize, initialize_with_threading, time, time_resolution, Threading}; use ffi::MPI_Aint; /// Encodes error values returned by MPI functions. pub type Error = c_int; /// Encodes number of values in multi-value messages. pub type Count = c_int; /// Can be used to tag messages on the sender side and match on the receiver side. pub type Tag = c_int; /// An address in memory pub type Address = MPI_Aint;