是否可以在本地计算机和远程集群上运行 OpenMPI?

Nic*_*ick 4 openmpi

我有一组需要在集群中执行的计算操作(可能像 512 个 MPI 进程)。现在,我让集群上的根节点打开一个套接字并在计算操作之间将数据传输到我的本地计算机,但我想知道是否可以只创建两个 MPI 组,其中一个组是我的本地机器,另一个是远程集群,并使用 MPI 命令在它们之间发送数据。

这可能吗?

Hri*_*iev 6

是的,这是可能的,只要集群节点和您的机器之间有网络路径即可。MPI 标准提供了执行此操作的抽象机制,而 Open MPI 提供了一种非常简单的方法来使事情工作。您必须查看标准的流程创建和管理部分(MPI-2.2 的第 10 章),特别是建立通信小节(MPI-2.2 的第 10.4 节)。基本上步骤是:

  1. 您分别启动两个 MPI 作业。这显然是你所做的,所以这里没有什么新鲜事。
  2. 其中一项作业使用MPI_Open_port(). 这个 MPI 调用返回一个唯一的端口名称,然后必须使用MPI_Publish_name(). 一旦端口打开,就可以通过调用阻塞例程来接受客户端连接MPI_Comm_accept()。该作业现在已成为服务器作业。
  3. 另一个 MPI 作业(称为客户端作业)首先使用MPI_Lookup_name(). 一旦有了端口名称,它就可以调用MPI_Comm_connect()以连接到远程服务器。
  4. 一旦MPI_Comm_connect()与各自的 配对MPI_Comm_accept(),两个作业将在它们之间建立一个相互通信器,然后可以来回发送消息。

一个复杂的细节是客户端作业如何在给定服务名称的情况下查找端口名称?这是 Open MPI 中文档较少的部分,但它非常简单:您必须提供mpiexec用于启动客户端作业的命令mpiexec以及服务器作业的 URI ,它充当一种目录服务。为此,您应该使用--report-uri -参数启动服务器作业,使其将其 URI 打印到标准输出:

$ mpiexec --report-uri - <other arguments like -np> ./server ...
Run Code Online (Sandbox Code Playgroud)

它会给你一个很长的 URI 形式1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351。现在您必须mpiexec使用以下--ompi-server uri选项将此 URI 提供给客户端:

$ mpiexec --ompi-server 1221656576.0;tcp://10.1.13.164:36351... ./client ...
Run Code Online (Sandbox Code Playgroud)

请注意,URI 包含所有已配置和已启用的网络接口的地址,这些网络接口出现在服务器mpiexec启动的节点上。您应该确保客户至少能够联系到其中之一。还要确保您在启用的 BTL 组件列表中有 TCP BTL 组件,否则没有消息可以流动。TCP BTL 通常默认启用,但在某些 InfiniBand 安装中,它被明确禁用,方法是设置环境变量的相应值OMPI_MCA_btl或在默认的 Open MPI MCA 配置文件中。MCA 参数可以用--mca选项覆盖,例如:

$ mpiexec --mca btl self,sm,openib,tcp --report-uri - ...
Run Code Online (Sandbox Code Playgroud)

也看到了答案,我给了一个类似的问题。