10.11. 异常作业

Open MPI 可以运行多种类型的应用程序,包括非MPI程序。本节介绍了一些可以执行的不太常见的程序类型。

10.11.1. 使用mpirun(1)运行非MPI程序

非MPI程序可以通过mpirun(1)启动,例如:

shell$ mpirun -n 2 --host a,b uptime

这将在主机ab上启动Unix命令uptime的副本。

mpirun(1) 对于MPI和非MPI应用程序同样适用。

10.11.2. 运行图形界面应用程序

运行GUI应用程序取决于您的本地设置,可能需要额外的配置。

您需要启用从远程进程到目标显示器的图形转发(例如X11转发),以便输出内容能正确显示。在安全环境中,您可以简单地允许所有X请求显示在目标显示器上,并将所有MPI进程环境中的DISPLAY环境变量设置为目标显示器,类似这样:

shell$ hostname
my_desktop.secure-cluster.example.com
shell$ xhost +
shell$ mpirun -n 4 -x DISPLAY=my_desktop.secure-cluster.example.com a.out

然而,这种技术通常不适用于不安全环境(因为它允许任何人读写您的显示内容)。一种稍安全的方式是仅允许来自应用程序运行节点的X连接:

shell$ hostname
my_desktop.secure-cluster.example.com
shell$ xhost +compute1 +compute2 +compute3 +compute4
compute1 being added to access control list
compute2 being added to access control list
compute3 being added to access control list
compute4 being added to access control list
shell$ mpirun -n 4 -x DISPLAY=my_desktop.secure-cluster.example.com a.out

(假设您运行的四个节点是 compute1compute4)。

还有其他方法可用,但它们需要通过mpirun(1)进行复杂的X转发,通常比预期更为复杂。

10.11.3. 运行基于curses的应用程序

Open MPI提供了相当复杂的stdin/stdout/stderr转发功能。然而,它与curses、ncurses、readline或其他通常需要直接控制终端的复杂I/O包配合效果不佳。

每个应用程序和I/O库都各不相同——您应该尝试查看您所使用的工具是否被支持。但很可能它无法正常工作。

10.11.4. 启动MPMD MPI作业

Open MPI 支持多程序多数据(MPMD)风格的启动方式,既可以通过命令行也可以从文件启动。例如:

shell$ mpirun -n 2 a.out : -n 2 b.out

这将启动一个并行应用程序,但前两个进程将是a.out可执行文件的实例,而后两个进程将是b.out可执行文件的实例。在MPI术语中,这将是一个单一的MPI_COMM_WORLD通信域,其中a.out进程在MPI_COMM_WORLD中排名为0和1,而b.out进程在MPI_COMM_WORLD中排名为2和3。

mpirun(1) 也可以通过文件而非命令行来指定并行应用程序。例如:

shell$ mpirun --app my_appfile

其中文件 my_appfile 包含以下内容:

# Comments are supported; comments begin with #
# Application context files specify each sub-application in the
# parallel job, one per line.  The first sub-application is the 2
# a.out processes:
-n 2 a.out
# The second sub-application is the 2 b.out processes:
-n 2 b.out

这将产生与从命令行运行a.outb.out相同的行为。

10.11.5. 连接独立的MPI应用程序

在某些环境中,Open MPI支持通过MPI规范定义的机制(如MPI_Comm_connect() / MPI_Comm_accept())连接多个独立的MPI应用程序,并使用MPI_Publish_name() / MPI_Lookup_name()发布连接信息。这些机制需要一个集中式服务来在多个作业之间交换联系信息。

从Open MPI v5.0.0开始,可以通过启动prte服务器实例并指定report-uri选项来显示prte服务器的联系信息,从而实现这一功能。这些信息随后可用于启动后续的MPI应用程序。

以下命令展示了如何启动两个MPI作业的示例,这些作业将在运行时使用基于MPI-2的功能相互连接。

步骤1:启动独立的prte服务器

user@myhost:~/ompi-install/bin$ ./prte --report-uri <filename>
DVM ready

步骤2:启动第一个MPI应用程序,提供prte服务器的URI

user@myhost:~/app1-dir$ mpiexec --dvm file:<filename> -np 4 ./mpi_app_1

步骤3:再次启动第二个MPI应用程序,提供prte服务器的uri

user@myhost:~/app2-dir$ mpiexec --dvm file:<filename> -np 4 ./mpi_app_2

如果prte服务器是作为系统服务器启动的(使用了--system-server参数,例如MPI应用程序使用的节点不被多个作业共享),则可以通过使用mpiexec --dvm systemmpiexec --dvm system-first来简化流程,而无需指定prte服务器的uri。