one of the most highly regarded and expertly designed C++ library projects in the world.
— Herb Sutter and Andrei Alexandrescu, C++ Coding Standards
本节提供了映射表,将标准 C MPI 的函数和常量与其 Boost.MPI 等效项进行对应。这将对熟悉 MPI 的 C 或 Fortran 接口,或者需要将现有并行程序移植到 Boost.MPI 的用户最有帮助。
请注意,这不是一个完美的直接映射,Boost.MPI 有时会以对最终用户透明的方式使用 C API 中的函数。例如,MPI_Probe 和 friends
可用于实现异步发送/接收。
表 23.1. 点对点通信
C 函数/常量 |
Boost.MPI 等效项 |
---|---|
|
|
|
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
Boost.MPI 会自动将 C 和 C++ 数据类型映射到其 MPI 等效项。下表说明了 C++ 类型和 MPI 数据类型常量之间的映射。
表 23.2. 数据类型
C 常量 |
Boost.MPI 等效项 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
未使用 |
|
在 Boost.MPI 中内部使用,用于 序列化数据类型 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Boost.MPI 不提供对 MPI 派生数据类型功能的直接包装。相反,Boost.MPI 依赖于 Boost.Serialization 库来为用户定义类构建 MPI 数据类型。关于 用户定义数据类型 的章节描述了这种机制,它用于使用 is_mpi_datatype
标记为“MPI 数据类型”的类型。
接下来的派生数据类型表描述了哪些 C++ 类型对应于 C MPI 的数据类型构造函数的功能。Boost.MPI 在构建特定形式的数据类型时可能不会实际使用列出的 C MPI 函数。由于 Boost.MPI 构建的实际数据类型通常对用户是隐藏的,因此许多这些操作都是由 Boost.MPI 在内部调用的。
表 23.3. 派生数据类型
C 函数/常量 |
Boost.MPI 等效项 |
---|---|
在 Boost.MPI 中自动使用,用于 MPI 版本 1.x |
|
在 Boost.MPI 中自动使用,用于 MPI 版本 2.0 及更高版本 |
|
在 Boost.MPI 中自动使用 |
|
数组 |
|
在 Boost.MPI 中自动使用 |
|
在 Boost.MPI 中自动使用 |
|
用作子对象的任何类型 |
|
未使用 |
|
用作子对象的任何类型 |
|
unsupported |
|
在 Boost.MPI 中自动使用 |
|
带有 MPI 1.x 的用户定义类和结构 |
|
带有 MPI 2.0 及更高版本的用户定义类和结构 |
|
unsupported |
|
在 Boost.MPI 中自动使用 |
MPI 的打包功能将值存储到连续缓冲区中,该缓冲区可以通过 MPI 传输,然后通过 MPI 的解包功能解包为单独的值。与数据类型一样,Boost.MPI 提供了对 MPI 打包和解包功能的抽象接口。特别是,两个存档类 packed_oarchive
和 packed_iarchive
可用于使用 MPI 的功能打包或解包连续缓冲区。
Boost.MPI 支持大多数 MPI 集合通信的“一对一”映射。对于 Boost.MPI 提供的每个集合通信,当可能(且高效)时,将调用底层的 C MPI 集合通信。
表 23.5. 集合通信
C 函数 |
Boost.MPI 等效项 |
---|---|
大多数用法由 |
|
大多数用法由 |
|
unsupported |
|
通过 |
Boost.MPI 使用函数对象来指定在等效于 MPI_Allreduce
、MPI_Reduce
和 MPI_Scan
的操作中如何进行归约。下表说明了 C MPI 和 Boost.MPI 之间的 预定义 和 用户定义 归约操作如何映射。
表 23.6. 归约操作
C 常量 |
Boost.MPI 等效项 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unsupported |
|
|
|
unsupported |
|
在 Boost.MPI 中内部使用 |
|
在 Boost.MPI 中内部使用 |
|
|
|
|
MPI 定义了几种特殊的通信子,包括 MPI_COMM_WORLD
(包含本地进程可以通信的所有进程)、MPI_COMM_SELF
(只包含本地进程)和 MPI_COMM_EMPTY
(不包含任何进程)。这些特殊的通信子都是 Boost.MPI 中的 communicator
类的实例。
表 23.7. 预定义通信子
C 常量 |
Boost.MPI 等效项 |
---|---|
|
默认构造的 |
|
包含当前进程的 |
|
计算为 false 的 |
Boost.MPI 通过其 group
类支持进程组。
表 23.8. 组操作和常量
C 函数/常量 |
Boost.MPI 等效项 |
---|---|
|
默认构造的 |
成员引用 boost::mpi::group::rank |
|
成员引用 boost::mpi::group::translate_ranks |
|
运算符 |
|
|
运算符 |
|
运算符 |
|
运算符 |
组的运算符 |
|
组的运算符 |
|
组的运算符 |
|
unsupported |
|
unsupported |
|
在 Boost.MPI 中自动使用 |
Boost.MPI 通过 communicator
类提供通信子的操作。
表 23.9. 通信子操作
C 函数 |
Boost.MPI 等效项 |
---|---|
运算符 |
|
使用 |
|
|
|
在 Boost.MPI 中自动使用 |
Boost.MPI 目前通过 intercommunicator
类提供对互通信子的支持。
表 23.10. 互通信子操作
C 函数 |
Boost.MPI 等效项 |
---|---|
|
|
|
|
Boost.MPI 目前不提供对属性缓存的支持。
表 23.11. 属性和缓存
C 函数/常量 |
Boost.MPI 等效项 |
---|---|
|
unsupported |
|
unsupported |
|
unsupported |
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
|
unsupported |
Boost.MPI 将提供对创建具有不同拓扑的通信子以及之后查询这些拓扑的全面支持。通过与 Boost Graph Library (BGL) 的接口来支持图拓扑,其中可以创建一个与任何 BGL 图结构匹配的通信子,并且通信子的图拓扑可以被视为 BGL 图,用于现有的通用图算法。
表 23.12. 进程拓扑
C 函数/常量 |
Boost.MPI 等效项 |
---|---|
|
|
|
|
|
|
unsupported |
|
unsupported |
Boost.MPI 通过 environment
类支持环境查询。
表 23.13. 环境查询
C 函数/常量 |
Boost.MPI 等效项 |
---|---|
|
不必要;使用 |
|
不必要;使用 |
|
不必要;使用 |
Boost.MPI 将 MPI 错误转换为异常,通过 exception
类报告。
表 23.14. 错误处理
C 函数/常量 |
Boost.MPI 等效项 |
---|---|
|
未使用;错误被转换为 Boost.MPI 异常 |
|
未使用;错误被转换为 Boost.MPI 异常 |
未使用;错误被转换为 Boost.MPI 异常 |
|
未使用;错误被转换为 Boost.MPI 异常 |
|
未使用;错误被转换为 Boost.MPI 异常 |
|
未使用;错误被转换为 Boost.MPI 异常 |
|
在 Boost.MPI 中内部使用 |
|
MPI 的计时设施通过 Boost.MPI 的 timer
类公开,它提供了一个与 Boost Timer 库 兼容的接口。
表 23.15. 计时设施
C 函数/常量 |
Boost.MPI 等效项 |
---|---|
|
不必要;使用 |
使用 |
|
MPI 的启动和关闭由 Boost.MPI environment
类的构造和析构来管理。
Boost.MPI 不提供对 MPI 1.1 中任何性能分析设施的支持。