在上一篇中我们介绍了 mpi4py 中的 Op 对象,下面我们将介绍 mpi4py 中的客户端-服务器编程。
MPI 允许在不拥有相同通信子对象的两个进程组之间建立通信联系。该功能可以适用于很多场合,如:
- 应用程序分两个部分,各自独立启动,但在运行时需要建立通信联系。
- 某些可视化工具需要连接到正在运行的进程上。
- 并行的 server 程序可能需要与多个并行的 client 建立连接。
MPI 提供了若干通信联系 API,这些通信联系 API 通过在两组进程之间建立组间通信子的方式来实现上述要求的功能。
在不共享通信子的两个进程组之间建立联系的操作是一种非对称的集合操作,需要强制一组进程进入监听状态来接收另一组进程的连接请求。MPI 称监听请求的一组进程为并行服务进程(parallel server),尝试连接服务组的进程称作客户端(client)。
由于没有预先存在的连接通道,因此客户端和服务器之间需要就一些关键的同步点达成一致。这就需要再有一个第三方机制来支持。MPI 为此设置了名字服务接口(可与外部域名服务兼容),通过一个可发布的端口号(port_name)供 server 端和 client 端建立连接。端口号可以是 TCP/IP 端口,也可能是系统使用任何其它协议定义的底层通信端口。MPI 通过名字发布机制还可把端口号与服务(service_name)绑定在一起,以 <port_name,service_name>格式发布。端口号、服务及其发布机制也是在灵活性和可移植性之间的一个折中。仅用端口号可保证最好的移植性,但由于需人工参与通知 client,因此使用不方便;使用名字发布机制进行端口号、服务绑定的方式在支持名字发布的版本中可取得最好的移植性;也可在应用程序里自定义端口发现机制,此种方法最灵活,但移植性最差。
服务器端
服务器端首先调用 MPI.Open_port 打开端口,然后调用 MPI.Intracomm.Accept 等待客户端连接。
MPI.Open_port(Info info=INFO_NULL)
打开一个端口,返回打开的端口名字。端口名字也可结合 info
参数传递给 MPI 环境,字符串大小可由 MPI.MAX_PORT_NAME 指定。如果传人的 info 对象不作关于打开端口的任何指示,则可设置其值为 MPI.INFO_NULL,表示使用默认的开端口机