Boost C++ 库

……世界上最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ 编码规范

PrevUpHomeNext

入门

MPI 实现
配置和构建
使用 Boost.MPI

开始使用 Boost.MPI 需要一个可工作的 MPI 实现、最新版本的 Boost 以及一些配置信息。

要开始使用 Boost.MPI,首先需要一个可工作的 MPI 实现。有很多符合标准的 MPI 实现 可用。Boost.MPI 应该可以与任何实现一起工作,尽管它只经过了广泛的测试:

您可以使用以下简单的程序测试您的实现,该程序将消息从一个处理器传递到另一个处理器。每个处理器都会向标准输出打印一条消息。

#include <mpi.h>
#include <iostream>

int main(int argc, char* argv[])
{
  MPI_Init(&argc, &argv);

  int rank;
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  if (rank == 0) {
    int value = 17;
    int result = MPI_Send(&value, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
    if (result == MPI_SUCCESS)
      std::cout << "Rank 0 OK!" << std::endl;
  } else if (rank == 1) {
    int value;
    int result = MPI_Recv(&value, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,
			  MPI_STATUS_IGNORE);
    if (result == MPI_SUCCESS && value == 17)
      std::cout << "Rank 1 OK!" << std::endl;
  }
  MPI_Finalize();
  return 0;
}

您应该在两个处理器上编译并运行此程序。要执行此操作,请参阅 MPI 实现的文档。例如,使用 OpenMPI,您可以使用 mpiCCmpic++ 编译器进行编译,启动 LAM/MPI 守护程序,并通过 mpirun 运行您的程序。例如,如果您的程序名为 mpi-test.cpp,请使用以下命令:

mpiCC -o mpi-test mpi-test.cpp
lamboot
mpirun -np 2 ./mpi-test
lamhalt

运行此程序时,您将看到 Rank 0 OK!Rank 1 OK! 都打印到屏幕上。但是,它们可能按任何顺序打印,甚至可能相互重叠。以下输出对于此 MPI 程序来说是完全合法的:

Rank Rank 1 OK!
0 OK!

如果您的输出类似于上述内容,则您的 MPI 实现似乎与 C++ 编译器一起工作,我们可以继续下一步了。

与其他 Boost 库一样,Boost.MPI 使用版本 2 的 Boost.Build 系统来配置和构建库二进制文件。

请参阅通用的 Boost 安装说明,了解 Unix 变体(包括 Unix、Linux 和 MacOS)或 Windows 的说明。简化的构建说明应该适用于大多数平台,下面描述了一些具体的修改。

如 Boost 安装说明中所述,从 Boost 根目录运行引导程序(对于 Unix 变体为 ./bootstrap.sh,对于 Windows 为 bootstrap.bat)将生成一个 'project-config.jam` 文件。您需要编辑该文件并添加以下行:

using mpi ;

或者,您可以显式提供要构建的 Boost 库列表。请参阅 --help bootstrap 脚本选项。

首先,您需要扫描 include/boost/mpi/config.hpp 文件,并检查是否需要为您的 MPI 实现或偏好修改某些设置。

特别是 BOOST_MPI_HOMOGENEOUS 宏,如果您计划在异构机器集上运行,则需要将其注释掉。请参阅下面的 优化 说明。

大多数 MPI 实现需要特定的编译和链接选项。为了向用户隐藏这些细节,大多数 MPI 实现提供了包装器,这些包装器会静默地将这些选项传递给编译器。

根据您的 MPI 实现,可能需要一些工作来告诉 Boost 使用哪个特定的 MPI 选项。这是通过 using mpi ; 指令在 project-config.jam 文件中完成的,其一般形式为(不要忘记在 : 周围和 ; 之前留空格):

using mpi
   : [<MPI compiler wrapper>]
   : [<compilation and link options>]
   : [<mpi runner>] ;

根据您的安装和 MPI 发行版,构建系统可能能够找到所有必需的信息,您只需要指定:

using mpi ;

大多数情况下,尤其是在生产 HPC 集群中,需要进行一些工作。

以下是常见问题以及如何解决这些问题的建议列表。

  • 您的包装器不在您的路径中或没有标准名称

您需要使用第一个参数告诉构建系统如何调用它。

using mpi : /opt/mpi/bullxmpi/1.2.8.3/bin/mpicc ;
[Warning] 警告

Boost.MPI 只使用 C 接口,因此指定 C 包装器就足够了。但是,某些实现会坚持导入 C++ 绑定。

  • 您的包装器非常特殊或不存在

对于某些实现或某些特定集成[9],您需要使用 'jam' 指令通过第二个参数提供编译和链接选项。以下类型的配置曾经是某些特定 Intel MPI 实现所必需的(在这种情况下,可以留空包装器的名称):

using mpi : mpiicc :
      <library-path>/softs/intel/impi/5.0.1.035/intel64/lib
      <library-path>/softs/intel/impi/5.0.1.035/intel64/lib/release_mt
      <include>/softs/intel/impi/5.0.1.035/intel64/include
      <find-shared-library>mpifort
      <find-shared-library>mpi_mt
      <find-shared-library>mpigi
      <find-shared-library>dl
      <find-shared-library>rt ;

为了方便起见,MPI 包装器通常有一个选项可以提供所需的信息,该选项通常以 --show 开头。您可以使用这些信息来找出所需的 jam 指令。

$ mpiicc -show
icc -I/softs/.../include ... -L/softs/.../lib ... -Xlinker -rpath -Xlinker /softs/.../lib .... -lmpi -ldl -lrt -lpthread
$
$ mpicc --showme
icc -I/opt/.../include -pthread -L/opt/.../lib -lmpi -ldl -lm -lnuma -Wl,--export-dynamic -lrt -lnsl -lutil -lm -ldl
$ mpicc --showme:compile
-I/opt/mpi/bullxmpi/1.2.8.3/include -pthread
$ mpicc --showme:link
-pthread -L/opt/.../lib -lmpi -ldl -lm -lnuma -Wl,--export-dynamic -lrt -lnsl -lutil -lm -ldl
$

要查看 MPI 自动检测的结果,请在 bjam 命令行上传递 --debug-configuration

  • 无法检测到启动语法
[Note] 注意

这仅在 运行测试 时使用。

如果您需要使用特殊命令来启动 MPI 程序,则需要通过 using mpi 指令的第三个参数指定它。

因此,假设您使用以下命令启动 all_gather_test 程序:

$mpiexec.hydra -np 4 all_gather_test

该指令将如下所示:

using mpi : mpiicc :
     [<compilation and link options>]
 : mpiexec.hydra -n  ;

构建整个 Boost 发行版:

$cd <boost distribution>
$./b2

构建 Boost.MPI 库及其依赖项:

$cd <boost distribution>/lib/mpi/build
$../../../b2

您可以使用以下命令运行回归测试:

$cd <boost distribution>/lib/mpi/test
$../../../b2

安装整个 Boost 发行版:

$cd <boost distribution>
$./b2 install

要构建基于 Boost.MPI 的应用程序,请像通常对 MPI 程序那样编译和链接它们,但请记住要链接到 boost_mpiboost_serialization 库,例如:

mpic++ -I/path/to/boost/mpi my_application.cpp -Llibdir \
  -lboost_mpi -lboost_serialization

如果您计划将 Python 绑定 用于 Boost.MPI 并结合使用 C++ Boost.MPI,您还需要链接到 boost_mpi_python 库,例如,通过向您的链接命令添加 -lboost_mpi_python-gcc。只有当您打算 注册 C++ 类型 或从 Python 中使用 骨架/内容机制 时,才需要执行此步骤。



[9] 一些 HPC 集群会坚持要求用户使用他们自己的内部接口连接到 MPI 系统。


PrevUpHomeNext