没有父子关系的进程间建立组间通信域进行通信
除了派生新的进程之外,MPI还允许没有父子关系的独立的进程之间进行通信。它们之间的通信采用客户/服务的方式,对于这两组对立的进程,分别叫做服务端进程组和客户端进程组。
MPI_OPEN_PORT(info, port_name)
INinfo传递给运行时的信息
OUT port_name 返回的端口名
int MPI_Open_prot(MPI_Info info, char * port_name)
MPI_OPEN_PORT(INFO, PORT_NAME, IERROR)
CHARACTER *(*) PORT_NAME
INTEGER INFOR, IERROR

对于服务端的进程执行这一调用,目的是打开一个端口。
接着,服务端进程在打开的端口上等待客户端进程的连接,
MPI_COMM_ACCEPT(port_name, info, root, comm, newcomm)
INport_name前面打开的端口名
INinfo 传递给运行时的信息
INroot 服务端进程组的根进程标识号
INcomm 服务端进程通信域
OUT newcomm返回的包括客户端进程和服务端进程的组间通信域
int MPI_Comm_accept(char * port_name, MPI_Info info, int root, MPI_Comm
comm, MPI_Comm * newcomm, )
MPI_COMM_ACCEPT(PORT_NAME, INFO, ROOT, COMM, NEWCOMM,
IERROR)
CHARACTER *(*) PORT_NAME
INTEGER INFO, ROOT, COMM,NEWCOMM,IERROR

这一调用的入口参数port_name和info对根结点有用,返回的组间通信域newcomm包括服务端进程和客户端进程。通过该组间通信域,服务端进程就可以和客户端进程通信。
MPI_CLOSE_PORT(port_name)
INport_name端口号
int MPI_Close_port(char * port_name)
MPI_CLOSE_PORT(PORT_NAME, IERROR)
CHARACTER *(*) PORT_NAME
INTEGER IERROR

当通信结束后,服务端进程要关闭打开的端口。MPI_CLOSE_PORT将以前打开的端口port_name关闭。

将以上三个调用依次顺序连接起来,表示操作的先后次序

服务端进程组

  在客户端,要执行如下操作,首先是建立和服务端的连接。
MPI_COMM_CONNECT(port_name, info, root, comm, newcomm)
INport_name将连接的端口号
INinfo 传递给运行时的信息
INroot 执行连接操作的根进程标识号
INcomm 客户端进程的组内通信域
OUT newcomm返回的包括客户端和服务端进程的组间通信域
int MPI_Comm_connect(char * port_name, MPI_Info info, int root, MPI_Comm
comm, MPI_Comm * newcomm)
MPI_COMM_CONNECT(PORT_NAME, INFO, ROOT, COMM, NEWCOMM,
IERROR)
CHARACTER *(*) PORT_NAME
INTEGER INFO, ROOT, COMM, NEWCOMM, IERROR

  通过MPI_COMM_CONNECT调用,客户端的进程就可以和打开端口为port_name的服务端进程建立连接。显然端口名port_name和传递给运行时的信息info只对根进程root有意义,通过返回的组间通信域newcomm,客户端进程就可以和服务端进程进行通信。
对于客户端和服务端,当通信结束后,都需要通过调用MPI_COMM_DISCONNECT断开连接。
MPI_COMM_DISCONNECT(comm)
INOUTcomm通信域
int MPI_Comm_disconnect(MPI_Comm * comm)
MPI_COMM_DISCONNECT(COMM, IERROR)
INTEGER COMM, IERROR

  将建立在通信域comm上的通信连接断开。