我使用MPI_Open_port
和MPI_Comm_accept
在MPI中实现了点对点连接。我使用
rafael@server1:~$ mpirun server
rafael@server2:~$ mpirun client
在不同的计算机上。我注意到了
rafael@server1:~$ ./server
rafael@server2:~$ ./client
也很好用。你知道在有和没有mpirun
的情况下启动MPI可执行文件之间是否有任何区别?
当然,我不能给出额外的参数(例如mpirun --mca btl self,openib
),并且所有进程的等级都是0,这一切都很好。但有什么不那么明显吗?
答案 0 :(得分:19)
在没有mpirun
/ mpiexec
的情况下运行称为“单一MPI_INIT
”,是高质量实施的MPI建议的一部分,在最新的MPI标准文档中的§10.5.2中找到:
高质量的实现将允许任何进程(包括那些未通过“并行应用程序”机制启动的进程)通过调用
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
是一个独立的进程)。