如何分发可移植的 MPI 应用程序?

How to distribute portable MPI applications?

我在一家模拟软件供应商工作。我们现在开始使用 MPI 为我们的软件实现分布式计算。我真的不明白我们应该如何分发支持 MPI 的软件产品。

所以,MPI是一个接口规范,所以实际的MPI实现应该是可以替换的吧? 运行集群的任何人都可以为他们使用的 hardware/communication 层提供非常专业的 MPI 实现。这对我来说很有意义。

另一方面,当我 运行 ldd mympiapp 我看到

libmpi.so.12 => /home/mpiuser/mpich-3.2-install/lib/libmpi.so.12 (0x00007fae34684000)

似乎在构建之后,我的应用程序链接到我的特定版本的 MPI。我们已经为不同的操作系统发布了不同版本的应用程序。我们现在还应该为不同的 MPI 实现添加组合吗?或者我们还应该将共享库与我们的应用程序一起分发吗? users/cluster 提供者的期望是什么?

我阅读了很多网络资源,但我发现的大多数内容都是从编译者也 运行 的角度编写的。

此问题类似于您要以二进制格式发布的任何其他软件。

如果你想支持多平台,多操作系统,你必须提供二进制包。这样(适用)您可以强制执行一些要求(例如在 RPM 中)。

您还可以提供包含为给定平台编译的库的二进制代码(并确保 link 您的二进制文件包含这些库 - 例如使用 rpath)。

这里没有简单的解决方案,因为您希望支持不同的平台、不同的操作系统和(很可能)不同的编译器。另一种方法是将您的代码的 MPI 部分作为源代码分发,并提供您想要 "hide" 作为共享库的代码。但这是哦,这么多的情况取决于。

MPI 实现附带 mpicc 是有原因的。

高性能软件不同于普通软件,性能是绝对关键的。为分发编译单个二进制文件通常是不可接受的,因为就高性能而言,硬件抽象是 leaky

许多大型高性能软件供应商通过针对各种 hardware/software 组合的不同二进制文件的集合来分发它,派工程师到现场为客户编译和调整软件系统,或者在某些情况下,我听说过一些较小的公司将源代码提供给客户(有非常严格的合同)。

客户系统需要专门编译的三个原因:

  1. 以便使用正确的硬件 MPI 和 OpenMP 实现,

  2. 以便可以使用特定于平台的编译器来生成尽可能高效的指令,

  3. 这样就可以完成tuning硬件(处理器、内存和互连)的编译时算法参数。您的代码使用的通信模式应取决于互连,块大小应取决于处理器缓存大小等。

这种对耦合硬件和编译字节的需求通常会导致商业 MPI 软件的销售周期很长。