没有父子关系的进程间建立组间通信域进行通信
除了派生新的进程之外,MPI还允许没有父子关系的独立的进程之间进行通信。它们之间的通信采用客户/服务的方式,对于这两组对立的进程,分别叫做服务端进程组和客户端进程组。
MPI_OPEN_PORT(info, port_name) INinfo传递给运行时的信息
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)
INport_name前面打开的端口名 INinfo 传递给运行时的信息 INroot 服务端进程组的根进程标识号
INcomm 服务端进程通信域 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) INport_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)
INport_name将连接的端口号 INinfo 传递给运行时的信息 INroot 执行连接操作的根进程标识号
INcomm 客户端进程的组内通信域 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)
INOUTcomm通信域 int MPI_Comm_disconnect(MPI_Comm * comm) MPI_COMM_DISCONNECT(COMM,
IERROR) INTEGER COMM, IERROR 将建立在通信域comm上的通信连接断开。
|