I implemented a peer-to-peer connection in MPI using MPI_Open_port
and MPI_Comm_accept
. I run a server and a client program using
rafael@server1:~$ mpirun server
rafael@server2:~$ mpirun client
on different computers. I noticed that
rafael@server1:~$ ./server
rafael@server2:~$ ./client
also works just fine. Do you know if there is any difference between starting an MPI executable with and without mpirun
?
Of course, I can't give additional parameters (e.g. mpirun --mca btl self,openib
), and the rank of all processes is 0, which is all totally fine. But is there anything less obvious?
Running without mpirun
/mpiexec
is called "singleton MPI_INIT
" and is part of the MPI recommendations for high quality implementations, found under §10.5.2 in the latest MPI standard document:
A high-quality implementation will allow any process (including those not started with a "parallel application" mechanism) to become an MPI process by calling MPI_INIT
. Such a process can then connect to other MPI processes using the MPI_COMM_ACCEPT
and MPI_COMM_CONNECT
routines, or spawn other MPI processes. MPI does not mandate this behavior, but strongly encourages it where technically feasible.
If a process enters MPI_INIT
and determines that no special steps were taken (i.e., it has not been given the information to form an MPI_COMM_WORLD
with other processes) it succeeds and forms a singleton MPI program, that is, one in which MPI_COMM_WORLD
has size 1.
Using mpirun
in your case is the "parallel application" mechanism, mentioned in the standard text. It provides MPI_INIT
with the information necessary to establish MPI_COMM_WORLD
over all started processes. Without the information from mpirun
processes can only run as singleton MPI instances and hence all of them have rank 0
(which is OK, since each MPI_COMM_WORLD
is a separate one).