Parallel MPI 库的设计理念非常简单:既方便又高效。MPI 是一个为高性能应用程序而构建的库,但它以 FORTRAN 为中心、注重性能的设计,从 C++ 的角度来看相当不灵活:在进程之间传递字符串很麻烦,需要多个消息和显式的缓冲;在进程之间传递字符串容器需要额外的手动管理;而传递字符串到字符串容器的映射更是令人极其恼火。Parallel MPI 库允许使用相同的简单 send()
和 recv()
原语来传递所有这些数据类型。同样,诸如 reduce()
等集体操作允许任意数据类型和函数对象,这与 C++ 标准库非常相似。
为方便起见提供的高级抽象不得对应用程序的性能产生影响。例如,通过 send
发送一个整数必须与调用 MPI_Send
一样高效,这意味着它必须通过一个简单的 MPI_Send
调用来实现;同样,使用 std::plus<int>
的整数 reduce()
必须通过对整数进行 MPI_Reduce
调用并使用 MPI_SUM
操作来实现:任何低于此标准的做法都会影响性能。本质上,这就是“不为不需要的东西付费”原则:如果用户不传输字符串,则不应承担与字符串相关的开销。
有时,实现最大性能意味着放弃方便的抽象,并使用更底层的原语来实现某些功能。因此,始终可以从 Boost.MPI 的抽象中提取足够的信息,以最大程度地减少在 Boost.MPI 和 C MPI 库之间进行接口所需的努力。