如何分发便携式MPI应用程序?

如何分发便携式MPI应用程序?,mpi,software-distribution,Mpi,Software Distribution,我在一家仿真软件供应商工作。我们现在开始为我们的软件使用MPI实现分布式计算。我真的不明白我们应该如何分发支持MPI的软件产品 所以,MPI是一种接口规范,所以实际的MPI实现应该是可替换的,对吗?任何运行集群的人都可以为他们使用的硬件/通信层提供非常专门的MPI实现。这对我来说很有意义 另一方面,当我运行ldd mympiapp时,我看到 libmpi.so.12 => /home/mpiuser/mpich-3.2-install/lib/libmpi.so.12 (0x00007fa

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

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

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

libmpi.so.12 => /home/mpiuser/mpich-3.2-install/lib/libmpi.so.12 (0x00007fae34684000)
似乎在构建之后,我的应用程序与我的特定MPI版本相链接。我们已经为不同的操作系统提供了不同版本的应用程序。我们现在是否应该为不同的MPI实现添加组合?或者我们也应该将共享库与应用程序一起分发?用户/集群提供商方面的期望是什么


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

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

如果你想支持多个平台和多个操作系统,你必须提供二进制软件包。通过这种方式(如果适用),您可以强制执行某些要求(例如在RPM中)

您还可以提供二进制代码,其中包含为给定平台编译的库(并确保将二进制代码链接到这些库,例如使用rpath)


这里没有简单的解决方案,因为您希望支持不同的平台、不同的操作系统和(很可能)不同的编译器。另一种方法是将代码的MPI部分作为源代码分发,并提供要“隐藏”的代码作为共享库。但是这是非常依赖于大小写的。

MPI实现与mpicc一起出现是有原因的

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

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

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

  • 以便使用硬件的正确MPI和OpenMP实现

  • 因此,可以使用特定于平台的编译器生成尽可能高效的指令

  • 因此,可以为硬件(处理器、内存和互连)设置编译时算法参数。代码使用的通信模式应取决于互连,块大小应取决于处理器缓存大小等


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

    已经回答了问题本身中的部分问题,并且答案包含实现的具体提示和源代码。请查看所有三个答案。如果这三个答案都没有回答您的问题,请澄清y、 MPI是一种接口规范,但不同的MPI实现不是二进制兼容的。您不能根据Open MPI进行构建,然后在运行时使用MPICH。您甚至不能根据Open MPI 1.x进行构建,然后使用2.x运行。您或者必须随代码分发某些预构建的MPI库,以及大量依赖项,例如,用于各种网络设备和资源管理器的API,或提供由最终用户构建的抽象层。我不同意前一个选项。@Zulan感谢您指点我!MPI与其他软件依赖项非常不同。将MPI作为软件的一部分分发不是一个可行的选项,因为1)MPI不仅仅是一个库,它还与启动器一起提供,并与资源管理器交互2)所有这些和MPI通常都是针对特定系统进行高度配置和调优的。另一方面,包装MPI是可行的,并且是既定的实践,如我链接的重复问题中详细描述的。一些ISV很乐意将IntelMPI运行时与他们的软件一起分发。IntelMPI(但不仅如此)可以在运行时选择最快的互连,以提供开箱即用的良好性能。