是否可以为MPI_Recv函数指定一组标签?
我的情景:
我正在使用一个具有多个线程同时执行MPI_Recv函数的应用程序。我打算使用mpi标签来控制哪个线程将接收消息。但我还需要控制消息是 data_message 还是 stop_message 。
那么,是否可以为MPI_Recv定义一组标签? 在语义上,将类似于“接收带有标签0或1的消息”或“接收带有标签10或11的消息”等。它必须是多个值。
使用此方法可以将 thread_id * 2 标记用作 data_message 和 thread_id * 2 + 1 作为 stop_message
答案 0 :(得分:1)
没有直接的功能来匹配一组特定的标签(因为MPI_TAG_ANY
由于非特异性而在这里不合适),但是有一种方法可以实现相同的目标。在每个帖子中发布两个MPI_Irecv
个请求,每个请求对应一个标记。然后使用MPI_waitany
或MPI_Testany
查看内容。
答案 1 :(得分:1)
我宁愿使用空消息(MPI_Send(count = 0)
)来表示您案件中的停止条件。只需等待与MPI_Probe(tag = thread_id)
匹配的消息,然后在返回的状态对象上使用MPI_Get_count
来确定消息大小。如果它恰好为零,则打破处理循环。
另一个选择是让每个线程在一个单独的通信器中进行通信。使用MPI_Comm_dup
创建MPI_COMM_WORLD
的重复数组,然后让线程 i 在comms[i]
中进行通信。然后,您可以使用MPI_Recv(tag = MPI_ANY_TAG, comm = comms[i])
将消息与任何标记匹配,这将是特定于线程的。在发件人方面,使用MPI_Send(rank = dest, comm = comms[i])
来解决排名 dest 的 i 帖子。