我使用MPI_Open_port
和MPI_Comm_accept
在MPI中实现了对等连接。我使用以下命令运行服务器和客户端程序
rafael@server1:~$ mpirun server
rafael@server2:~$ mpirun client
在不同的计算机上。我注意到
rafael@server1:~$ ./server
rafael@server2:~$ ./client
也可以。您是否知道使用
mpirun
和不使用mpirun --mca btl self,openib
启动MPI可执行文件之间是否有区别?当然,我不能提供其他参数(例如),并且所有进程的等级均为0,这完全可以。但是还有什么不那么明显的吗?
最佳答案
在没有mpirun
/ mpiexec
的情况下运行被称为“单个MPI_INIT
”,并且是最新实施的MPI标准文档的第10.5.2节中有关高质量实现的MPI建议的一部分:
高质量的实现将允许任何进程(包括那些未使用“并行应用程序”机制启动的进程)通过调用MPI_INIT
成为MPI进程。然后,此类进程可以使用MPI_COMM_ACCEPT
和MPI_COMM_CONNECT
例程连接到其他MPI进程,或生成其他MPI进程。 MPI不强制执行此行为,但在技术上可行的情况下强烈鼓励这样做。
如果某个进程进入MPI_INIT
并确定未采取任何特殊步骤(即未获得与其他进程形成MPI_COMM_WORLD
的信息),则该进程成功并形成单例MPI程序,即其中一个MPI_COMM_WORLD
的大小为1。
在您的情况下,使用mpirun
是标准文本中提到的“并行应用程序”机制。它为MPI_INIT
提供了在所有启动的进程中建立MPI_COMM_WORLD
所必需的信息。如果没有来自mpirun
的信息,进程只能作为单例MPI实例运行,因此所有进程都具有0
等级(可以,因为每个MPI_COMM_WORLD
是单独的)。