MPI 标签集

Set of MPI tags

是否可以为 MPI_Recv 函数指定一组标签?

我的场景:

我正在使用具有多个同时执行 MPI_Recv 函数的线程的应用程序。我打算使用 mpi 标记来控制哪个线程将接收消息。但我还需要控制消息是 data_message 还是 stop_message.

那么,是否可以为MPI_Recv定义一组标签? 从语义上讲,应该是 "Receive messages with tags 0 or 1" 或 "Receive messages with tags 10 or 11" 等。它必须是多个值。

使用此方法可以将标签 thread_id*2 用作 data_messagethread_id*2+1 作为 stop_message.

没有直接的函数来匹配一组特定的标签(因为 MPI_TAG_ANY 由于非特异性而在这里不合适),但是有一种方法可以实现相同的目标。 Post 每个线程中有两个 MPI_Irecv 请求,每个请求对应您要匹配的每个标签。然后使用 MPI_waitanyMPI_Testany 看看会出现什么。

我宁愿使用空消息 (MPI_Send(count = 0)) 来表示您的情况的停止条件。只需等待带有 MPI_Probe(tag = thread_id) 的匹配消息,然后在返回的状态对象上使用 MPI_Get_count 来确定消息大小。如果恰好为零,则中断处理循环。

另一种选择是让每个线程在单独的通信器中进行通信。使用 MPI_Comm_dup 创建 MPI_COMM_WORLD 的副本数组,然后让线程 icomms[i] 中进行通信。然后,您可以利用 MPI_Recv(tag = MPI_ANY_TAG, comm = comms[i]) 将消息与任何标记匹配,这将是线程特定的。在发件人端,使用 MPI_Send(rank = dest, comm = comms[i]) 来处理线程 i of rank dest.