如何编写独立于 MPI 实现的代码?

计算科学 mpi
2021-12-14 09:24:36

具体来说,如何编写同时适用于 MPICH 和 OpenMPI 的代码?

我目前正在清理我们打算在今年 Spring 发布的分布式内存随机混合整数线性编程包的构建脚本和代码。代码的特性之一(或者更确切地说,我们从合作者那里依赖的库之一)是它只能与 MPICH 一起使用,而不能与 OpenMPI 一起构建或运行。我应该以独立于 MPI 实现的方式实现什么样的东西?(例如,一位同事指出 OpenMPI 和 MPICH 以不同的方式代表沟通者。)我的目标是尝试修补软件,使其适用于 OpenMPI 和 MPICH,以及有关如何做到这一点的任何高级指导(希望与一些参考资料)将非常有帮助。

编辑:这是来自编译器的示例错误消息(OS X,来自 Xcode 7.2 的 Clang):

PIPS/PIPS-IPM/Core/QpStoch/sTree.C:147:9: error: no matching function for call to 'MPI_Comm_create'
        ierr = MPI_Comm_create(mpiWorldGroup, childGroup, &childComm); assert(ierr==MPI_SUCCESS);
               ^~~~~~~~~~~~~~~
/usr/local/Cellar/open-mpi/1.10.1_1/include/mpi.h:1271:20: note: candidate function not viable: cannot convert argument of incomplete type 'MPI_Group' (aka 'ompi_group_t *') to 'MPI_Comm' (aka 'ompi_communicator_t *')
OMPI_DECLSPEC  int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm);
                   ^
1 error generated.

我应该更清楚一点:错误出现在一个库中,我正在帮助一些合作者为新版本做好准备。我不是原作者,但我已经修补了代码以添加我需要的功能,而且我帮助改进了构建系统。因此,这个问题实际上更适合开发人员对 MPI 有点熟悉,可以编写符合 MPI 标准的代码,但现在正试图调试其他人的代码并将其替换为符合 MPI 标准的代码的情况。基本上,我正在寻找常见的陷阱。

2个回答

始终使用标准指定的正确类型。除非您在 Fortran 中,否则您的沟通者的 MPI_Comm 不是 int。等等等等。

这应该相对容易。你真的有什么问题?

编辑添加以响应更新:看起来类型childGroup不是 anMPI_Group而是 an MPI_Comm,因此您应该修复它或使用临时MPI_Group从本地通信器中提取组。看起来这两种类型在 OpenMPI 中被定义为 int 或其他类型,因此代码在那里“工作”而不是在 MPICH 下,它们可能各自是自己的不透明结构。

Bill Barth 已经给出了很好的建议。我的建议是不要阅读 MPICH 或 OpenMPI 文档。请改为阅读 MPI 标准。就标准而言,它实际上是非常可读的。根据我的经验,实现非常符合标准,但它们添加和扩展了它们。这些扩展是导致代码不兼容的问题的一部分。