标签匹配逻辑

MPI 标准定义了一组规则,称为标签匹配,用于将源发送操作与目标接收操作进行匹配。以下参数必须与以下源和目标参数匹配:

  • 通信域

  • 用户标签 - 接收方可以指定通配符

  • 源等级 – 接收方可以指定通配符

  • 目标等级 – 通配符

排序规则要求,当多对发送和接收消息信封可能匹配时,必须使用包含最早提交的发送和最早提交的接收的那一对来满足匹配操作。然而,这并不意味着标签按照它们创建的顺序被消耗,例如,如果早期标签不能用于满足匹配规则,则可能消耗后来生成的标签。

当消息从发送方发送到接收方时,通信库可能会尝试在相应的匹配接收被提交之后或之前处理该操作。如果匹配接收被提交,则这是一个预期消息;否则,它被称为非预期消息。实现通常对这两种不同的匹配实例使用不同的匹配方案。

为了减少 MPI 库的内存占用,MPI 实现通常为此目的使用两种不同的协议:

1. 急切协议(Eager protocol)- 当发送方处理发送操作时,完整消息被发送。在 send_cq 中收到完成发送通知,表示缓冲区可以重复使用。

2. 握手协议(Rendezvous Protocol)- 发送方发送标签匹配头部,并在首次通知接收方时可能发送部分数据。当相应的缓冲区被提交时,响应方将使用头部信息直接向匹配缓冲区发起 RDMA 读取操作。需要收到一个 fin 消息才能重复使用缓冲区。

标签匹配实现

使用了两种类型的匹配对象:提交的接收列表和非预期消息列表。应用程序通过调用 MPI 接收例程将接收缓冲区提交到提交的接收列表中,并使用 MPI 发送例程提交发送消息。提交的接收列表的头部可以由硬件维护,软件应镜像此列表。

当发送启动并到达接收端时,如果此到达消息没有预先提交的接收,则将其传递给软件并放入非预期消息列表。否则,将处理匹配,包括握手处理(如果适用),将数据传递到指定的接收缓冲区。这允许接收端的 MPI 标签匹配与计算重叠进行。

当提交接收消息时,通信库将首先检查软件非预期消息列表以查找匹配的接收。如果找到匹配项,则使用软件控制的协议将数据传递到用户缓冲区。UCX 实现根据数据大小使用急切或握手协议。如果未找到匹配项,并且整个预提交接收列表由硬件维护,并且有空间向此列表添加一个预提交接收,则此接收将传递给硬件。软件应镜像此列表,以帮助处理 MPI 取消操作。此外,由于硬件和软件在标签匹配操作方面预计不会紧密同步,因此此影子列表用于检测预提交接收被传递给硬件的情况,因为匹配的非预期消息正在从硬件传递给软件。