开始使用 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,您可以使用 mpiCC
或 mpic++
编译器进行编译,启动 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 ;
警告 | |
---|---|
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
。
注意 | |
---|---|
这仅在 运行测试 时使用。 |
如果您需要使用特殊命令来启动 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
要构建基于 Boost.MPI 的应用程序,请像通常对 MPI 程序那样编译和链接它们,但请记住要链接到 boost_mpi
和 boost_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 中使用 骨架/内容机制 时,才需要执行此步骤。