[section:c_mapping Mapping from C MPI to Boost.MPI] This section provides tables that map from the functions and constants of the standard C MPI to their Boost.MPI equivalents. It will be most useful for users that are already familiar with the C or Fortran interfaces to MPI, or for porting existing parallel programs to Boost.MPI. Note that this is not a perfect one to one mapping, the Boost.MPI will sometime use function from the C API in a way that is transparent for the end user. For example, [@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node50.html#Node50 `MPI_Probe and friends`] can be used to implement asynchronous send/recv. [table Point-to-point communication [[C Function/Constant] [Boost.MPI Equivalent]] [[`MPI_ANY_SOURCE`] [`any_source`]] [[`MPI_ANY_TAG`] [`any_tag`]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node40.html#Node40 `MPI_Bsend`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node51.html#Node51 `MPI_Bsend_init`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node42.html#Node42 `MPI_Buffer_attach`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node42.html#Node42 `MPI_Buffer_detach`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node50.html#Node50 `MPI_Cancel`]] [[memberref boost::mpi::request::cancel `request::cancel`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node35.html#Node35 `MPI_Get_count`]] [[memberref boost::mpi::status::count `status::count`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node46.html#Node46 `MPI_Ibsend`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node50.html#Node50 `MPI_Iprobe`]] [[memberref boost::mpi::communicator::iprobe `communicator::iprobe`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node46.html#Node46 `MPI_Irsend`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node46.html#Node46 `MPI_Isend`]] [[memberref boost::mpi::communicator::isend `communicator::isend`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node46.html#Node46 `MPI_Issend`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node46.html#Node46 `MPI_Irecv`]] [[memberref boost::mpi::communicator::isend `communicator::irecv`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node50.html#Node50 `MPI_Probe`]] [[memberref boost::mpi::communicator::probe `communicator::probe`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node53.html#Node53 `MPI_PROC_NULL`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node34.html#Node34 `MPI_Recv`]] [[memberref boost::mpi::communicator::recv `communicator::recv`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node51.html#Node51 `MPI_Recv_init`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node47.html#Node47 `MPI_Request_free`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node40.html#Node40 `MPI_Rsend`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node51.html#Node51 `MPI_Rsend_init`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node31.html#Node31 `MPI_Send`]] [[memberref boost::mpi::communicator::send `communicator::send`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node52.html#Node52 `MPI_Sendrecv`]] [[memberref boost::mpi::communicator::sendrecv `communicator::sendrecv`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node52.html#Node52 `MPI_Sendrecv_replace`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node51.html#Node51 `MPI_Send_init`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node40.html#Node40 `MPI_Ssend`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node51.html#Node51 `MPI_Ssend_init`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node51.html#Node51 `MPI_Start`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node51.html#Node51 `MPI_Startall`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node47.html#Node47 `MPI_Test`]] [[memberref boost::mpi::request::wait `request::test`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node47.html#Node47 `MPI_Testall`]] [[funcref boost::mpi::test_all `test_all`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node47.html#Node47 `MPI_Testany`]] [[funcref boost::mpi::test_any `test_any`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node47.html#Node47 `MPI_Testsome`]] [[funcref boost::mpi::test_some `test_some`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node50.html#Node50 `MPI_Test_cancelled`]] [[memberref boost::mpi::status::cancelled `status::cancelled`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node47.html#Node47 `MPI_Wait`]] [[memberref boost::mpi::request::wait `request::wait`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node47.html#Node47 `MPI_Waitall`]] [[funcref boost::mpi::wait_all `wait_all`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node47.html#Node47 `MPI_Waitany`]] [[funcref boost::mpi::wait_any `wait_any`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node47.html#Node47 `MPI_Waitsome`]] [[funcref boost::mpi::wait_some `wait_some`]]] ] Boost.MPI automatically maps C and C++ data types to their MPI equivalents. The following table illustrates the mappings between C++ types and MPI datatype constants. [table Datatypes [[C Constant] [Boost.MPI Equivalent]] [[`MPI_CHAR`] [`signed char`]] [[`MPI_SHORT`] [`signed short int`]] [[`MPI_INT`] [`signed int`]] [[`MPI_LONG`] [`signed long int`]] [[`MPI_UNSIGNED_CHAR`] [`unsigned char`]] [[`MPI_UNSIGNED_SHORT`] [`unsigned short int`]] [[`MPI_UNSIGNED_INT`] [`unsigned int`]] [[`MPI_UNSIGNED_LONG`] [`unsigned long int`]] [[`MPI_FLOAT`] [`float`]] [[`MPI_DOUBLE`] [`double`]] [[`MPI_LONG_DOUBLE`] [`long double`]] [[`MPI_BYTE`] [unused]] [[`MPI_PACKED`] [used internally for [link mpi.tutorial.user_data_types serialized data types]]] [[`MPI_LONG_LONG_INT`] [`long long int`, if supported by compiler]] [[`MPI_UNSIGNED_LONG_LONG_INT`] [`unsigned long long int`, if supported by compiler]] [[`MPI_FLOAT_INT`] [`std::pair`]] [[`MPI_DOUBLE_INT`] [`std::pair`]] [[`MPI_LONG_INT`] [`std::pair`]] [[`MPI_2INT`] [`std::pair`]] [[`MPI_SHORT_INT`] [`std::pair`]] [[`MPI_LONG_DOUBLE_INT`] [`std::pair`]] ] Boost.MPI does not provide direct wrappers to the MPI derived datatypes functionality. Instead, Boost.MPI relies on the _Serialization_ library to construct MPI datatypes for user-defined classes. The section on [link mpi.tutorial.user_data_types user-defined data types] describes this mechanism, which is used for types that marked as "MPI datatypes" using [classref boost::mpi::is_mpi_datatype `is_mpi_datatype`]. The derived datatypes table that follows describes which C++ types correspond to the functionality of the C MPI's datatype constructor. Boost.MPI may not actually use the C MPI function listed when building datatypes of a certain form. Since the actual datatypes built by Boost.MPI are typically hidden from the user, many of these operations are called internally by Boost.MPI. [table Derived datatypes [[C Function/Constant] [Boost.MPI Equivalent]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node56.html#Node56 `MPI_Address`]] [used automatically in Boost.MPI for MPI version 1.x]] [[[@http://www.mpi-forum.org/docs/mpi-20-html/node76.htm#Node76 `MPI_Get_address`]] [used automatically in Boost.MPI for MPI version 2.0 and higher]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node58.html#Node58 `MPI_Type_commit`]] [used automatically in Boost.MPI]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node55.html#Node55 `MPI_Type_contiguous`]] [arrays]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node56.html#Node56 `MPI_Type_extent`]] [used automatically in Boost.MPI]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node58.html#Node58 `MPI_Type_free`]] [used automatically in Boost.MPI]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node55.html#Node55 `MPI_Type_hindexed`]] [any type used as a subobject]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node55.html#Node55 `MPI_Type_hvector`]] [unused]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node55.html#Node55 `MPI_Type_indexed`]] [any type used as a subobject]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node57.html#Node57 `MPI_Type_lb`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node56.html#Node56 `MPI_Type_size`]] [used automatically in Boost.MPI]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node55.html#Node55 `MPI_Type_struct`]] [user-defined classes and structs with MPI 1.x]] [[[@http://www.mpi-forum.org/docs/mpi-20-html/node76.htm#Node76 `MPI_Type_create_struct`]] [user-defined classes and structs with MPI 2.0 and higher]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node57.html#Node57 `MPI_Type_ub`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node55.html#Node55 `MPI_Type_vector`]] [used automatically in Boost.MPI]] ] MPI's packing facilities store values into a contiguous buffer, which can later be transmitted via MPI and unpacked into separate values via MPI's unpacking facilities. As with datatypes, Boost.MPI provides an abstract interface to MPI's packing and unpacking facilities. In particular, the two archive classes [classref boost::mpi::packed_oarchive `packed_oarchive`] and [classref boost::mpi::packed_iarchive `packed_iarchive`] can be used to pack or unpack a contiguous buffer using MPI's facilities. [table Packing and unpacking [[C Function] [Boost.MPI Equivalent]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node62.html#Node62 `MPI_Pack`]] [[classref boost::mpi::packed_oarchive `packed_oarchive`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node62.html#Node62 `MPI_Pack_size`]] [used internally by Boost.MPI]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node62.html#Node62 `MPI_Unpack`]] [[classref boost::mpi::packed_iarchive `packed_iarchive`]]] ] Boost.MPI supports a one-to-one mapping for most of the MPI collectives. For each collective provided by Boost.MPI, the underlying C MPI collective will be invoked when it is possible (and efficient) to do so. [table Collectives [[C Function] [Boost.MPI Equivalent]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node73.html#Node73 `MPI_Allgather`]] [[funcref boost::mpi::all_gather `all_gather`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node73.html#Node73 `MPI_Allgatherv`]] [most uses supported by [funcref boost::mpi::all_gather `all_gather`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node82.html#Node82 `MPI_Allreduce`]] [[funcref boost::mpi::all_reduce `all_reduce`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node75.html#Node75 `MPI_Alltoall`]] [[funcref boost::mpi::all_to_all `all_to_all`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node75.html#Node75 `MPI_Alltoallv`]] [most uses supported by [funcref boost::mpi::all_to_all `all_to_all`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node66.html#Node66 `MPI_Barrier`]] [[memberref boost::mpi::communicator::barrier `communicator::barrier`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node67.html#Node67 `MPI_Bcast`]] [[funcref boost::mpi::broadcast `broadcast`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node69.html#Node69 `MPI_Gather`]] [[funcref boost::mpi::gather `gather`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node69.html#Node69 `MPI_Gatherv`]] [most uses supported by [funcref boost::mpi::gather `gather`], other usages supported by [funcref boost::mpi::gatherv `gatherv`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node77.html#Node77 `MPI_Reduce`]] [[funcref boost::mpi::reduce `reduce`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node83.html#Node83 `MPI_Reduce_scatter`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node84.html#Node84 `MPI_Scan`]] [[funcref boost::mpi::scan `scan`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node71.html#Node71 `MPI_Scatter`]] [[funcref boost::mpi::scatter `scatter`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node71.html#Node71 `MPI_Scatterv`]] [most uses supported by [funcref boost::mpi::scatter `scatter`], other uses supported by [funcref boost::mpi::scatterv `scatterv`]]] [[[@http://www.mpi-forum.org/docs/mpi-20-html/node145.htm#Node145 `MPI_IN_PLACE`]] [supported implicitly by [funcref boost::mpi::all_reduce `all_reduce` by omitting the output value]]] ] Boost.MPI uses function objects to specify how reductions should occur in its equivalents to `MPI_Allreduce`, `MPI_Reduce`, and `MPI_Scan`. The following table illustrates how [@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node78.html#Node78 predefined] and [@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node80.html#Node80 user-defined] reduction operations can be mapped between the C MPI and Boost.MPI. [table Reduction operations [[C Constant] [Boost.MPI Equivalent]] [[`MPI_BAND`] [[classref boost::mpi::bitwise_and `bitwise_and`]]] [[`MPI_BOR`] [[classref boost::mpi::bitwise_or `bitwise_or`]]] [[`MPI_BXOR`] [[classref boost::mpi::bitwise_xor `bitwise_xor`]]] [[`MPI_LAND`] [`std::logical_and`]] [[`MPI_LOR`] [`std::logical_or`]] [[`MPI_LXOR`] [[classref boost::mpi::logical_xor `logical_xor`]]] [[`MPI_MAX`] [[classref boost::mpi::maximum `maximum`]]] [[`MPI_MAXLOC`] [unsupported]] [[`MPI_MIN`] [[classref boost::mpi::minimum `minimum`]]] [[`MPI_MINLOC`] [unsupported]] [[`MPI_Op_create`] [used internally by Boost.MPI]] [[`MPI_Op_free`] [used internally by Boost.MPI]] [[`MPI_PROD`] [`std::multiplies`]] [[`MPI_SUM`] [`std::plus`]] ] MPI defines several special communicators, including `MPI_COMM_WORLD` (including all processes that the local process can communicate with), `MPI_COMM_SELF` (including only the local process), and `MPI_COMM_EMPTY` (including no processes). These special communicators are all instances of the [classref boost::mpi::communicator `communicator`] class in Boost.MPI. [table Predefined communicators [[C Constant] [Boost.MPI Equivalent]] [[`MPI_COMM_WORLD`] [a default-constructed [classref boost::mpi::communicator `communicator`]]] [[`MPI_COMM_SELF`] [a [classref boost::mpi::communicator `communicator`] that contains only the current process]] [[`MPI_COMM_EMPTY`] [a [classref boost::mpi::communicator `communicator`] that evaluates false]] ] Boost.MPI supports groups of processes through its [classref boost::mpi::group `group`] class. [table Group operations and constants [[C Function/Constant] [Boost.MPI Equivalent]] [[`MPI_GROUP_EMPTY`] [a default-constructed [classref boost::mpi::group `group`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node97.html#Node97 `MPI_Group_size`]] [[memberref boost::mpi::group::size `group::size`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node97.html#Node97 `MPI_Group_rank`]] [memberref boost::mpi::group::rank `group::rank`]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node97.html#Node97 `MPI_Group_translate_ranks`]] [memberref boost::mpi::group::translate_ranks `group::translate_ranks`]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node97.html#Node97 `MPI_Group_compare`]] [operators `==` and `!=`]] [[`MPI_IDENT`] [operators `==` and `!=`]] [[`MPI_SIMILAR`] [operators `==` and `!=`]] [[`MPI_UNEQUAL`] [operators `==` and `!=`]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node98.html#Node98 `MPI_Comm_group`]] [[memberref boost::mpi::communicator::group `communicator::group`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node98.html#Node98 `MPI_Group_union`]] [operator `|` for groups]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node98.html#Node98 `MPI_Group_intersection`]] [operator `&` for groups]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node98.html#Node98 `MPI_Group_difference`]] [operator `-` for groups]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node98.html#Node98 `MPI_Group_incl`]] [[memberref boost::mpi::group::include `group::include`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node98.html#Node98 `MPI_Group_excl`]] [[memberref boost::mpi::group::include `group::exclude`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node98.html#Node98 `MPI_Group_range_incl`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node98.html#Node98 `MPI_Group_range_excl`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node99.html#Node99 `MPI_Group_free`]] [used automatically in Boost.MPI]] ] Boost.MPI provides manipulation of communicators through the [classref boost::mpi::communicator `communicator`] class. [table Communicator operations [[C Function] [Boost.MPI Equivalent]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node101.html#Node101 `MPI_Comm_size`]] [[memberref boost::mpi::communicator::size `communicator::size`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node101.html#Node101 `MPI_Comm_rank`]] [[memberref boost::mpi::communicator::rank `communicator::rank`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node101.html#Node101 `MPI_Comm_compare`]] [operators `==` and `!=`]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node102.html#Node102 `MPI_Comm_dup`]] [[classref boost::mpi::communicator `communicator`] class constructor using `comm_duplicate`]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node102.html#Node102 `MPI_Comm_create`]] [[classref boost::mpi::communicator `communicator`] constructor]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node102.html#Node102 `MPI_Comm_split`]] [[memberref boost::mpi::communicator::split `communicator::split`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node103.html#Node103 `MPI_Comm_free`]] [used automatically in Boost.MPI]] ] Boost.MPI currently provides support for inter-communicators via the [classref boost::mpi::intercommunicator `intercommunicator`] class. [table Inter-communicator operations [[C Function] [Boost.MPI Equivalent]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node112.html#Node112 `MPI_Comm_test_inter`]] [use [memberref boost::mpi::communicator::as_intercommunicator `communicator::as_intercommunicator`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node112.html#Node112 `MPI_Comm_remote_size`]] [[memberref boost::mpi::intercommunicator::remote_size] `intercommunicator::remote_size`]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node112.html#Node112 `MPI_Comm_remote_group`]] [[memberref boost::mpi::intercommunicator::remote_group `intercommunicator::remote_group`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node113.html#Node113 `MPI_Intercomm_create`]] [[classref boost::mpi::intercommunicator `intercommunicator`] constructor]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node113.html#Node113 `MPI_Intercomm_merge`]] [[memberref boost::mpi::intercommunicator::merge `intercommunicator::merge`]]] ] Boost.MPI currently provides no support for attribute caching. [table Attributes and caching [[C Function/Constant] [Boost.MPI Equivalent]] [[`MPI_NULL_COPY_FN`] [unsupported]] [[`MPI_NULL_DELETE_FN`] [unsupported]] [[`MPI_KEYVAL_INVALID`] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node119.html#Node119 `MPI_Keyval_create`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node119.html#Node119 `MPI_Copy_function`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node119.html#Node119 `MPI_Delete_function`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node119.html#Node119 `MPI_Keyval_free`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node119.html#Node119 `MPI_Attr_put`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node119.html#Node119 `MPI_Attr_get`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node119.html#Node119 `MPI_Attr_delete`]] [unsupported]] ] Boost.MPI will provide complete support for creating communicators with different topologies and later querying those topologies. Support for graph topologies is provided via an interface to the [@http://www.boost.org/libs/graph/doc/index.html Boost Graph Library (BGL)], where a communicator can be created which matches the structure of any BGL graph, and the graph topology of a communicator can be viewed as a BGL graph for use in existing, generic graph algorithms. [table Process topologies [[C Function/Constant] [Boost.MPI Equivalent]] [[`MPI_GRAPH`] [unnecessary; use [memberref boost::mpi::communicator::as_graph_communicator `communicator::as_graph_communicator`]]] [[`MPI_CART`] [unnecessary; use [memberref boost::mpi::communicator::has_cartesian_topology `communicator::has_cartesian_topology`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node133.html#Node133 `MPI_Cart_create`]] [[classref boost::mpi::cartesian_communicator `cartesian_communicator`] constructor]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node134.html#Node134 `MPI_Dims_create`]] [[funcref boost::mpi::cartesian_dimensions `cartesian_dimensions`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node135.html#Node135 `MPI_Graph_create`]] [[classref boost::mpi::graph_communicator `graph_communicator ctors`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node136.html#Node136 `MPI_Topo_test`]] [[memberref boost::mpi::communicator::as_graph_communicator `communicator::as_graph_communicator`], [memberref boost::mpi::communicator::has_cartesian_topology `communicator::has_cartesian_topology`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node136.html#Node136 `MPI_Graphdims_get`]] [[funcref boost::mpi::num_vertices `num_vertices`], [funcref boost::mpi::num_edges `num_edges`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node136.html#Node136 `MPI_Graph_get`]] [[funcref boost::mpi::vertices `vertices`], [funcref boost::mpi::edges `edges`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node136.html#Node136 `MPI_Cartdim_get`]] [[memberref boost::mpi::cartesian_communicator::ndims `cartesian_communicator::ndims` ]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node136.html#Node136 `MPI_Cart_get`]] [[memberref boost::mpi::cartesian_communicator::topology `cartesian_communicator::topology` ]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node136.html#Node136 `MPI_Cart_rank`]] [[memberref boost::mpi::cartesian_communicator::rank `cartesian_communicator::rank` ]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node136.html#Node136 `MPI_Cart_coords`]] [[memberref boost::mpi::cartesian_communicator::coordinates `cartesian_communicator::coordinates` ]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node136.html#Node136 `MPI_Graph_neighbors_count`]] [[funcref boost::mpi::out_degree `out_degree`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node136.html#Node136 `MPI_Graph_neighbors`]] [[funcref boost::mpi::out_edges `out_edges`], [funcref boost::mpi::adjacent_vertices `adjacent_vertices`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node137.html#Node137 `MPI_Cart_shift`]] [[memberref boost::mpi::cartesian_communicator::shifted_ranks `cartesian_communicator::shifted_ranks` ]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node138.html#Node138 `MPI_Cart_sub`]] [[classref boost::mpi::cartesian_communicator `cartesian_communicator`] constructor]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node139.html#Node139 `MPI_Cart_map`]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node139.html#Node139 `MPI_Graph_map`]] [unsupported]] ] Boost.MPI supports environmental inquires through the [classref boost::mpi::environment `environment`] class. [table Environmental inquiries [[C Function/Constant] [Boost.MPI Equivalent]] [[`MPI_TAG_UB`] [unnecessary; use [memberref boost::mpi::environment::max_tag `environment::max_tag`]]] [[`MPI_HOST`] [unnecessary; use [memberref boost::mpi::environment::host_rank `environment::host_rank`]]] [[`MPI_IO`] [unnecessary; use [memberref boost::mpi::environment::io_rank `environment::io_rank`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node143.html#Node147 `MPI_Get_processor_name`]] [[memberref boost::mpi::environment::processor_name `environment::processor_name`]]] ] Boost.MPI translates MPI errors into exceptions, reported via the [classref boost::mpi::exception `exception`] class. [table Error handling [[C Function/Constant] [Boost.MPI Equivalent]] [[`MPI_ERRORS_ARE_FATAL`] [unused; errors are translated into Boost.MPI exceptions]] [[`MPI_ERRORS_RETURN`] [unused; errors are translated into Boost.MPI exceptions]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node148.html#Node148 `MPI_errhandler_create`]] [unused; errors are translated into Boost.MPI exceptions]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node148.html#Node148 `MPI_errhandler_set`]] [unused; errors are translated into Boost.MPI exceptions]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node148.html#Node148 `MPI_errhandler_get`]] [unused; errors are translated into Boost.MPI exceptions]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node148.html#Node148 `MPI_errhandler_free`]] [unused; errors are translated into Boost.MPI exceptions]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node148.html#Node148 `MPI_Error_string`]] [used internally by Boost.MPI]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node149.html#Node149 `MPI_Error_class`]] [[memberref boost::mpi::exception::error_class `exception::error_class`]]] ] The MPI timing facilities are exposed via the Boost.MPI [classref boost::mpi::timer `timer`] class, which provides an interface compatible with the [@http://www.boost.org/libs/timer/index.html Boost Timer library]. [table Timing facilities [[C Function/Constant] [Boost.MPI Equivalent]] [[`MPI_WTIME_IS_GLOBAL`] [unnecessary; use [memberref boost::mpi::timer::time_is_global `timer::time_is_global`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node150.html#Node150 `MPI_Wtime`]] [use [memberref boost::mpi::timer::elapsed `timer::elapsed`] to determine the time elapsed from some specific starting point]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node150.html#Node150 `MPI_Wtick`]] [[memberref boost::mpi::timer::elapsed_min `timer::elapsed_min`]]] ] MPI startup and shutdown are managed by the construction and destruction of the Boost.MPI [classref boost::mpi::environment `environment`] class. [table Startup/shutdown facilities [[C Function] [Boost.MPI Equivalent]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node151.html#Node151 `MPI_Init`]] [[classref boost::mpi::environment `environment`] constructor]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node151.html#Node151 `MPI_Finalize`]] [[classref boost::mpi::environment `environment`] destructor]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node151.html#Node151 `MPI_Initialized`]] [[memberref boost::mpi::environment::initialized `environment::initialized`]]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node151.html#Node151 `MPI_Abort`]] [[memberref boost::mpi::environment::abort `environment::abort`]]] ] Boost.MPI does not provide any support for the profiling facilities in MPI 1.1. [table Profiling interface [[C Function] [Boost.MPI Equivalent]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node153.html#Node153 `PMPI_*` routines]] [unsupported]] [[[@http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node156.html#Node156 `MPI_Pcontrol`]] [unsupported]] ] [endsect:c_mapping]