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
r
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 theMPI_COMM_ACCEPTandMPI_COMM_CONNECTroutines, or spawn other MPI processes. MPI does not mandate this behavior, but strongly encourages it where technically feasible.If a process enters
MPI_INITand determines that no special steps were taken (i.e., it has not been given the information to form anMPI_COMM_WORLDwith other processes) it succeeds and forms a singleton MPI program, that is, one in whichMPI_COMM_WORLDhas 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).