标签匹配逻辑

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

  • 通信器

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

  • 源排名 - 接收方可以指定通配符

  • 目标排名 - wild

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

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

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

1. 急切协议 - 当发送方处理发送时,会发送完整的消息。在 send_cq 中收到完成发送,通知可以重用缓冲区。

2. 会合协议 - 发送方发送标签匹配标头,并且可能在第一次通知接收方时发送一部分数据。当发布相应的缓冲区时,响应者将使用标头中的信息直接对匹配的缓冲区启动 RDMA READ 操作。需要接收到 fin 消息才能重用缓冲区。

标签匹配实现

使用两种类型的匹配对象,即已发布的接收列表和意外消息列表。应用程序通过调用已发布接收列表中的 MPI 接收例程来发布接收缓冲区,并使用 MPI 发送例程来发布发送消息。已发布接收列表的头部可以由硬件维护,软件需要对该列表进行镜像。

当启动发送并到达接收端时,如果没有为此到达的消息预先发布的接收,则将其传递给软件并放置在意外消息列表中。否则,将处理匹配,包括会合处理(如果适用),并将数据传递到指定的接收缓冲区。这允许接收端的 MPI 标签匹配与计算重叠。

当发布接收消息时,通信库将首先检查软件意外消息列表是否存在匹配的接收。如果找到匹配项,则使用软件控制的协议将数据传递到用户缓冲区。UCX 实现使用急切协议或会合协议,具体取决于数据大小。如果未找到匹配项,则整个预发布的接收列表由硬件维护,并且有空间向该列表添加另一个预发布的接收,则此接收将传递给硬件。软件需要对该列表进行镜像,以帮助处理 MPI 取消操作。此外,由于硬件和软件在标签匹配操作方面预计不会紧密同步,因此使用此镜像列表来检测将预发布的接收传递给硬件的情况,因为匹配的意外消息正从硬件传递到软件。